MODx/Терминология
MODx это очень гибкая система управления контентом и она может быть настроена множеством разных способов.
Наши новые пользователи могут быть сбиты с толку терминологией, но на практике эта терминология достаточно распространена.
У редактора контента есть два способа, чтобы добавить содержимое на сайт:
- в специальную область для контента
- в другие области, которые мы называем Переменные уровня документа (обычно это боковые блоки информации, но это могут быть любые элементы веб-страницы).
Также есть два других важных отличительных понятия MODx, о которых вам следует знать:
- Чанки (Chunks) — это часто используемые фрагменты HTML-кода. Вы можете использовать Чанки как в специальной области для контента, так и как часть переменных уровня документа. Например, вы можете поместить свою контактную информацию в тело Чанка, а затем вставлять этот Чанк везде где вам требуется без необходимости писать её каждый раз заново.
- Сниппеты (Snippets) — это небольшие части вашей веб-страницы, требующие некоторой динамики. Например, меню или форма поиска. Сниппеты могут быть использованы как в рамках Шаблона, или в специальной области контента, в составе Чанков или как Переменные уровня документа.
И Чанки, и Сниппеты могут быть добавлены сразу в шаблон вашим веб-разработчиком, или вы можете сами добавить их потом, когда будете заполнять специальную область для контента или создать Переменные уровня документа.
А теперь все сказанное вместе. Для примера рассмотрим абстрактный сайт:
- В шаблоне заданы основы функциональности веб-страниц вашего сайта. Ваш веб-разработчик может определить где должен располагаться контент общий для каждой веб-страницы сайта. В нашем примере это заголовок и логотип, которые закреплены в шаблоне на специальных местах.
- У шаблона есть специальная область для контента, помеченная на картинке фиолетовой рамкой, контент добавляется с помощью специальной Переменной уровня документа простым вызовом [*content*]. Содержимое документа заполняется в интерфейсе редактора контента.
- Шаблон содержит и специальные тэги MODx для вставки Сниппетов. В нашем примере это два Сниппета, помечены синей рамкой, они добавлены в шаблон вызовом [[ИмяСниппета]]
- Также в примере используются специальные переменные шаблона, которые позволяют вам вставить текст, картинку или любой другой элемент страницы, которые не должны располагаться в основной области для контента. На картинке эти элементы помечены зеленой рамкой и добавятся они в шаблон вызовом [*ИмяПеременнойШаблона*]
- Редактор сайта может вставить предопределенные части текста или HTML-кода в область контента или в тело переменных шаблона, это Чанки. В нашем примере есть два Чанка, они помечены красным цветом. Чанки добавляются редактором контента через редактирование области контента или вставляя их в тело переменных шаблона.
MODX — Чанки
Чанк — это элемент MODX, который представляет собой кусок текста или HTML-кода. Предназначен он для формирования некоторого фрагмента (куска, части) HTML-страницы. Например, чанк можно использовать для вывода раздела head HTML-документа, меню, блоков информации в основной и дополнительной области сайта, футера и многих других частей страницы.
Например, чанк (его содержимое), который используется для вывода меню сайта:
[[pdoMenu? &parents=`0` &level=`1` ]]
Кроме этого чанки в MODX Revolution также используются в качестве шаблонов для вывода результатов работы сниппета.
Например, чанк (tpl.Tickets.list.row), который используется в качестве шаблона сниппета getTickets :
[[!getTickets? &tpl=`tpl.Tickets.list.row`]]
Внутри чанках, как и во многих других элементах MODX Revolution (шаблонах, TV-параметрах, полях ресурса), нельзя непосредственно размещать php-код. Размещение в этих элементах динамического содержимого осуществляется посредством вызовов сниппетов, которые исполняют хранящийся внутри них PHP-код.
Совет: не храните повторяющийся код (раздел head , шапку сайта, меню, подвал, контактную информацию и др. блоки страницы) в шаблонах. Более предпочтительно всё это оформить в виде чанков, а затем использовать их в необходимых шаблонах. Это позволит сократить значительное количество времени, если потребуется внести изменения в некоторый блок. Вместо редактирования большого количества шаблонов, в данном случае потребуется всего внести изменения только в один чанк.
Где хранятся чанки
Чанки, как и остальные объекты MODX, хранятся в базе данных. Чанки содержатся в таблице modx_site_htmlsnippets (modx — это префикс таблиц, заданный во время установки системы).
Работа с чанками в админке MODX
Чанки в админке MODX Revolution расположены на левой панели во вкладке «Элементы».
Создание чанка
Создание чанка осуществляется с помощью кнопки «+». После нажатию на эту кнопку открывается страница, содержащая форму. Среди полей этой формы, основными являются имя и код чанка (html). Имя — это название, посредством которого этот чанк можно будет вызывать в шаблоне, содержимом ресурса или в другом месте. Код чанка (html) — это контент, который парсер будет выводить на месте вызова чанка.
Кроме этого система MODX позволяет хранить содержимое чанка во внешнем файле. Для этого необходимо установить галочку в поле статичный, выбрать источник файлов и указать его расположение.
Редактирование чанка
Для редактирования некоторого чанка в админке необходимо нажать на него левой кнопкой мыши. После этого откроется форма полями чанки, в которую необходимо внести изменения и нажать на кнопку «Сохранить».
Как использовать чанки в MODX
Вставка чанка в шаблон или содержимое ресурса осуществляется с помощью следующего тега MODX:
[[$chunkName]]
Во время обработки страницы, парсер MODX заменит тег чанка его содержимым.
Чанк и его параметры
Чанки в MODX могут иметь параметры. Например, рассмотрим чанк «intro», имеющий следующее содержимое:
Привет, [[+name]]. У Вас [[+messageCount]] сообщений.
Он имеет 2 плейсхолдера: [[+name]] и [[+messageCount]]. Передать значения этим плейсхолдерам можно с помощью указания соответствующих параметров вызову чанка:
[[$intro? &name=`Роман` &messageCount=`7`]]
В результате, получим следующее содержимое:
Привет, Роман. У Вас 7 сообщений.
Если пойти немного дальше, то можно, например, создать TV-параметры name и messageCount , и добавить их (эти переменные) к соответствующему шаблону. После этого у каждого ресурса, имеющего этот шаблон, появятся эти TV-параметры. Значения этих TV-параметров можно использовать в качестве значений параметров чанка:
[[!$intro? &name=`[[*name]]` &messageCount=`[[*messageCount]]` ]]
или в содержимом чанка:
Привет, [[*name]]. У Вас [[*messageCount]] сообщений.
Условия в чанках
Условия и другие фильтры MODX можно использовать в любых специальных тегах этой системы.
Например, внутри чанка в зависимости от идентификатора родителя текущего ресурса вывести один или другой чанк.
[[*parent:is=`10`:then=` [[$chunk1]] `:else=` [[$chunk2]] `]]
Но с фильтрами в MODX надо быть очень осторожными, т.к. они могут сильно увеличить время генерации страницы. Это происходит потому, что условия в тегах MODX работают не так как обычные условия в php. Например, в вышеприведённом примере оба чанка вызовутся, не зависимого от того какой идентификатор имеет родитель текущего ресурса. А уже только потом будет определяться какой из этих чанков будет выведен на страницу. Поэтому в MODX они и называются фильтрами. А теперь давайте представим, что в этих чанках есть вызовы некэшируемых сниппетов. В результате в не зависимости от идентификатора родителя текущего ресурса эти вызовы будут выполняться как в первом, так и во втором чанке. Это может привести к значительному увеличению времени генерации страницы и нагрузке на сервер. В таких случаях лучше фильтры не использовать, а выполнять эти действия с помощью сниппета.
resource->parent==10) { $output = 'chunk1'; } return $modx->getChunk($output);
Обработка чанка с помощью API
Чанки часто выступают в качестве шаблонов для вывода результатов работы сниппета. Обрабатывается чанк в сниппете через функцию getChunk().
Например, рассмотрим, как использовать чанк «rowTpl» в сниппете.
Чанк «rowTpl», имеет следующее содержимое:
[[+pagetitle]] [[+introtext]]
Содержимое (php-код) сниппета, который получает все опубликованные ресурсы на сайте и выводит их в таблицу. Для вывода данных отдельного ресурса (одной строки таблицы, состоящей из 2 ячеек) используется шаблон rowTpl.
// получить массив (коллекцию) опубликованных ресурсов $resources = $modx‐>getCollection('modResource',array('published' => true)); // переменная-счётчик $i = 0; // переменная, хранящая результат $output = ''; // перебрать все ресурсы foreach ($resources as $resource) { // создать ассоциативный PHP массив из полей ресурса $properties = $resource‐>toArray(); // установить ключу rowCls ассоциативного массива $properties значение alt, если ресурс чётный $properties['rowCls'] = $i % 2 ? '' : 'alt'; // получить содержимое чанка rowTpl, передав в него массив полей ресурса в качестве параметров $output .= $modx‐>getChunk('rowTpl',$properties); // увеличить значение переменной на 1 $i++; } // вернуть в качестве результата таблицу опубликованных ресурсов return '
Управление чанком через API
Управлять чанками в MODX можно через API:
newObject('modChunk'); // 1.2. Установить этому новому чанку имя NewChunkName $chunk‐>set('name','NewChunkName'); // 1.3. Установить этому чанку контент $chunk‐>setContent('Это мой новый чанк!
'); // 1.4. Сохранить этот чанк в базу данных $chunk‐>save(); /* 2. Получить существующий чанк, изменить содержимое этого чанка. Сохранить изменения в базу данных */ // 2.1. Получить чанк, имеющий имя NewChunkName $chunk = $modx‐>getObject('modChunk', array('name' => 'NewChunkName')); // 2.2. Если чанк с таким именем существует, то. if ($chunk) { // 2.3. Установить ему следующий контент $chunk‐>setContent('Это мой чанк, но уже с новым контентом!
'); // 2.4. Сохранить изменения $chunk‐>save(); } /* 3. Получить существующий чанк и удалить его из базы данных */ // 3.1. Получить чанк, имеющий имя NewChunkName $chunk = $modx‐>getObject('modChunk', array('name' => 'NewChunkName')); // 3.2. Если чанк с таким именем существует, то удалить его. if ($chunk) $chunk‐>remove();
Разбиение на чанки
На вход программе подаются две строки, на одной символы, на другой число n. Из первой строки формируется список.
Реализуйте функцию chunked(), которая принимает на вход список и число, задающее размер чанка (куска), а возвращает список из чанков указанной длины.
Формат входных данных
На вход программе подается строка текста, содержащая символы, отделенные символом пробела и число n на отдельной строке.
Формат выходных данных
Программа должна вывести указанный вложенный список.
def chunked(original_list, piece): new_list = [] for i in range(0, len(original_list), piece): new_list.append(list(original_list[i:i+piece])) i += piece return(new_list) original_list, piece = input().split(), int(input()) print(chunked(original_list, piece))
Похожие записи:
- Различные элементы в списке
- Эффективный ввод-вывод в разных языках программирования
- Django — доработка шаблона формы регистрации
- Упаковка дубликатов
Изучаем потоки, чанки и ищем конец
Примечание: ниже перевод статьи «On Streaming, Chunking, and Finding the End», в которой авторы рассматривают процесс передачи информации по HTTP-соединению и возможности для ускорения этого процесса. Мои комментарии далее курсивом.
Два способа передачи
Как и в большинстве механизмов передачи данных, в HTTP существует два основных способа отправить сообщение: «все и сразу» или «по частям». Другими словами, в HTTP есть возможность отправлять данные до тех пор, пока еще есть хотя бы что-то, что можно отправить, либо отправить все данные как одну логическую единицу, указав предварительно ее размер.
Если вы занимаетесь веб-разработками достаточно продолжительное время, скорее всего, вы уже знаете, как работает сброс буфера (flush) на стороне сервера. Этот метод позволяет начать отправку части данных пользователю, в то время как скрипт может продолжать выполнять некоторые, достаточно медленные, действия (скажем, ресурсоемкий запрос к базе данных). Если вы уже применяли эту возможность, тогда вы, вероятно, использовали преимущества потокового (streaming) механизма, хотя могли и не знать всех деталей работы HTTP-протокола.