modxSite 1.1.1-beta

Сегодня официально вышел пакет modxSite. Официально, потому что хотя этот пакет и раньше существовал, сегодня я его доработал и выложил в официальный репозиторий. Главные изменения: 1. Список устанавливаемых автоматически пакетов сократился: phpTemplates, modxSmarty, Console, Ace. Это те пакеты, без которых у нас сейчас ни один сайт не обходится. 2. Перенесены и немного переработаны getdata-процессоры из пакета shopModx. Основная причина — эти процессоры довольно универсальны, и так же используются у нас во всех проектах, при чем не только магазинах, и не только на конечных сайтах (эти процессоры используют и другие модули, например modSociety). Поэтому было решено перенести их в modxSite и несколько переработать для большей универсальности. А вот в shopModx-е эти процессоры будут урезаны, и они будут использовать процессоры из modxSite. 3. Плагины Debug и memory_get_usage включены в modxSite. 4. В момент установки modxSite создает еще несколько медиа-сурсов (Controllers, Smarty templates, Public templates и другие), а так же перенастраивает modxSmarty путь к шаблонам, меняя на core/components/modxsite/templates/. 5. В контроллерах уже лежит base.php, которого хватает на 98% случаев в случае использования phpTemplates+modxSmarty в плане связки «MODX-шаблон»-«Smarty-шаблон».

На будущее — modxSite будет самым основным пакетом, вокруг которого уже будут обрастать другие масштабные компоненты. modxSite в том виде, в каком он сейчас выпускается, есть результат упорной многомесячной работы. За несколько последних месяцев мы создали новых и переделали старых (переведя на новые рельсы) десятки проектов. Та методология, которую мы сейчас используем, позволяет делать быстрые, легко управляемые и развиваемые сайты на MODX. При этом сам MODX в чистом виде этого не дает. Для этого необходимо MODX настраивать, докручивать. Вот по сути modxSite и есть тот самый «докручивающий» пакет. Условно говоря, сразу после установки его, у вас уже есть phpTemplates+modxSmarty, необходимые медиаСурсы для быстрого доступа к файлам, системные настройки и т.п. После установки пакета modxSite, устанавливаем modxSDK и приступаем непосредственно к программированию сайта. UPD: Снял вот демонстрашку.

Отличное дополнение к ролику Разработка ModX + Phptemplates + Smarty, тут уже более разжованей, Николай, как вы набиваете в $params условие выборки по значению Tv параметров, я тут кручусь вокруг вот-этого: {$params = [ "sort" => 'publishedon', "summary" => 1, "limit" => 3, "dir" => "DESC", "where" => [ "parent:!=" => 2, "tvs" => [ "Category:!=" => 1 ] ] ]} такое выдает ошибку Unknown column 'modResource.tvs' in 'where clause'

Ну в ошибке собственно и ответ. where используется для формирования запроса и у объекта modResource просто нет свойства tvs.

Вот мне и нужно сформировать запрос так чтобы в результате получить обьекты в которых значение телевизора Category равны нулю или 1, в общем использовать определенные TV поля в условиях выборки.

После установки этого пакета исчезает админка, в частности управление пакетами и настройки. Меню вверху остается, слева тоже присутствует. Но в основном поле ничего нет, пустое место. Скриншот прилагаю ниже. MODX Revolution 2.2.11-pl ?

  1. Стоял ли у вас раньше уже modSociety? Скорее всего да, так как в прошлой версии устанавливался и использовался расширенный класс пользователей SocietyUser (что не есть круто по ряду причин), а эта версия пакета серьезно переделана, включая удаление этого класса из него. Простое решение — зайти в базу данных и в таблице modx_users заменить class_key у всех пользователей с SocietyUser на modSociety; update modx_users set class_key = 'modUser'; 2. Если проблема не в этом, пришлите в личку доступы в админку и FTP, я посмотрю в чем именно проблема.

Отличное дополнение к ролику Разработка ModX + Phptemplates + Smarty, тут уже более разжованей, Именно для этого и был доработан modxSite. Он собирает все основные принципы в кучу и стандартизирует разработку с использованием этих технологий. Все остальное — это уже обрастает вокруг него. такое выдает ошибку Unknown column 'modResource.tvs' in 'where clause' Параметры чисто синтаксически вы набиваете правильно, а вот ошибка абсолютно уместная. Уделите больше внимания изучению вызываемых процессоров, структуре базы данных и формируемым SQL-запросам. Колонки tvs в используемых таблицах нет в принципе. tvs — это отдельный элемент массива данных полученного документа, формируемый уже на уровне php. А правильно условие по TV-параметру формировать в самом процессоре. Вот пример. Вот здесь этот вопрос очень подробно рассматривался: modxclub.ru/blog/voprosy-spetsyalistov/256.html

Тоесть чтобы выбрать документы с определенными значениями tv, нужно эти или все tv параметры набить в код процессора или же расширить и там определить все tv, задать им значения по дефолту, и из шаблона вызывать переопределив нужное с помощью массива параметров для вызываемого процессора. разве нельзя набить уже сразу код в процессор чтобы находил tv параметры и их значения и присваивал им настройки по умолчанию, хотя процессор это уже делает, тогда зачем же нам вложеный в массив обьекта ресурса массив «tvs» с тв параметрами обьекта?

Здесь вам в помощь будет умение составлять SQL-запросы. По умолчанию у нас просто джоинится таблица значений TV-параметров, и на одну запись документа мы получаем столько записей итоговых, сколько на нее есть записей в таблице значений твшек. А если мы сразу добавим фильтр по какому-то TV-полю, то мы в итоге только и получим записи с этим TV-полем. Все остальные записи будут отброшены, и в массиве tvs у вас не будет значений остальных TV-параметров. В общем, в дальнейшем я скорее всего допилю более автоматизированный механизм фильтрации по ТВшкам, но вам все равно лучше понимать основы, так как без этого никуда.

А если мы сразу добавим фильтр по какому-то TV-полю, то мы в итоге только и получим записи с этим TV-полем. Все остальные записи будут отброшены, и в массиве tvs у вас не будет значений остальных TV-параметров. как альтернатива этому условие на уровне шаблона в счетчике: {foreach $result.object as $object} {if $object.tvs.Category.value == 1} <div class="col-xs-6 col-sm-4 col-md-3 col-lg-2"> <div class="thumbnail"> <img class="media-object" data-src="{$template_url}holder.js/200x150"> </div> </div> {/if} {/foreach} вам все равно лучше понимать основы, так как без этого никуда. тут грех не согласиться)

Да, вы можете так делать, это обычная проверка, и она годится не только для этого. Но это не годится в случае с постраничностью. Вот вам из тысяч документов надо выбрать 10 документов со сдвигом 50, и с фильтром по тв-ке. вы предлагаете получить все эти документы и на уровне пхп фильтровать? В таком случае дело не только в скорости работы, но порой и в невозможности выполнения.

Доброго времени суток. У меня вот такая ошибка выскакивает после установки :-(. Подскажите что может быть не так. Fatal error: Call to a member function fetch() on a non-object in /public_html/core/components/modxsite/controllers/base.php on line 15 Все компоненты установились нормально. Когда в Template вписываю base.php, ну соответственно думаю результат понятен, непонятна причина. Спасибо. P.S. ставил на чистую ModX 2.2.11

Здравствуйте! Определенно, что у вас в данном случае нет объекта $modx->smarty. Попробуйте переустановить пакет modxSmarty и убедитесь, что плагин modxSmarty активирован. Если не получится, пришлите в личку доступы в админку, я посмотрю в чем именно дело.

Сейчас попробую…

Большое спасибо за ответ. Сам разобрался. Переустановка modxSmarty ничего не дала. Я просто переустановил modx полностью и все заработало.

Странное дело. Видимо был сбой в самом MODX-е, так как класс Smarty тянется из MODX-а, а не устанавливается отдельно, и здесь самое вероятное — просто слетели системные события и на OnHandlerRequest не вызывался плагин инициализации Smarty.

Может быть. У меня при установке вообще были проблемы в первый раз, как-то оно странно себя вело. Папки не создало некоторые, по моему там я права не выставил изначально нужные и видимо что-то недоустановилось. Сейчас перед установкой сразу прописал нужные права и пользователя, все прошло гладко. Отличный пакет. Спасибо огромное!!! Я сам работать с modx начал недавно, всего пару простых сайтов на нем сделал и очень мне не хватало нормальной шаблонизации. Со Smarty знаком очень давно и активно использовал, уже несколько лет, естественно встреча с чанками и принципом шаблонизации в ModX из коробки меня немного смутили )

Понимаю. На здоровье! :)

Николай, добрый вечер! А сортировка по двум полям не реализована в процессорах? Правильно понимаю? ))

Вот короче как мог: GitHub :) может пригодится… Можно использовать так: — 1) $params = [ 'sort' => 'parent', 'dir' => 'ASC' ] — 2) $params = [ 'sort' => ['parent', 'menuindex'], 'dir' => 'ASC' ] — 3) $params = [ 'sort' => ['parent' => 'ASC', 'menuindex' => 'DESC'] ] — 4)2) $params = [ 'sort' => ['parent' => 'DESC', 'menuindex'], 'dir' => 'ASC' ]

Все гораздо проще: ..... array( "sort" => "field1 DESC, field2", "dir" => "ASC", ),... // result ->sortby("field1 DESC, field2 ASC");

А я подумал что так не прокатит… вот судя по этому: https://github.com/modxcms/revolution/blob/master/core/xpdo/om/xpdoquery.class.php#L401 и этому: https://github.com/MODX-Club/modxSite/blob/master/core/components/modxsite/processors/site/web/getlist.class.php#L114 Твой вариант будет работать?

Если я его написал, то наверно он работает? ;)

:) и точно… нодо учить xPDO :) крутяк!!! )

Этого там не прописано :) Это надо знать MySQL и экспериментировать.

Ну вот же идет конкатенация твоего «field1 DESC, field2» и «ASC» через пробел: $sql.= $sortby['column']; if ($sortby['direction']) $sql.= ' ' . $sortby['direction']; в итоге: «field1 DESC, field2 ASC» а дальше (если есть элементы еще) через запятую тоже самое: while ($sortby= next($this->query['sortby'])) { $sql.= ', '; $sql.= $sortby['column']; if ($sortby['direction']) $sql.= ' ' . $sortby['direction']; } MySQL я знаю, просто не глянул как в хпдо запрос рендерится…

Так а как у тебя еще без конкатенации запрос вид КолонкаПробелНаправление сформируется? Конечно это строки будут склеиваться. Потому и можно туда запихнуть что хочешь. А про то, что этого там не прописано — это я говорил про документацию по xPDO (если таковая вообще имеется))). Там вряд ли такое напишут в примерах.

Тут ты прав) но перед склейкой можно почистить строки от запятых например и обернуть название колонки в `` например…

Да? А как тогда запросы типа таких выполнять? $q->sortby('concat(1,2,3)', 'DESC'); То есть проверка на зпт будет жутко ограничивать.

Я и говорю надо учить xpdo. Я до MODX писал на Kohana, тамошний QueryBuilder все оборачивает в ``, а для выражений по типу выше указанного надо использовать вот такое: DB::expr('CONCAT(1,2,3)') //т.е. на кохане получилось бы так: $query->order_by(DB::expr('CONCAT(1,2,3)'), 'DESC'); :)

Ох… Давно я с коханой не работал))) Этот паттерн HMVC…