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: Снял вот демонстрашку.

Comments

Отличное дополнение к ролику Разработка 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';
  1. Если проблема не в этом, пришлите в личку доступы в админку и 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'
 ]
$params = [
 'sort' => ['parent', 'menuindex'],
 'dir' => 'ASC'
 ]
$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");

Ну вот же идет конкатенация твоего «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');

:)