Что такое чанки в программировании
Перейти к содержимому

Что такое чанки в программировании

  • автор:

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

Чанки в админке MODX Revolution расположены на левой панели во вкладке «Элементы».

MODX - Чанки в админке

Создание чанка

Создание чанка осуществляется с помощью кнопки «+». После нажатию на эту кнопку открывается страница, содержащая форму. Среди полей этой формы, основными являются имя и код чанка (html). Имя — это название, посредством которого этот чанк можно будет вызывать в шаблоне, содержимом ресурса или в другом месте. Код чанка (html) — это контент, который парсер будет выводить на месте вызова чанка.

MODX - Создание чанка

Кроме этого система MODX позволяет хранить содержимое чанка во внешнем файле. Для этого необходимо установить галочку в поле статичный, выбрать источник файлов и указать его расположение.

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 ''.$output.'
';

Управление чанком через 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))
Похожие записи:
  1. Различные элементы в списке
  2. Эффективный ввод-вывод в разных языках программирования
  3. Django — доработка шаблона формы регистрации
  4. Упаковка дубликатов

Изучаем потоки, чанки и ищем конец

Примечание: ниже перевод статьи «On Streaming, Chunking, and Finding the End», в которой авторы рассматривают процесс передачи информации по HTTP-соединению и возможности для ускорения этого процесса. Мои комментарии далее курсивом.

Два способа передачи

Как и в большинстве механизмов передачи данных, в HTTP существует два основных способа отправить сообщение: «все и сразу» или «по частям». Другими словами, в HTTP есть возможность отправлять данные до тех пор, пока еще есть хотя бы что-то, что можно отправить, либо отправить все данные как одну логическую единицу, указав предварительно ее размер.

Если вы занимаетесь веб-разработками достаточно продолжительное время, скорее всего, вы уже знаете, как работает сброс буфера (flush) на стороне сервера. Этот метод позволяет начать отправку части данных пользователю, в то время как скрипт может продолжать выполнять некоторые, достаточно медленные, действия (скажем, ресурсоемкий запрос к базе данных). Если вы уже применяли эту возможность, тогда вы, вероятно, использовали преимущества потокового (streaming) механизма, хотя могли и не знать всех деталей работы HTTP-протокола.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *