Содержание
Перенос MODx Evolution | Red-book-CMS.ru
Итак, здесь я опишу краткую последовательность действий по переносу MODx Evolution (CMS / CMF) на хостинг или… в общем не имеет значения куда.
- Выгрузите / проделайте экспорт базы данных движка через админку или приложение phpMyAdmin. Последний предпочтительней, т.к. позволяет архивировать, минимизируя размер получаемого дампа.
- Заархирируйте корневой каталог сайта, т.е. собственно папку с движком.
- Залейте / проделайте импорт дампа БД, созданной на первом шаге на новом месте, т.е. хостинге. Через phpMyAdmin или его аналог.
- Закачайте через файловый менеджер хостинга или FTP-клиент архив с файлами сайта в каталог, отведенный под новый домен.
- Распакуйте архив.
- Откройте файл config.inc.php. Он расположен в manager/includes, считая от корневого каталога MODx Evolution.
- Пришла пора подредактировать конфигурационный файл, вписав новые параметры подключения к СУБД, — эту информацию смотрите в панели управления хостингом:
$database_type = 'mysql'; // - СУБД. $database_server = 'localhost'; // - сервер СУБД. $database_user = 'root'; // - имя пользователя БД. $database_password = 'root'; // - пароль пользователя БД. $database_connection_charset = 'utf8'; // - кодировка соединения. $database_connection_method = 'SET CHARACTER SET'; // - метод соединения. $dbase = '`moya_baza_dannih`'; // - имя БД. $table_prefix = 'wp_'; // - префикс таблиц.
В большинстве случаев корректировать вам потребуется только переменные $database_user, $database_password и $dbase. Реже $database_server.
- Если вы вручную редактировали .htaccess в корне сайта, тогда проверьте, что прописано строчками вида:
RewriteEngine On RewriteBase /
- Если вы все сделали правильно, тогда MODx даст вам войти в Менеджер. Переходим на вкладку Инструменты→Конфигурация→Файловый менеджер. Здесь нажимаем на кнопку «Сброс» напротив пути для файл-менеджера.
- Переходим на вкладку Инструменты→Конфигурация→Интерфейс и представление. Прокручивая колесо мышки, ищем параметр «Путь к файлам». Опять нажимаем на кнопку «Сброс».
На этом я плавно заканчиваю своё повествование.
Опубликовано 27-02-2013 в 14:36
проект в категории Веб-программирование, 29.11.2010 в 19:19
Бесплатно зарегистрируйся и получай уведомления о новых проектах по работе
Y | Заказчик Отзывы фрилансеров: Зарегистрирован на сайте 14 лет | Бюджет: по договоренности |
Необходима консультация по цмс modx, а именно управление блоком спецпредложений на главной странице altego-it.ru.
Странным образом подятигиваются не все блоки, указанные в админе + ошибка Warning: fopen(../assets/cache/siteCache.idx.php) [function.fopen]: failed to open stream: Permission denied in /home/maxsite/data/www/altego-it.ru/manager/processors/cache_sync.class.processor.php on line 215
Cannot open file (../assets/cache/siteCache.idx.php)
Разделы:
Опубликован:
29.11.2010 | 19:19
Теги: нужен программист, резюме программиста, требуется программист, резюме веб программиста
getRelated: Похожие материалы в MODX Revolution
Для MODX Revolution некоторое время назад тихо и спокойно появилось замечательное дополнение getRelated, которое без особых усилий на то с вашей стороны позволяет организовать список похожих материалов на вашу публикацию.
Для чего нужно показывать похожие материалы на сайте?
- это еще один инструмент навигации для пользователей, наряду с тегами, категориями и т.д.;
- это неплохой способ удержать посетителя на сайте, предложив ему почитать статьи по теме;
- это отличная перелинковка вашего блога, что положительно влияет на скорость индексации поисковиками.
Попробуем установить и разобраться как это работает?
Установка и настройка getRelated
1. Прежде всего несколько ссылок:
Перед установкой пакета предполагаем что у вас уже имеется сайт с достаточным количеством страниц, для того что бы можно было сформировать список похожих.
2. После установке в том месте шаблона, где необходимо показать список похожих, вызываем сниппет:
[[getRelated]]
Обратите внимание, что сниппет вызывается КЕШИРОВАННЫМ. Делать некешированный вызов строго не рекомендуется, так как процедура генерации списка похожих материалов достаточно ресурсоемкая и может сильно замедлить скорость генерации страниц.
3. Это простейший вызов сниппета и он будет работать, но чаще все же лучше его настроить, передав ряд параметров, например так:
[[getRelated? &fields=`pagetitle:2,introtext:1,tags:4` &returnFields=`pagetitle,introtext` &returnTVs=`image` &parents=`4,6` &limit=`5` &noResults=`Нет похожих материалов` &tplOuter=`relatedOuter` &tplRow=`relatedRow` ]]
Разберем, за что отвечают параметры:
- fields — список полей, которые будут учитываться при формировании списка похожих материалов, через двоеточие указывается «вес» поля, чем он больше, тем большее влияние оказывает поле. Естетсвенно, что чем больше полей вы сюда напишите, тем более ресурсоемкими будут вычисления, так что идеально ограничится заголовком страницы и, к примеру тегами. И НЕ ИСПОЛЬЗУЙТЕ поле content! Как правило, в этом поле большой по объему текст и это может привести к очень догой загрузке!
- returnFields — список возвращаемых полей. Укажите именно те поля, которые вам нужны, это так же позволит снизить нагрузку.
- returnTVs — по аналогии с returnFields, только для TV параметров.
- parents — список id документов-родителей. Позволяет ограничить поиск определенными разделами вашего сайта.
- limit — количество похожих статей.
- noResult — сниппет выведет это значение, если не сможет подобрать похожие материалы.
- tplOuter — чанк-обертка, в который будет помещен результат, рассмотрим ниже.
- tplRow — чанк для каждой строки в результате, рассмотрим ниже.
Это не все доступные параметры, полный список параметров getResources доступен на странице с официальной документацией, ссылка приведена выше.
Основная трудность возникает в выборе полей ресурсов, по которым производится поиск похожих, и настройка их весов. При неправильной настроке часто возникают ситуации, когда похожие материалы не находятся, или определяются неверно. Подобная же ситуация наблюдается когда общее количество материалов на сайте явно недостаточное (например в блоге всего 10 статей).
4. Настройка отображения
В примере выше мы указали параметры tplOuter и tplRow. Однако это можно было и не делать, getRelated в этом случае использовал бы значения по умолчанию. Посмотрим исходный код этих чанков.
Чанк «relatedOuter»:
<h4>[[%getrelated.pagesfound? &namespace=`getrelated` &count=`[[+count]]`]]</h4> <ul> [[+wrapper]] </ul>
Допустимо использовать 2 плейсхолдера: wrapper (список материалов) и count (количество найденых материалов).
Чанк «relatedRow»:
<li> <a href="[[~[[+id]]]]" title="[[+longtitle:default=`[[+pagetitle]]`]]"> [[+longtitle:default=`[[+pagetitle]]`]] ([[+rank]]) </a> </li>
Здесь список плейсхолдеров несколько больше: поля ресурса, перечисленные в fields и returnFields, а так же id — идентификатор документа, rank — рейтинг «похожести» ресурса, idx — порядковый номер.
Таким образом вы можете создать собственные чанки с любым html кодом на основе представленных и передать их названия в вызов getRelated, чтобы полностью переопределить внешний вид вашего списка похожих материалов.
Поддержка языков в getRelated
В своих первых версиях getRelated поддерживал только английский язык. Причиной тому — несколько регулярных выражений, используемых в алгоритме, в которых явно были прописаны только английские символы.
Когда мы только начинали работать с getRelated мы обратили на это внимание автора дополнения (Mark Hamstra), и предложили ему вариант исправлнений, для обеспечения поддержки русского языка. Эти исправления Mark Hamstra внес в исходный код, так что на текущий момент getRelated поддерживает английский и русский язык.
Обратите на это внимание, если вы сталкиваетесь с разработкой сайта, тексты которого содержат символы, отличные от применяемых в этих языках. Возможно вам будет необходимо внести аналогичные исправления в исходный код.
msFavorites / MODX Revolution
msFavorites
msFavorites — компонент реализует функционал создания списков избранного.
— работа с любыми объектами
— работа с любыми пользователями
Список избранного работает для все пользователей. Для авторизованных пользователей идентификатором
служит id пользователя, для неавторизованный id сессии. Избранному анонимных пользователей присваивается флаг anon
Подключение msFavorites
Вы можете использовать msFavorites где угодно на странице. Для этого нужно подключить сниппет msFavorites.initialize в любом удобном месте,
добавить служебную разметку необходимым элементам. Все!
Постановка:
— возможность добавить / удалить ресурс в список избранного default
— вывести счетчик кол-ва пользователей добавивших в избранное текущий ресурс
— вывести счетчик кол-ва ресурсов в избранном
Вызов
Результат
добавить
удалить
звезда: 0
всего: 0
Пример вывода ресурсов
Постановка:
— требуется вывести список ресурсов
— возможность добавить ресурс в список избранного default
— вывести общий счетчик кол-ва в избранном
Вызов
Результат
В избранное
0
0
5 — товар 1
0
6 — товар 2
0
11 — товар 3
0
12 — товар 4
0
13 — товар 5
0
14 — товар 6
0
15 — товар 7
0
16 — товар 8
0
17 — товар 9
0
18 — товар 10
Пример вывода ресурсов в избранном
Постановка:
— требуется вывести ресурсы из списка избранного
— возможность удалить ресурс из списка избранного default
— вывести общий счетчик кол-ва в избранном
Вы можете использовать сниппет msFavorites.ids для получения списка ресурсов в избранном.
Вызов
Результат
Ваш список избранного пока пуст
Обновление
Внимание
— С версии 3.x введена работа с любыми объектами, можно составлять различные списки избранного без ограничений.
Фильтры-модификаторы PHx в Modx revo
Фильтры PHx (Placeholders Xtended) добавляют новые возможности для отображения плейсхолдеров, тегов MODx (включая TV параметры) и теги настроек сайта. Фильтры модификаторы phx позволяют манипулировать значением тегов, непосредственно внутри шаблона.
Все довольно просто, модификаторы phx значительно облегчают жизнь разработчику сайта. Например есть сайт и необходимо только на главной странице показывать слайдер, ну или любой другой банер. В шаблоне сайта достаточно прописать
[[*id:is=`1`:then=`[[$slider]]`]]
где 1 — это id главной страницы, а $slider — чанк с html кодом слайдера… и т.д. и т.п. Только чайники создают новый шаблон и копируют туда весь html-код страницы, ради пары строчек слайдера/банера. Но не печальтесь, все мы такими были, поэтому просвещайтесь и пользуйтесь в будущем фильтрами модификаторами phx.
[[*id:is=`1`:then=`[[$slider]]`]]
Дано:
[[*id]]
— выводит id текущей страницы;
:is=`1`:then= - проверяет равно ли *id == 1
? и если ДА, то выводит содержимое then;
[[$slider]]
— выводит чанк в котором находится верстка и вывод слайдера.
Вместо
[[*id]]
, использовано может быть любое другое поле, например
[[*template]]
— выведет текущий используемый шаблон. Или можно проверять не пусто ли TV-поле
[[*slider]]
или как там его?
Примеры использования PHx фильтра в MODx
Пример 1:
Хорошим тоном считается когда клик по логотипу компании отправляет на главную страницу сайта. Но ссылка должна быть неактивна, если пользователь находится как раз на главной.
Т.к. в MODX чаще всего вы используете шаблоны страниц, в данном случае вам бы потребовалось создать два шаблона.
Один для главной без ссылки:
<img src="logo.svg">
Второй для внутренних страниц со ссылкой:
<a href="[[~1]]"><img src="logo.svg"></a>
Это неудобно. С помощью PHx модификатора is (равенство) вы можете сделать так:
[[*id:is=`1`:then=`<img src="logo.svg">`:else=`<a href="[[~1]]"><img src="logo.svg"></a>`]]
Если id страницы равен 1, вернуть логотип без ссылки, а если id не равен 1, вернуть логотип со ссылкой. Тем самым вы избавляетесь от создания двух практически идентичных шаблонов и обходитесь одним, но с модификатором вывода.
Пример 2:
Нам требуется вывести разные названия страницы в зависимости от шаблона.
[[*template:is=`1`:or:is=`2`:then=`[[*pagetitle]]`:else=`[[*longtitle]]`]]
Если шаблон страницы равен 1 или равен 2, вернуть
[[*pagetitle]]
,
иначе вернуть
[[*longtitle]]
Как видите, можно использовать несколько модификаторов в одной цепочке. Хотя, правильнее было бы написать так:
[[[[*template:is=`1`:or:is=`2`:then=`*pagetitle`:else=`*longtitle`]]]]
В следующих таблицах перечислены некоторые модификаторы PHx, которые могут быть использованы для любого тега MODx Revolution.
Модификаторы условия
Модификатор | Описание | Пример |
---|---|---|
if,input | if — задает дополнительное условие input — добавляет в тег обратываемые данные | [[+phx:input=`/assets/img/photo.gif`]] — добавляем в тег phx входное значение, следующим модификатором, например, можно обработать изображение. [[+phx:input=`/assets/img/photo.gif`:contains=`photo.gif`:then=`da`:else=`net`]] проверить есть ли в пути определенная последовательность символов. [[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`da`:else=`net`]] — если id-ресурса = 1 и не равно 2, выводим «da», или же «net» |
or,and | or — условие «ИЛИ» and — условие «И» | [[*id:is=`1`:or:if=`[[*id]]`:is=`2`:then=`da`:else=`net`]] — если id-ресурса = 1 или = 2, выводим «da», или же «net». [[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`da`:else=`net`]] — если id-ресурса = 1 и не равно 2, выводим «da», или же «net» |
isequalto, isequal, equalto, equals, is, eq | Если тег равен модификатору, используется с «then» и «else.» | [[*id:is=`1`:then=`da`:else=`net`]] — если id-ресурса = 1, выводим «da», или же «net» |
notequalto, notequals, isnt, isnot, neq, ne | Если тег не равен модификатору, используется с «then» и «else». | [[*id:ne=`1`:then=`da`:else=`net`]] — если id-ресурса не равно 1, выводим «da», или же «net» |
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte | Если тег больше или равен модификатору, используется с «then» и «else». | [[*id:ge=`1`:then=`da`:else=`net`]] — если id-ресурса больше или равен 1, выводим «da», или же «net» |
isgreaterthan, greaterthan, isgt, gt | Если тег больше модификатора, используется с «then» и «else». | [[*id:gt=`1`:then=`da`:else=`net`]] — если id-ресурса больше 1, выводим «da», или же «net» |
equaltoorlessthan, lessthanorequalto, el, le, islte, lte | Если тег меньше или равен модификатору, используется с «then» и «else». | [[*id:el=`10`:then=`da`:else=`net`]] — если id-ресурса меньше или равно 10, выводим «da», или же «net» |
islowerthan, islessthan, lowerthan, lessthan, islt, lt | Если тег меньше модификатора, используется с «then» и «else». | [[*id:lt=`10`:then=`da`:else=`net`]] — если id-ресурса меньше 10, выводим «da», или же «net» |
contains | Если тег содержит модификатор, используется с «then» и «else». | [[+author:contains=`Сэ́мюэл Кле́менс`:then=`Марк Твен`]] — если в теге содержится фраза «Сэ́мюэл Кле́менс» выводим «Марк Твен» |
containsnot | Если тег не содержит модификатор, используется с «then» и «else». | [[+author:containsnot=`Сэ́мюэл Кле́менс`:then=`Кто-нибудь еще`]] — если в теге не содержится фраза «Сэ́мюэл Кле́менс» выводим «Кто-нибудь еще» |
hide | Если предыдущий модификатор возвращает положительное значение («then»), то не выводим обработанный тег. | [[*id:is=`10`:hide]] — если id-ресурса = 10, ничего не выводим |
show | Если предыдущий модификатор возвращает положительное значение («then»), то выводим обработанный тег. | [[*id:is=`10`:show]] — если id-ресурса = 10, выводим. |
then | Условие, если тег соответствует модификатору, выводим сообщение, иначе ничего не выводим | [[*id:is=`10`:then=`ept`]] — если id-ресурса = 10, выводим «ept». |
else | Условие, если тег не соответствует модификатору, выводим сообщение. Используется только в связке с «then» | [[*id:is=`10`:then=`ept`:else=`nooo`]] — если id-ресурса = 10, выводим «ept» иначе «nooo». |
select | Установить свое значение, в зависимости от модификатора и вывода тега. Так же можно использовать «else», например если значение[[+controls]] — не подходит под шаблон select | [[+controls:select=`0=ВЫКЛ&1=ВКЛ&2=ХЗ`:else=`Ошибка`]] — если тег [[+controls]] — выводит «0», значит выводим «ВЫКЛ», если тот же тег равен «1» выводим «ВКЛ», если «2» выводим «ХЗ», если тег не подходит нашей выборке, то выводим «Ошибка». |
in | Работает аналогично php in_array, если тег совпадет с одним из элементов модификатора (разделяются они запятыми), то выводим then, если не совпало else | [[*template:in=`3,4`:then=`[[$myChank]]`:else=`пробел`]] — если тег [[*template]] (текущий шаблон) — равен «3» или «4», значит выводим [[$myChank]] , если не равен, выводим else. |
Модификаторы строки
cat | Добавляет к тегу строку. | [[+num:cat=` раз`]] — выведет к примеру «10 раз» |
lcase, lowercase, strtolower | Переведет значение тега в нижний регистр, аналогично функции php strtolower. | [[*pagetitle:lcase]] |
ucase, uppercase, strtoupper | Переведет текст в верхний регистр, аналогично функции php strtoupper. | [[*pagetitle:ucase]] |
ucwords | Переведет каждую первую букву, каждого слова в верхний регистр, аналогично функции php ucwords. | [[*pagetitle:ucwords]] |
ucfirst | Переведет только первую букву строки в верхний регистр, аналогично функции php ucfirst. | [[*pagetitle:ucfirst]] |
htmlent, htmlentities | Преобразует все символы в соответствющие HTML сущности (для тех символов, для которых HTML сущности существуют), аналогично функции php htmlentities. Использует текущие настройки системы «modx_charset» с флагом «ENT_QUOTES». | [[*pagetitle:htmlentities]] |
esc,escape | Экранирует разные «плохие символы», так же экранирует[, ] и ` . | [[*content:esc]] |
strip | Заменяет все переносы строк, табуляции и множественные пробелы с на один пробел. | [[*content:strip]] |
stripString | Вырезает из строки заданную строку. | [[*pagetitle:stripString=`писька`]] |
replace | Обычная замена. | [[*pagetitle:replace=`писька==конфетка`]] |
striptags, stripTags,notags,strip_tags | Вырезает все теги, кроме разрешенных, аналогично функции php strip_tags | [[*longtitle:strip_tags=``]] |
len,length, strlen | Возвращает длину строки, аналогично функции php strlen | [[*longtitle:strlen]] |
reverse, strrev | Переворачивает строку, аналогично функции php strrev | [[*longtitle:reverse]] |
wordwrap | Устанавливает переносы в зависимости от кол-ва символов слова, аналогично функции php wordwrap | [[*pagetitle:wordwrap=`10`]] |
limit | Устанавливает лимит на длинну строки и обрезает ее. | [[*pagetitle:limit=`10`]] |
ellipsis | Устанавливает лимит на длинну строки и обрезает ее, добавляя три точки в конце | [[*pagetitle:ellipsis=`10`]] |
tag | Экранирование. Отображает элемент так как он есть, без :tag. Для использования в документации | [[+showThis:tag]] |
add, increment, incr | (, значение + модификатор (по умолчанию +1). | [[+num:incr]] или [[+num:add=`97`]] |
subtract, decrement, decr | Вернет, значение — модификатор (по умолчанию -1). | [[+num:decr]] или [[+num:decr=`97`]] |
multiply, mpy | Вернет, значение * модификатор (по умолчанию *2). | [[+num:mpy]] или [[+num:mpy=`5`]] |
divide, div | Вернет, значение / модификатор (по умолчанию /2). | [[+num:div]] или [[+num:div=`5`]] |
modulus, mod | Вернет, целочисленный остаток от деления значения на модификатор (по умолчанию % 2. Вернет 1 или 0.) | [[+num:mod]] или [[+num:mod=`5`]] |
ifempty, default, empty, isempty | Вернет, указанный модификатор, если значение пусто. | [[*pagetitle:empty=`Пусто`]] |
notempty, !empty, ifnotempty, isnotempty | Вернет, указанный модификатор, если значение не пусто. | [[*pagetitle:!empty=`Не пусто!`]] |
nl2br | Вернет строку с «<br />» или «<br>» вставленные перед всеми (\r\n, \n\r, \n и \r)…, аналогично функции php nl2br | [[*pagetitle:nl2br]] [[*pagetitle:nl2br]] |
date | Аналогично функции PHP strftime. Значение — отформатировано. | [[+birthyear:date=`%Y`]] |
strtotime | Аналогично функции PHP strtotime. Вернет дату. | [[*createdon:strtotime]] — вернет типа «2017-03-15 08:02:08» |
fuzzydate | Вернет дату. Типа вчера, сегодня…. | [[*createdon:fuzzydate]] — вернет типа «Mar 15» |
ago | Вернет дату в прошедших секундах, минутах, неделях или месяцах. | [[*createdon:ago]] — вернет типа «4 гг., 2 мес. назад» |
md5 | Аналогично функции php md5. | [[+password:md5]] |
cdata | Вставляет строку в оболочку «CDATA» тегов. | [[*pagetitle:cdata]] |
userinfo | Возвращает запрошенные модификаторов данные о пользователе. Значение должно быть id-пользователя (modUser). | [[+modx.user.id:userinfo=`username`]] |
isloggedin | Возвращает true, если пользователь авторизирован в этом контексте. | [[+modx.user.id:isloggedin]] |
isnotloggedin | Возвращает true, если пользователь не авторизирован в этом контексте. | [[+modx.user.id:isnotloggedin]] |
toPlaceholder | Помещает результат вывода тега в плейсхолдер, причем там где был помещен — ничего не выводится, а телепортируется в указанный плейсхолдер. До этого модификатора можно использовать любые другие модификаторы. | [[+number:toPlaceholder=`итого`]] помещает содержимое [[+number]] в плейсхолдер [[+итого]] Можно усложнять запись добавляя в левую часть выражения любые другие модификаторы: [[+number:is=`10`:then=`ровно 10`:else=`точно не 10!`:toPlaceholder=`итого`]] если [[+number]] = 10, тогда выводим в плейсхолдер [[+итого]] : «ровно 10», если же нет «точно не 10!». |
cssToHead | Прописывает файл CSS в <link> элемент перед закрывающим тегом </head>, где значение тега модификатора вписывается в аттрибут «href». Используется modX.regClientCSS. | [[+cssTV:cssToHead]] перед закрывающим тегом </head> регистрирует CSS, например: <link rel=»stylesheet» href=»значение +cssTv» type=»text/css» /> |
htmlToHead | Вписывает значение тега перед закрывающим тегом </head>. Используется modX.regClientStartupHTMLBlock. | [[+htmlTV:htmlToHead ]] перед закрывающим тегом </head>, регистрирует значение тега [[+htmlTV]] в HTML код. |
htmlToBottom | Вписывает значение тега перед закрывающим тегом </body>. ИспользуетсяmodX.regClientHTMLBlock | [[+htmlTV:htmlToBottom]] перед закрывающим тегом </body> регистрирует значение тега [[+htmlTV]] в HTML код. |
jsToHead | Прописывает файл JS в <link> элемент перед закрывающим тегом </head>. ИспользуетсяmodX.regClientStartupScript | [[+jsTV:jsToHead]] перед закрывающим тегом </head>, регистрирует JS, например: <script type=»text/javascript» src=»значение +jsTv»></script> |
jsToBottom | Прописывает файл JS в <link> элемент перед закрывающим тегом </body>. ИспользуетсяmodX.regClientScript | [[+jsTV:jsToBottom]] перед закрывающим тегом </body>, регистрирует JS, например: <script type=»text/javascript» src=»значение +jsTv»></script> |
urldecode | Аналогично функции php urldecode | [[+stringi:urldecode]] |
Внутренний ключ пользователя:
[[!+modx.user.id:userinfo=`internalKey`]]
Логин:
[[!+modx.user.id:userinfo=`username`]]
Полное имя:
[[!+modx.user.id:userinfo=`fullname`]]
Роль:
[[!+modx.user.id:userinfo=`role`]]
E-mail:
[[!+modx.user.id:userinfo=`email`]]
Телефон:
[[!+modx.user.id:userinfo=`phone`]]
Мобильный телефон:
[[!+modx.user.id:userinfo=`mobilephone`]]
Факс:
[[!+modx.user.id:userinfo=`fax`]]
День рождения:
[[!+modx.user.id:userinfo=`dob`:date=`%Y-%m-%d`]]
Пол:
[[!+modx.user.id:userinfo=`gender`]]
Страна:
[[!+modx.user.id:userinfo=`country`]]
Штат:
[[!+modx.user.id:userinfo=`state`]]
Zip код:
[[!+modx.user.id:userinfo=`zip`]]
Фото:
[[!+modx.user.id:userinfo=`photo`]]
Комментарий:
[[!+modx.user.id:userinfo=`comment`]]
Дата последнего входа:
[[!+modx.user.id:userinfo=`lastlogin`:date=`%Y-%m-%d`]]
Количество входов:
[[!+modx.user.id:userinfo=`logincount`]]
[[!+modx.user.id]]
возвращает ID вошедшего в систему пользователя. Вы, конечно, можете заменить, его на
[[*createdby]]
или другое поле ресурса или любой плейсхолдер, который возвращает числовое представление ID пользователя.
Обратите внимание, что ID пользователя и его логин уже доступны по умолчанию в MODX, так что вам не нужно использовать модификатор User Info:
[[!+modx.user.id]]
— Выведет ID пользователя
[[!+modx.user.username]]
— Выведет логин пользователя
Особое внимание обращаем на восклицательный знак !
[[!+modx.user.id]]
Он позволяет НЕ кэшировать содержимое вывода. Лучше всего эти плейсхолдеры вызывать некешируемыми, чтобы избежать неожиданных результатов. Почему нужно не кешировать…
Представим это так: на сайте 5 пользователей. Первый пользователь зашел на страницу с вызовом:
Добро пожаловать, [[!+modx.user.id:userinfo=`username`]]!
По задумке на этой странице, выводится приветственное сообщение пользователю. Так вот, если результат будет кешироваться, то при первом входе на эту страницу — сохранится имя пользователя который только что зашел — и всем остальным будет показываться не их имя, а имя того пользователя который вошел на эту страницу первым. Чтобы этого избежать — просто не кэшируем этот тэг, с помощью восклицательного знака перед вызовом !+modx…
Также фильтры можно использовать несколькими способами (что уменьшает время их выполнения)
Используем модификатор:
[[+title:lcase]]
[[+something:notempty=`Hello[[+name]]`]]
Используем сниппет:
[[lcase? &subject=`title`]]
[[notempty? &subject=`something` &then=`Hello[[+name]]`]]
Используем общий сниппет фильтра:
[[Filter? &subject=`title` &operator=`lcase`]]
[[Filter? &subject=`something` &operator=`notempty` &meter=`Hello [[+name]]`]]
P.S: Не забываем включить кэширование тегов, где нужно. Чтобы это сделать — нужно ИЗБАВЛЯТЬСЯ от восклицательных знаков (!). Результаты большинства сниппетов вплоне себе могут работать из кэша.
Спасибо источникам информации: http://modx.ws и https://gaserge.ru
Быстрое прототипирование в MODX CMS
Для чего это нужно?
Допустим, вы загружаете разметку в MODX, но еще не создаете полностью функциональный сайт — это скорее прототип. Вы получите подтверждение клиента на этой ранней стадии разработки, чтобы гарантировать, что вы доставляете все, что ему нужно и что нужно.
Скорее всего, вы просто создадите несколько статических файлов и зафиксируете их в репо и т. Д. С другой стороны, если вы немного чокнутый, как я, вы можете выполнить часть или всю эту работу внутри MODX.Умные и хорошие разработчики назвали меня сумасшедшим из-за этого, но, эй, мне нравится , использующий MODX как своего рода «IDE».
Итак, здесь я набираю несколько элементов
Разбейте его
Snippet принимает несколько параметров:
-
limit
— Это говорит о том, сколько итераций вы хотите. -
tpl
— определяет разметку, которую вы хотите использовать для каждого «виртуального элемента». Вы не указываете здесь Chunk, как это обычно бывает с MODX Snippets. Мы собираемся создать для быстрого прототипирования , так что не будем создавать новые объекты, если мы даже не уверены, что они нам понадобятся, верно? -
outputSeparator
— Обычный тариф MODX для разделения элементов на выходе. -
разделитель
— Если вы хотите настроить разделитель между значениями, которые вы собираетесь предоставить.
Но подождите , как вы предоставляете значения для вставки в tpl? Итак, мы заполняем массив $ properties
каждым элементом из $ scriptProperties
, который не зарезервирован для самого сниппета, поэтому вы можете передать произвольное количество параметров со значениями для вставки.
По умолчанию разделителем является запятая, поэтому значения передаются таким образом, например:
[[прототип?
& limit = `8`
& tpl = ` [[+ текст]] `
& link = `http: // example.com / `
& text = `Текст ссылки A, Текст ссылки B, Текст ссылки C, Текст ссылки D, Текст ссылки E, Текст ссылки F, Текст ссылки G, Текст ссылки H`
]]
HTML-вывод этого вызова фрагмента будет:
Текст ссылки A
Текст ссылки B
Текст ссылки C
Текст ссылки D
Текст ссылки E
Текст ссылки F
Текст ссылки G
Текст ссылки H
Помните, что вы можете сопоставить любой параметр сниппета с соответствующим заполнителем в шаблоне, кроме тех, которые требуются самим сниппетом.Еще одна проблема, о которой следует помнить, заключается в том, что вы не можете помещать модификаторы вывода в tpl
. Вы можете , однако поместить модификаторы вывода в одно из свойств, в котором перечислены значения.
Также обратите внимание, что MODX попытается проанализировать любые вложенные теги до того, как фрагмент даже будет запущен, поэтому убедитесь, что ваши заполнители tpl
не установлены где-либо еще в запрошенном ресурсе / шаблоне.
Если вы можете жить с этими ограничениями и у вас есть, по общему признанию, редкий вариант использования, когда это необходимо, это действительно ускорит процесс…
Еще одно преимущество заключается в том, что разметка вашего прототипа становится более компактной и удобной для чтения. Когда приходит время добавлять реальные данные, очень легко создать блок tpl из значения свойства tpl
и просто вызвать его с помощью «настоящего» сниппета!
Ура для MODX: D
modx.combo.js | код поиска
PageRenderTime 136 мс
CodeModel.GetById 28 мс
app.highlight 99 мс
РепоМодель.GetById 1 мс
app.codeStats 0 мс
/trunk/manager/assets/modext/widgets/core/modx.combo.js
http://modx-revo-ja.googlecode.com/
JavaScript | 629 строк |
Код 585 |
43 пустой |
1 комментарий |
50 сложность | 8db9d861ebc8770b7b7b2d8795b239c1 MD5 |
необработанный файл
1Ext.namespace ('MODx.combo'); 2 / * исправлена проблема с загрузкой значения combobox * / 3Ext.переопределить (Ext.form.ComboBox, {загружено: false, setValue: Ext.form.ComboBox.prototype.setValue.createSequence (function (v) {var a = this.store.find (this.valueField, v); if ( v && v! == 0 && this.mode == 'remote' && a == - 1 &&! this.loaded) {var p = {}; p [this.valueField] = v; this.loaded = true; this.store.load ( {область действия: это, параметры: p, обратный вызов: функция () {this.setValue (v); this.collapse ()}})}})}); 4 5MODx.combo.ComboBox = function (config, getStore) { 6 config = config || {}; 7 Ext.applyIf (config, { 8 displayField: 'имя' 9, valueField: 'id' 10, triggerAction: «все» 11, поля: ['id', 'name'] 12, baseParams: { 13 действие: 'getList' 14} 15, ширина: 150 16, listWidth: 300 17, редактируемый: ложь 18, изменяемый размер: true 19, typeAhead: false 20, forceSelection: true 21, минЧаров: 3 22, cls: 'modx-combo' 23}); 24 доб.applyIf (config, { 25 магазин: новый Ext.data.JsonStore ({ 26 url: config.connector || config.url 27, корень: 'результаты' 28, totalProperty: 'total' 29, поля: config.fields 30, errorReader: MODx.util.JSONReader 31, baseParams: config.baseParams || {} 32, remoteSort: config.remoteSort || ложный 33, autoDestroy: верно 34}) 35}); 36 if (getStore === true) { 37 config.store.load (); 38 возврат конфиг.хранить; 39} 40 MODx.combo.ComboBox.superclass.constructor.call (this, config); 41 this.config = config; 42 вернуть это; 43}; 44Ext.extend (MODx.combo.ComboBox, Ext.form.ComboBox); 45Ext.reg ('modx-combo', MODx.combo.ComboBox); 46 47MODx.combo.Renderer = function (combo) { 48 var loaded = false; 49 return (function (v) { 50 var idx, rec; 51 если (! Combo.store) return v; 52 if (! Loaded) { 53 if (combo.store.proxy! == undefined && combo.store.прокси! == null) { 54 combo.store.load (); 55} 56 загружено = истина; 57} 58 var v2 = combo.getValue (); 59 idx = combo.store.find (combo.valueField, v2? V2: v); 60 rec = combo.store.getAt (idx); 61 возврат (rec === undefined || rec === null? (V2? V2: v): rec.get (combo.displayField)); 62}); 63}; 64 65MODx.combo.Boolean = function (config) { 66 config = config || {}; 67 Ext.applyIf (config, { 68 магазин: новый Ext.data.SimpleStore ({ 69 полей: ['d', 'v'] 70, данные: [[_ ('да'), истина], [_ ('нет'), ложь]] 71}) 72, displayField: 'd' 73, valueField: 'v' 74, режим: 'местный' 75, triggerAction: 'все' 76, редактируемый: ложь 77, selectOnFocus: false 78, preventRender: true 79, forceSelection: истина 80, enableKeyEvents: истина 81}); 82 MODx.combo.Boolean.superclass.constructor.call (это, конфиг); 83}; 84Ext.extend (MODx.combo.Boolean, MODx.combo.ComboBox); 85Ext.reg ('комбинированный логический', MODx.combo.Boolean); 86Ext.reg ('modx-combo-boolean', MODx.combo.Boolean); 87 88MODx.combo.User = function (config) { 89 config = config || {}; 90 Ext.applyIf (config, { 91 имя: 'пользователь' 92, hiddenName: 'пользователь' 93, displayField: 'имя пользователя' 94, valueField: 'id' 95, поля: ['имя пользователя', 'идентификатор'] 96, страница Размер: 20 97, URL: MODx.config.connectors_url + 'security / user.php' 98}); 99 MODx.combo.User.superclass.constructor.call (это, конфиг); 100}; 101Ext.extend (MODx.combo.User, MODx.combo.ComboBox); 102Ext.reg ('modx-combo-user', MODx.combo.User); 103 104MODx.combo.UserGroup = function (config) { 105 config = config || {}; 106 Ext.applyIf (config, { 107 имя: 'группа' 108, hiddenName: 'группа' 109, displayField: 'имя' 110, valueField: 'id' 111, поля: ['name', 'id'] 112, listWidth: 300 113, страница Размер: 20 114, URL: MODx.config.connectors_url + 'security / group.php ' 115}); 116 MODx.combo.UserGroup.superclass.constructor.call (this, config); 117}; 118Ext.extend (MODx.combo.UserGroup, MODx.combo.ComboBox); 119Ext.reg ('modx-combo-usergroup', MODx.combo.UserGroup); 120 121MODx.combo.UserGroupRole = function (config) { 122 config = config || {}; 123 Ext.applyIf (config, { 124 имя: 'роль' 125, hiddenName: 'роль' 126, displayField: 'имя' 127, valueField: 'id' 128, поля: ['name', 'id'] 129, страница Размер: 20 130, URL: MODx.config.connectors_url + 'security / role.php' 131}); 132 MODx.combo.UserGroupRole.superclass.constructor.call (this, config); 133}; 134Ext.extend (MODx.combo.UserGroupRole, MODx.combo.ComboBox); 135Ext.reg ('modx-combo-usergrouprole', MODx.combo.UserGroupRole); 136 137MODx.combo.ResourceGroup = function (config) { 138 config = config || {}; 139 Ext.applyIf (config, { 140 имя: 'группа ресурсов' 141, hiddenName: 'группа ресурсов' 142, displayField: 'имя' 143, valueField: 'id' 144, поля: ['name', 'id'] 145, страницаРазмер: 20 146, URL: MODx.config.connectors_url + 'безопасность / resourcegroup.php' 147}); 148 MODx.combo.ResourceGroup.superclass.constructor.call (это, конфиг); 149}; 150Ext.extend (MODx.combo.ResourceGroup, MODx.combo.ComboBox); 151Ext.reg ('modx-combo-resourcegroup', MODx.combo.ResourceGroup); 152 153MODx.combo.Context = function (config) { 154 config = config || {}; 155 Ext.applyIf (config, { 156 имя: 'контекст' 157, hiddenName: 'контекст' 158, displayField: 'ключ' 159, valueField: 'ключ' 160, поля: ['ключ'] 161, страница Размер: 20 162, URL: MODx.config.connectors_url + 'context / index.php' 163}); 164 MODx.combo.Context.superclass.constructor.call (this, config); 165}; 166Ext.extend (MODx.combo.Context, MODx.combo.ComboBox); 167Ext.reg ('modx-combo-context', MODx.combo.Context); 168 169MODx.combo.Policy = function (config) { 170 config = config || {}; 171 Ext.applyIf (config, { 172 имя: 'политика' 173, hiddenName: 'политика' 174, displayField: 'имя' 175, valueField: 'id' 176, поля: ['name', 'id'] 177, allowBlank: false 178, редактируется: ложь 179, страница Размер: 20 180, URL: MODx.config.connectors_url + 'безопасность / доступ / policy.php' 181}); 182 MODx.combo.Policy.superclass.constructor.call (это, конфиг); 183}; 184Ext.extend (MODx.combo.Policy, MODx.combo.ComboBox); 185Ext.reg ('modx-combo-policy', MODx.combo.Policy); 186 187MODx.combo.Template = function (config) { 188 config = config || {}; 189 Ext.applyIf (config, { 190 имя: 'шаблон' 191, hiddenName: 'шаблон' 192, displayField: 'имя шаблона' 193, valueField: 'id' 194, страница Размер: 20 195, поля: ['id', 'templatename', 'description', 'category'] 196, тпл: новый доб.XTemplate (''). 199, URL: MODx.config.connectors_url + 'element / template.php' 200, listWidth: 350 201, allowBlank: true 202}); 203 MODx.combo.Template.superclass.constructor.call (this, config); 204}; 205Ext.extend (MODx.combo.Template, MODx.combo.ComboBox); 206Ext.reg ('modx-combo-template', MODx.combo.Template); 207 208MODx.combo.Category = function (config) { 209 config = config || {}; 210 Ext.applyIf (config, { 211 имя: 'категория' 212, hiddenName: 'категория' 213, displayField: 'имя' 214, valueField: 'id' 215, режим: 'удаленный' 216, поля: ['id', 'category', 'parent', 'name'] 217, forceSelection: true 218, typeAhead: false 219, allowBlank: true 220, редактируемый: ложь 221, enableKeyEvents: истина 222, URL: MODx.config.connectors_url + 'element / category.php' 223, baseParams: {действие: 'getList', showNone: true} 224}); 225 MODx.combo.Category.superclass.constructor.call (это, конфиг); 226}; 227Ext.extend (MODx.combo.Category, MODx.combo.ComboBox, { 228 _onblur: function (t, e) { 229 var v = this.getRawValue (); 230 this.setRawValue (v); 231 this.setValue (v, истина); 232} 233}); 234Ext.reg ('modx-combo-category', MODx.combo.Category); 235 236MODx.combo.Language = function (config) { 237 config = config || {}; 238 доб.applyIf (config, { 239 имя: 'язык' 240, hiddenName: 'язык' 241, displayField: 'имя' 242, valueField: 'имя' 243, поля: ['имя'] 244, forceSelection: истина 245, typeAhead: false 246, редактируемый: ложь 247, allowBlank: false 248, страница Размер: 20 249, URL: MODx.config.connectors_url + 'system / language.php' 250}); 251 MODx.combo.Language.superclass.constructor.call (this, config); 252}; 253Ext.extend (MODx.combo.Language, MODx.combo.ComboBox); 254Ext.reg ('modx-combo-language', MODx.combo.Language); 255 256MODx.combo.Charset = function (config) { 257 config = config || {}; 258 Ext.applyIf (config, { 259 имя: 'кодировка' 260, hiddenName: 'кодировка' 261, displayField: 'текст' 262, valueField: 'значение' 263, поля: ['значение', 'текст'] 264, forceSelection: истина 265, typeAhead: false 266, редактируемый: ложь 267, allowBlank: false 268, listWidth: 300 269, URL: MODx.config.connectors_url + 'system / charset.php' 270}); 271 MODx.combo.Charset.superclass.constructor.call (это, конфиг); 272}; 273Ext.extend (MODx.combo.Charset, MODx.combo.ComboBox); 274Ext.reg ('modx-combo-charset', MODx.combo.Charset); 275 276MODx.combo.RTE = function (config) { 277 config = config || {}; 278 Ext.applyIf (config, { 279 имя: 'rte' 280, скрытое имя: 'rte' 281, displayField: 'значение' 282, valueField: 'значение' 283, поля: ['значение'] 284, forceSelection: истина 285, typeAhead: false 286, редактируется: ложь 287, allowBlank: false 288, listWidth: 300 289, URL: MODx.config.connectors_url + 'system / rte.php' 290}); 291 MODx.combo.RTE.superclass.constructor.call (это, конфиг); 292}; 293Ext.extend (MODx.combo.RTE, MODx.combo.ComboBox); 294Ext.reg ('modx-combo-rte', MODx.combo.RTE); 295 296MODx.combo.Role = function (config) { 297 config = config || {}; 298 Ext.applyIf (config, { 299 имя: 'роль' 300, hiddenName: 'роль' 301, forceSelection: истина 302, typeAhead: false 303, редактируемый: ложь 304, allowBlank: false 305, listWidth: 300 306, страницаРазмер: 20 307, URL: MODx.config.connectors_url + 'security / role.php' 308, baseParams: {действие: 'getList', addNone: true} 309}); 310 MODx.combo.Role.superclass.constructor.call (this, config); 311}; 312Ext.extend (MODx.combo.Role, MODx.combo.ComboBox); 313Ext.reg ('modx-combo-role', MODx.combo.Role); 314 315MODx.combo.ContentType = function (config) { 316 config = config || {}; 317 Ext.applyIf (config, { 318 имя: 'content_type' 319, hiddenName: 'content_type' 320, forceSelection: истина 321, typeAhead: false 322, редактируемый: ложь 323, allowBlank: false 324, listWidth: 300 325, страницаРазмер: 20 326, URL: MODx.config.connectors_url + 'system / contenttype.php' 327, baseParams: {действие: 'getList'} 328}); 329 MODx.combo.ContentType.superclass.constructor.call (this, config); 330}; 331Ext.extend (MODx.combo.ContentType, MODx.combo.ComboBox); 332Ext.reg ('modx-combo-content-type', MODx.combo.ContentType); 333 334MODx.combo.ContentDisposition = function (config) { 335 config = config || {}; 336 Ext.applyIf (config, { 337 store: новый Ext.data.SimpleStore ({ 338 полей: ['d', 'v'] 339, данные: [[_ ('встроенный'), 0], [_ ('вложение'), 1]] 340}) 341, имя: 'content_dispo' 342, скрытое имя: 'content_dispo' 343, шир: 200 344, displayField: 'd' 345, valueField: 'v' 346, режим: 'местный' 347, triggerAction: 'все' 348, редактируется: ложь 349, страница Размер: 20 350, selectOnFocus: false 351, preventRender: true 352}); 353 MODx.combo.ContentDisposition.superclass.constructor.call (это, конфигурация); 354}; 355Ext.extend (MODx.combo.ContentDisposition, Ext.form.ComboBox); 356Ext.reg ('modx-combo-content-disposition', MODx.combo.ContentDisposition); 357 358MODx.combo.ClassMap = function (config) { 359 config = config || {}; 360 Ext.applyIf (config, { 361 имя: 'класс' 362, hiddenName: 'класс' 363, URL: MODx.config.connectors_url + 'system / classmap.php' 364, displayField: 'класс' 365, valueField: 'класс' 366, поля: ['class'] 367, редактируется: ложь 368}); 369 MODx.combo.ClassMap.superclass.constructor.call (это, конфигурация); 370}; 371Ext.extend (MODx.combo.ClassMap, MODx.combo.ComboBox); 372Ext.reg ('modx-combo-class-map', MODx.combo.ClassMap); 373 374MODx.combo.Object = function (config) { 375 config = config || {}; 376 Ext.applyIf (config, { 377 имя: 'объект' 378, hiddenName: 'объект' 379, URL: MODx.config.connectors_url + 'workspace / builder / index.php' 380, baseParams: { 381 действие: 'getAssocObject' 382, class_key: 'modResource' 383} 384, displayField: 'имя' 385, valueField: 'id' 386, поля: ['id', 'name'] 387, страницаРазмер: 10 388, редактируется: ложь 389}); 390 MODx.combo.Object.superclass.constructor.call (это, конфиг); 391}; 392Ext.extend (MODx.combo.Object, MODx.combo.ComboBox); 393Ext.reg ('modx-combo-object', MODx.combo.Object); 394 395MODx.combo.Namespace = function (config) { 396 config = config || {}; 397 Ext.applyIf (config, { 398 имя: 'пространство имен' 399, hiddenName: 'пространство имен' 400, forceSelection: true 401, typeAhead: false 402, редактируемый: ложь 403, allowBlank: false 404, listWidth: 300 405, страница Размер: 20 406, URL: MODx.config.connectors_url + 'рабочая область / namespace.php' 407, поля: ['имя'] 408, displayField: 'имя' 409, valueField: 'имя' 410}); 411 MODx.combo.Namespace.superclass.constructor.call (this, config); 412}; 413Ext.extend (MODx.combo.Namespace, MODx.combo.ComboBox); 414Ext.reg ('modx-combo-namespace', MODx.combo.Namespace); 415 416MODx.combo.Browser = function (config) { 417 config = config || {}; 418 Ext.applyIf (config, { 419 ширина: 300 420, triggerAction: 'все' 421}); 422 MODx.combo.Browser.superclass.constructor.call (это, конфиг); 423 this.config = config; 424}; 425Ext.extend (MODx.combo.Browser, Ext.form.TriggerField, { 426 браузер: null 427 428, onTriggerClick: function (btn) { 429 if (this.disabled) { 430 вернуть ложь; 431} 432 433 if (this.browser === null) { 434 this.browser = MODx.load ({ 435 xtype: 'modx-браузер' 436, идентификатор: Ext.id () 437, кратное: истина 438, prependPath: this.config.prependPath || нулевой 439, prependUrl: this.config.prependUrl || нулевой 440, hideFiles: this.config.hideFiles || ложный 441, rootVisible: this.config.rootVisible || ложный 442, слушатели: { 443 'select': {fn: function (data) { 444 this.setValue (data.relativeUrl); 445 this.fireEvent ('выбрать', данные); 446}, область действия: это} 447} 448}); 449} 450 это.browser.show (btn); 451 вернет истину; 452} 453 454, onDestroy: function () { 455 MODx.combo.Browser.superclass.onDestroy.call (это); 456} 457}); 458Ext.reg ('modx-combo-browser', MODx.combo.Browser); 459 460MODx.combo.Country = function (config) { 461 config = config || {}; 462 Ext.applyIf (config, { 463 имя: 'страна' 464, hiddenName: 'страна' 465, URL: MODx.config.connectors_url + 'system / country.php' 466, displayField: 'значение' 467, valueField: 'значение' 468, поля: ['значение'] 469, редактируется: ложь 470, значение: 0 471}); 472 MODx.combo.Country.superclass.constructor.call (это, конфигурация); 473}; 474Ext.extend (MODx.combo.Country, MODx.combo.ComboBox); 475Ext.reg ('modx-combo-country', MODx.combo.Country); 476 477MODx.combo.PropertySet = function (config) { 478 config = config || {}; 479 Ext.applyIf (config, { 480 имя: 'набор свойств' 481, hiddenName: 'набор свойств' 482, URL: MODx.config.connectors_url + 'element / propertyset.php' 483, displayField: 'имя' 484, valueField: 'id' 485, поля: ['id', 'name'] 486, редактируется: ложь 487, значение: 0 488}); 489 MODx.combo.PropertySet.superclass.constructor.call (это, конфигурация); 490}; 491Ext.extend (MODx.combo.PropertySet, MODx.combo.ComboBox); 492Ext.reg ('modx-combo-property-set', MODx.combo.PropertySet); 493 494 495MODx.ChangeParentField = function (config) { 496 config = config || {}; 497 Ext.applyIf (config, { 498 triggerAction: 'все' 499, редактируется: ложь 500, только чтение: false 501, formpanel: 'modx-панель-ресурс' 502}); 503 MODx.ChangeParentField.superclass.constructor.вызов (это, конфиг); 504 this.config = config; 505 this.on ('щелкните', this.onTriggerClick, это); 506 this.addEvents ({конец: истина}); 507 this.on ('конец', this.end, this); 508}; 509Ext.extend (MODx.ChangeParentField, Ext.form.TriggerField, { 510 oldValue: false 511, oldDisplayValue: ложь 512, end: function (p) { 513 var t = Ext.getCmp ('modx-resource-tree'); 514 if (! T) return; 515 p.d = p.d || p.v; 516 517 t.removeListener («щелчок», this.handleChangeParent, this); 518 т.on ('щелчок', t._handleClick, t); 519 t.disableHref = false; 520 521 Ext.getCmp ('modx-ресурс-родитель-скрытый'). SetValue (p.v); 522 523 this.setValue (p.d); 524 this.oldValue = false; 525 526 Ext.getCmp (this.config.formpanel) .fireEvent ('fieldChange'); 527} 528, onTriggerClick: function () { 529 если (this.disabled) {вернуть ложь; } 530 if (this.oldValue) { 531 this.fireEvent ('конец', { 532 v: this.oldValue 533, д: это.oldDisplayValue 534}); 535 return false; 536} 537 538 var t = Ext.getCmp ('modx-resource-tree'); 539 если (! T) {вернуть ложь; } 540 541 this.oldDisplayValue = this.getValue (); 542 this.oldValue = Ext.getCmp ('modx-resource-parent-hidden'). GetValue (); 543 544 this.setValue (_ ('родительский_узел_ресурсов')); 545 546 т. Развернуть (); 547 t.removeListener ('щелчок', t._handleClick); 548 t.on ('щелкнуть', this.handleChangeParent, это); 549 t.disableHref = true; 550 вернет истину; 551} 552 553, handleChangeParent: function (node, e) { 554 var t = Ext.getCmp ('modx-resource-tree'); 555 если (! T) {вернуть ложь; } 556 t.disableHref = true; 557 558 var id = node.id.split ('_'); id = id [1]; 559 if (id == MODx.request.id) { 560 MODx.msg.alert ('', _ ('resource_err_own_parent')); 561 возвращает ложь; 562} 563 564 это.fireEvent ('конец', { 565 v: node.attributes.type! = 'ModContext'? идентификатор: node.attributes.pk 566, d: node.text 567}); 568 e.preventDefault (); 569 e.stopEvent (); 570 return true; 571} 572}); 573Ext.reg ('modx-field-parent-change', MODx.ChangeParentField); 574 575 576MODx.combo.TVWidget = function (config) { 577 config = config || {}; 578 Ext.applyIf (config, { 579 имя: 'виджет' 580, hiddenName: 'виджет' 581, displayField: 'имя' 582, valueField: 'значение' 583, поля: ['значение', 'имя'] 584, редактируется: ложь 585, URL: MODx.config.connectors_url + 'element / tv / renders.php' 586, baseParams: { 587 действие: 'getOutputs' 588} 589, значение: 'default' 590}); 591 MODx.combo.TVWidget.superclass.constructor.call (это, конфиг); 592}; 593Ext.extend (MODx.combo.TVWidget, MODx.combo.ComboBox); 594Ext.reg ('modx-combo-tv-widget', MODx.combo.TVWidget); 595 596MODx.combo.TVInputType = function (config) { 597 config = config || {}; 598 Ext.applyIf (config, { 599 имя: 'тип' 600, hiddenName: 'тип' 601, displayField: 'имя' 602, valueField: 'значение' 603, редактируется: ложь 604, поля: ['значение', 'имя'] 605, URL: MODx.config.connectors_url + 'element / tv / renders.php' 606, baseParams: { 607 действие: 'getInputs' 608} 609, значение: 'текст' 610}); 611 MODx.combo.TVInputType.superclass.constructor.call (this, config); 612}; 613Ext.extend (MODx.combo.TVInputType, MODx.combo.ComboBox); 614Ext.reg ('modx-combo-tv-input-type', MODx.combo.TVInputType); 615 616MODx.combo.Action = function (config) { 617 config = config || {}; 618 Ext.applyIf (config, { 619 имя: 'действие' 620, hiddenName: 'действие' 621, displayField: 'контроллер' 622, valueField: 'id' 623, поля: ['id', 'controller'] 624, URL: MODx.config.connectors_url + 'system / action.php' 625}); 626 MODx.combo.Action.superclass.constructor.call (это, конфиг); 627}; 628Ext.extend (MODx.combo.Action, MODx.combo.ComboBox); 629Ext.reg ('modx-combo-action', MODx.combo.Action); {templatename} ' 197, '- {category} ' 198, '
{description}
Практическое руководство по фавориту MODX: MIGX [How To W / Pics] — Arketi Group
MIGX в MODX
Не секрет, что Аркети любит MODX; система управления контентом (CMS), которая дает вам чистый лист для создания сайта по своему вкусу и создания привлекательных дизайнов.
Нет предопределенной структуры, внутри которой вы должны строить свои сайты, и нет настройки вашего дизайна, чтобы он соответствовал видению другого разработчика о том, как сайт должен быть структурирован. Как говорится на сайте MODX: «Creative. Свобода.»
Всегда есть компромисс с такой свободой. Никто не говорит вам, как структурировать свой сайт, вы должны решить, как это сделать самостоятельно! Поначалу это пугает, но как только вы начинаете пользоваться возможностями, которые предлагает MODX с шаблонными переменными, фильтрами ввода / вывода, фрагментами и фрагментами, это вызывает привыкание.
Сложная часть — узнать, какие инструменты у вас есть и как их использовать, чтобы делать то, что вы хотите.
Мы собираемся взглянуть на MIGX, один из моих любимых типов пользовательских переменных шаблона.
Используя MIGX или MultiItemsGridtv для MODX, Arketi создал баннер с прокручивающейся домашней страницей для нашего клиента, ARA.
Ого, что такое переменная шаблона?
Что ж, давайте сначала объясним это. В MODX переменная шаблона — это настраиваемое поле для ресурса MODX.Ресурсы в MODX могут быть разными, но наиболее распространенными являются представления страниц вашего веб-сайта. Переменные шаблона позволяют хранить или использовать настраиваемые поля на ваших страницах. Это могут быть простые вещи, такие как текст или блок форматированного текста с кодом, или они могут быть более сложными, например дата и время для повторяющихся событий, раскрывающиеся списки, созданные из других ресурсов, или флажки, используемые для включения или выключения страницы. Особенности.
По сути, это один из самых мощных инструментов в MODX.
Настройка MIGX
Я настоятельно рекомендую также прочитать отличный учебник для MIGX, созданный Марком Хамстра здесь и прочитать документацию MIGX здесь .Оба — отличные гиды.
Самая сложная часть всего процесса — это настройка начальной переменной шаблона.
Для начала установите MIGX через страницу управления пакетами MODX. После установки у вас есть доступ к новому типу переменной шаблона. Задайте свое имя, заголовок и описание, как и для любого другого, и назначьте его шаблону, который может использовать эту переменную при доступе к шаблону.
Вариант ввода там, где он становится другим. Установите тип ввода MIGX, и вы увидите целый ряд новых опций.Наиболее важными являются вкладки формы , и , столбцы сетки , и для обоих полей требуются операторы JSON. Вкладки форм определяют, как ваши данные хранятся и представляются, а столбец сетки — это то, как эти данные представляются пользователю в диспетчере MODX.
Вкладки формы ARA
1 | [{«подпись»: «Содержание слайдера домашней страницы», «поля»: [ |
Строка заголовка определяет, что будет сказано в заголовке, когда вы откроете новый элемент в своей сетке.
На примере заголовка рассмотрим каждый предмет:
- «поле»: «заголовок» — это имя, используемое для поля
- «подпись»: «Заголовок» — отображаемое имя этого поля.
- «описание»: «Заголовок вступления» — это короткий описательный текст, показываемый пользователю.
- «inputTV»: «textTV-MIGX» (это ключ) определяет ТИП поля. Сначала это немного сбивает с толку, но эта запись ищет переменную шаблона textTV-MIGX . Это специальная переменная шаблона, которая не назначается шаблону, для которого задано имя textTV-MIGX, а тип установлен как text.
Как вы можете видеть выше, мы используем 5 типов входных телевизоров:
- заполнитель TV-MIGX — это скрытое поле, поэтому оно не отображается при редактировании строки
- textTV-MIGX — это простое текстовое поле
- textareaTV-MIGX — это простая текстовая область
- imageTV-MIGX — это переменная шаблона изображения, позволяющая обрабатывать эскиз.
- homeagepanelcolorTV-MIGX — это специальная переменная шаблона, созданная для этой панели. Это серия переключателей, позволяющих пользователю выбрать цвет
Столбцы сетки ARA выглядят так
1 | [ |
Давайте еще раз посмотрим на заголовок:
- «заголовок»: «Заголовок» — это заголовок для этого столбца.
- «width»: «100» устанавливает для этого столбца ширину 100 пикселей.
- «sortable»: «true» дает вам возможность отсортировать
- «dataIndex»: «title» связывает этот столбец с именем поля, используемым в наших вкладках формы.
Здесь есть несколько особых случаев, таких как заполнитель и средство визуализации изображения: «this.renderPlaceholder »помогает создать последовательный идентификатор для каждой строки. «Renderer»: «this.renderImage» помогает создать миниатюрное изображение в строке.
Когда все будет готово, перейдите к любому ресурсу, который использует эту новую переменную шаблона, и вы увидите что-то вроде этого:
Вы получаете очень красивую, легко обновляемую сетку предметов. При нажатии кнопки «Добавить элемент» открывается всплывающее окно с возможностью создания новой строки со всей необходимой информацией.
Размещение этой переменной шаблона на странице дает нам следующее:
1 | [{«MIGX_id»: «3», «placeholder»: «», «title»: «ПОСЛЕДНИЕ ОПЕРАЦИИ», «location»: «Vistas at Saddle Rock», » address1 «:» 22959 East Smoky Hill Road «,» address2 «:» Аврора, Колорадо «,» copy «:» 320-Units «,» image «:» assets / homepage / denver.jpg «,» panelcolor «:» blue «}, {» MIGX_id «:» 1 «,» placeholder «:» «,» title «:» ПОСЛЕДНИЕ СДЕЛКИ «,» location «:» Апартаменты Autumn Park «,» address1 » : «1801 Interface Lane», «address2»: «Charlotte, NC», «copy»: «586-Units», «image»: «assets / homepage / charloette-autumnpark.jpg», «panelcolor»: «зеленый» }, {«MIGX_id»: «2», «placeholder»: «», «title»: «ПОСЛЕДНИЕ СДЕЛКИ», «location»: «Belmont Apartments & amp; Townhomes »,« address1 »:« 2500 Bennett Avenue »,« address2 »:« Даллас, Техас »,« copy »:« 477-Units »,« image »:« assets / homepage / DallasUDR.jpg «,» panelcolor «:» red «}] |
Не очень полезен, но здесь на помощь приходят два других инструмента MODX — фрагмент и фрагмент.
Сниппеты — это способ, которым MODX может запускать части динамического PHP-кода на странице. Фрагменты — это фрагменты статического текста или других элементов на странице. Чанки не обрабатывают PHP, но их можно использовать для вызова сниппетов. Переменная шаблона, фрагмент под названием «HomepageSlider» и пара фрагментов — все, что нам нужно, чтобы превратить вывод выше в HTML-код, который мы можем использовать.
В шаблоне домашней страницы есть эта строка:
[[HomepageSlider? & input = `[[* HomepageFeatures]]`]]
[[* HomepageFeatures]] — это имя, которое мы дали нашей переменной шаблона
«HomepageSlider» — это имя сниппета, который мы собираемся использовать. Вы можете видеть, что переменная шаблона была назначена параметру с именем input. Это будет передано в сниппет и использовано как переменная PHP.
Итак, вот код фрагмента:
HomepageSlider
1 | $ slideOrder = 1; $ output = »; $ вывод.= ‘ ‘ ; foreach ($ input как $ row) $ output. = Implode («\ n», $ section1);
foreach ($ input как $ row2) $ вывод.= implode («\ n», $ section2); ‘; |
Давайте пройдемся через это.
- Во-первых, превратите эту переменную шаблона во что-нибудь пригодное для использования. Если вы помните, мы назначили параметр для вызова сниппета с именем input. Теперь мы используем одну из функций MODX, чтобы превратить эту строку JSON в массив PHP.
- Поскольку редактор сайта может захотеть изменить порядок слайдов в диспетчере, создайте новую переменную, которая начинается с номера 1, под названием «порядок слайдов».
- Создайте выходную переменную и убедитесь, что в ней ничего нет. Затем мы можем начать добавлять HTML-код.
- Затем мы начинаем проходить через этот большой массив. Сначала установите MIGX_id равным любому номеру переменной для ползунка. В данном случае он первый, поэтому мы его нумеруем.
- Теперь вызовите одну из функций MODX, называемую getChunk. Это действительно так, как кажется. Он получает фрагмент под названием «HomepageSliderTpl» и использует массив строк (подробнее об этом позже).
- Затем мы увеличиваем порядок слайдов на единицу.
- Мы проходим этот цикл, заполняя новый массив с именем section1.
- Как только этот цикл завершен, мы превращаем массив в новый красивый фрагмент HTML-кода.
- В большинстве случаев теперь вы готовы вернуть свою выходную переменную на страницу. В случае области домашней страницы ARA содержимое отделяется от изображений. Поэтому у нас есть немного больше HTML-кода, а также еще один для каждого цикла и взрыва.
В этом фрагменте есть два оператора getChunk. Вот как выглядят getChunks
HompageSliderTpl
1 | [[+ title]] [[+ location]] [[+ address1]] [[+ копия]] |
HompageSliderTpl2
1 | ul> li> [[+ image: imageProcess]] / li> / ul> |
Когда этот фрагмент вызывается в каждом цикле или для каждого цикла, ему предоставляется массив с парами ключей.