Parcelle в 7 версии Meruert

Parcelle (произносится [парсель] с ударением на последний слог) — компактный язык разметки внутри CMS Meruert. Он позволяет вставлять небольшие кусочки кода, которые генерируют достаточно большие объёмы данных, уже свёрстанные нужным образом и корректно работающие: форму поиска или форму обратной связи, текущий год или список всех страниц сайта. Parcelles (читается так же, но разработчики под Meruert называют их «парсели» и склоняют на русском языке) — это те самые кусочки кода, или шорткоды, которые можно вставлять в любое место сайта: любую запись или страницу, любое место шаблона, сайдбар, футербар и т.п. Например, если написать [parcelle:search], то будет вставлена форма поиска. Если написать [parcelle:since:2011], то мы получим запись: 2011–2017. Если же написать [parcelle:posts:all-abc], то выведется список ссылок на все посты (записи) блога в алфавитном порядке.
В 7 версии Meruert система парселей сильно переработана. Те шорткоды, которые описаны в документации для шестой версии, всё так же работают. 

Первая часть касается вывода простых фрагментов:
[parcelle:year] или [parcelle:y] — текущий год: 2017;
[parcelle:since:1987], или [parcelle:from:1987], или [parcelle:range:1987] — диапазон от указанного года (в данном примере 1987) до текущего: 1987–2017;
[parcelle:engine] — название CMS: Meruert 7;
[parcelle:version] — версия CMS: 7;
[parcelle:sitecopy] — знак авторских прав и название текущего сайта, оформленное как ссылка на главную страницу (испльзуется по умолчанию в подвале страниц): © Meruert CMS;
[parcelle:currentPage], или [parcelle:currentpage], или [parcelle:current-page], или просто [parcelle:current] — полный адрес текущей страницы: http://www.meruert.com/7-version-parcelles/;
[parcelle:server] — адрес сервера, на котором работает данный сайт: http://www.meruert.com/;
[parcelle:lang] — код языка, который активен в системе в данный момент; имеет более специальное употребление, чем остальные шорткоды; при генерации меню может быть заменён на короткий аналог [lang]; выводит результат в виде ru;
[parcelle:today] показывает сегодняшнюю дату на нужном языке: 15 декабря 2017;
[parcelle:now] показывает текущие дату и время: 15 декабря 2017 (10:59:45).

Другая часть используется для вывода форм:
[parcelle:feedback] — форма обратной связи, позволяющая отправить письмо с сайта его владельцу;
[parcelle:search] — форма поиска, ведушая на поисковую страницу на данном сайте;
[parcelle:login], или [parcelle:login], или [parcelle:login] — форма авторизации (входа на сайт); видна только неавторизованным пользователям.
В качестве примера — результат вывода [parcelle:search]:

Наконец, две большие группы парселей связаны с автоматическим выводом содержания (то есть ссылок на материалы сайта). Если вам нужен список из пяти последних статей на сайте; или список из тэгов (тем, рубрик), вложенных в другой тэг; или список ссылок на шестнадцать случайных постов; или на все страницы, не входящие в блог; или список из блогов; или алфавитный список всех статей под определённой рубрикой — в этом случае данные шорткоды помогут решить вашу задачу. В этих шорткодах порядок следования элементов и все их части имеют большое значение (вы можете управлять также видом ссылок и дополнительными фрагментами), поэтому стоит прочитать все примеры.

Списки материалов

[parcelle:records] — список всех материалов сайта;
[parcelle:posts] или [parcelle:titles] — список всех записей в блоге;
[parcelle:pages] или [parcelle:static] — список всех страниц, не входящих в блог;
[parcelle:drafts] — черновики;
[parcelle:secret] — тайные записи;
[parcelle:faved], или [parcelle:favorite], или [parcelle:favourite] — избранные записи;
[parcelle:tag-3] — все записи под тэгом (рубрикой) №3 — разумеется, можно использовать любой номер из тех, которые доступны; номер тэга легко узнать из адресной строки или при его редактировании;
[parcelle:blog-7] — все записи из блога №7;
[parcelle:in-projects] — записи или страницы, дочерние по отношению к указанной (в данном примере projects; например, в списке будут страницы с адресами site.com/projects/print, site.com/projects/web, site.com/projects/web/sites и другие); вы можете ограничивать анализ вложенности страниц, например, так: [parcelle:in-projects^2] — в этом случае будут выводиться страницы только с двумя уровнями вложенности
[parcelle:children] — непосредственные дочерние страницы по отношению к текущей (например, site.com/books/novels по отношению к site.com/books); 
[parcelle:all-children] — дочерние страницы любого уровня вложенности по отношению к текущей (например, site.com/books/novels/recent по отношению к site.com/books).
Если заголовка у материала нет, вместо заголовка выводятся три звёздочки.

По умолчанию выводятся все записи указанного типа, без ограничения количества. Это потому, что указаны только две позиции в парселе (позиции — то, что разделено двоеточием; на первом месте всегда слово parcelle, а на втором — то, что именно нужно вывести на экран: записи, черновики, темы и т.п.). Можно ввести третью позицию, после второго двоеточия, и в этом случае можно указать, какой максимум заголовков записей будет выведен:
[parcelle:posts:5] — пять записей блога;
[parcelle:pages:10] — десять страниц;
[parcelle:drafts:all] — все черновики.
Модификатор all на третьей позиции может и отсутствовать: если не указано точное число, значит, все записи.

В содержании все заголовки по умолчанию выводятся как отдельные абзацы. Если на третьей позиции через косую черту указать другой HTML-тэг, то обрамляющим будет именно он:
[parcelle:posts:5/li] — каждый заголовок будет элементом маркированного списка.

Наконец, на этой же третьей позиции через дефис с помощью специального модификатора (d, r, u, s, abc, cba, 123, 321) можно указать, в каком порядке будут выводиться записи: 
[parcelle:posts:10-d] или без модификатора [parcelle:posts:10] — 10 записей в хронологическом порядке (то есть не в обычном для блога порядке, а начиная с ранних записей);
[parcelle:posts:10-d/li] — то же самое, в виде маркированного списка;
[parcelle:posts:10-r] — 10 записей в обычном порядке для блога, от свежих к более старым;
[parcelle:posts:10-u] — 10 записей, отсортированных по дате последнего обновления материала (в этом случае видно, какие записи в последнее время редактировались и обновлялись);
[parcelle:posts:10-s] — 10 случайных записей в произвольном порядке: очень удобно, когда хочется всегда показывать непредсказуемую выборку материалов и почти не повторяться, или создать иллюзию постоянного обновления и богатства материалов блога;
[parcelle:posts:10-abc] — 10 записей по алфавиту;
[parcelle:posts:10-cba] — 10 записей против алфавита;
[parcelle:posts:10-123] — 10 записей, адреса которых отсортированных в алфавитном порядке;
[parcelle:posts:10-321] — 10 записей, адреса которых отсортированных против алфавита.

На четвёртой позиции можно поставить единицу, и в этом случае ссылки на материалы будут снабжены датами. Если оставить пустую позицию или вписать ноль, то даты не будет. Удобно, если даты важны:
[parcelle:posts:5-r:1] — 5 свежих записей с датами публикации.
Если вместо единицы поставить 2, то дата будет выделена цветом, если она сегодняшняя:
[parcelle:posts:5-r:2] — 5 свежих записей с датами публикации, из которых сегодняшяя будет выделена.
Модификатор 3 будет обозначать, что из даты нужно оставить только год; 4 — текущий год будет выделен цветом; 5 — текущий и прошлый год будут выделены разными цветами; 6 — три последних года будут выделены разными цветами.
Такая «подсветка» работает только в теме дизайна Orinoco. В остальных темах, если есть необходимость, можно в CSS указать нужный цвет для классов small-highlight, small-highlight-1 и small-highlight-2.

Все эти списки ссылок являются по своей сути навигационными меню, генерируемыми автоматически. На пятой позиции можно указать, каким образом будет выделен текущий пункт таких меню (то есть ссылка на ту страницу, на которой пользователь находится в данный момент). По умолчанию, если не указать пятую позицию, то она будет равна 1.
1 — ссылка перестаёт быть ссылкой и становится полужирным текстом;
2 — ссылка остаётся обычной ссылкой и приобретает CSS-класс selected;
3 — ссылка становится полужирной и приобретает CSS-класс selected.
Пример:
[parcelle:posts:5-r:1:3] — 5 свежих записей с датами публикации, причём текущий пункт меню со списком ссылок становится полужирным, но остаётся ссылкой.

Кроме этих пяти позиций, есть ещё так называемые опции: их можно указывать после любого количества позиций после вопросительного знака (?) до закрывающей квадратной скобки, и если опций несколько, то они разделяются амперсандом (&); если у опции есть значение, то оно записывается после знака равенства (опция=значение), например:
[parcelle:posts:all-s:1?images&tags&strong&prefix=* ] — все записи блога в случайном порядке с датами, все ссылки полужирные в любом случае, снабжены тэгами (рубриками) и изображениями, если они приложены к постам, а перед каждой ссылкой будет находиться префикс в виде звёздочки с пробелом.
Значения опций:
prefix или pref — префикс, тот текст, что предшествует ссылке (опция со значением);
images или preview — ссылка на запись снабжена иллюстрациями, приложенными к ней;
topic или tags — ссылка на запись снабжена тэгами (темами, рубриками) из этой записи;
bold или strong — ссылки набраны полужирным начертанием;
italic или oblique — ссылки набраны курсивным начертанием.


Списки тэгов и блогов

Списки рубрик, или тем, или тэгов, гораздо проще по своей структуре, но они всё равно могут использоваться как удобное средство навигации. Названия всегда сортируются по алфавиту, и в данный момент этот порядок нельзя изменить.
Здесь может быть четыре позиции, причём третья и четвёртая отведены обрамляющим HTML-тэгам, а первую занимает сама команда parcelle.
[parcelle:tags] выведет список из тэгов как набор абзацев со ссылками;
[parcelle:tags:div] выведет список из тэгов как набор блоков DIV со ссылками (если есть третья позиция, то в ней указано название HTML-тэга, обрамляющего пункт меню);
[parcelle:tags:ol:li] выведет список из тэгов как нумерованный список из пунктов со ссылками (третья позиция занята названием обрамляющего HTML-тэга для всего блока, а четвёртая — HTML-тэга для каждого пункта).

Каждая тема и каждый блог внутри Meruert могут иметь свой URL (фрагмент адреса). Для того, чтобы заменить стандартные tag-1, tag-2, blog-8 на осмысленные названия, нажимайте ссылки редактирования наверху страницы каждой темы. Если часть ваших записей посвящена фотографиям, то снабдите их темой записи «фото», а когда запись сохранится, нажмите на ссылку «фото» и найдите ссылку «ред.» над всеми записями данной темы; нажмите её и в поле редактирования альтернативного адреса (Альтернативный URL) введите, например, текст photo. В этом случае невыразительный адрес site.com/tag-1 для данной темы сменится на «говорящий» site.com/photo. Более того, адреса для тем можно делать иерархически вложенными: photo/portrait для портретных фотографий, photo/still-life для фотонатюрмортов, photo/portrait/monochrome для монохромных фотопортретов, и т.п. Это может пригодится для формирования динамических списков с названиями тем.

[parcelle:blogs] — это список всех блогов в системе;
[parcelle:tags] — это список всех тем записей;
[parcelle:intag-ABC] — это список всех тем записей, вложенных в тему с адресом ABC (то есть если у вас есть темы с адресами ABC/DEF, ABC/XYZ, то именно они будут выведены в списке ссылок);
[parcelle:withtag-ABC] — это список всех тем записей, вложенных в тему с адресом ABC, и ссылка на саму тему с адресом ABC.
Разумеется, в двух последних примерах ABC и прочие алфавитные наборы букв вы замените на ваши осмысленные URL для тем записей.

В следующих версиях Meruert система Parcelle будет улучшаться и дополняться.

Комментарии

Макс: Доброго времени суток!
После долгого исследования КМС на файлах, остановился на Меруерт. Глянул мельком парсели и заглянул в стандартный шаблон Ориноко, там ни одного парселя, все сделано на каких-то специальных тегах, вот мне интересно в шаблоне все теги использованы? Есть ли еще теги? Можно какую-то справку по ним? Или создавать новый шаблон исключительно по парселям? (14 февраля 2016 / 10:06:23)
Доброго!
Парсели — это только дополнительная фукнциональность. На них шаблон нельзя построить.
Прочитайте про шаблоны и темы дизайна в документации: суть в том, что в новых шаблонах можно вообще не писать никакой HTML-код, а создавать только новый CSS, при этом темплейт будет браться из темы по умолчанию самостоятельно.
Ссылка: http://www.meruert.com/handbook/#design
MBTY: Здравствуйте! А есть ли способ вывода в блок последних комментариев пользователей? (1 марта 2016 / 19:00:29)
Хорошая мысль, спасибо.
В одной из следующих версий будет.
MBTY: Не сочтите за требование или флуд, но я тут пилю сайт не для себя. Можно ли ждать такую фишку в пределах месяца или же сроки неизвестны? (1 марта 2016 / 20:08:03)
Сроки неизвестны: у меня этот проект некоммерческий, приоритеты часто совсем другие, и хотя я стараюсь оперативно выпускать обновления и патчи, не всегда это зависит от меня.
В пределах месяца или полутора — вполне обозримые сроки. Следите за новостями.
Макс: Я имел виду больше не шаблон, а сам дизайн сайта, можно корректировать парселями, то есть, в сайдбар воткнуть какой-нибудь парсель и т.п.. Пока самый клевый парсель это [phpcode:name], можно делать что угодно. Да и Меруерт изучил поглубже, очень грамотно все сделано. Заметил пару недоделок, например в записи, если ты вставишь тему, то потом ее удалить с сайте по крайней мере в WEB интерфейсе никак, ну поставил тему так проверить, что это такое, и в сайдбар воткнул список тем, потом решил убрать. Не удаляется никак сама тема в записи, только редактируется. А все это исходило из того что я с парселем [parcelle:children] то ли не разобрался, то ли он не работает, создал две записи поместил их в блог "Город", в блоге "Город" сделал Альтернативный URL "Город", потом надеялся найти парсель, который выводит список ссылок всех записей этого блога (текущего, то есть парсель определил в каком блоге сейчас мы и вывел список всех записей текущего блога), но не нашел такой парсель, нашел парсель:чилдрен, в каждой записи блога город, я изменил альт.УРЛ на "Город/История-города" м "Город/Исторические памятники", ставлю парсель:чилдрен в сайдбар, перехожу в блог "Город", в адресной строке ссылка "шттп://мойдомен.ком/Город/" но в сайдбар пуст, не видит дочерних записей. Прошу добавить парсель который выводит ссылки на все записи текущего блога и будет круто сделать хотя бы один уровень рубрик/категорий/разделов блога и так же парсель к список рубрик текущего блога. (2 марта 2016 / 05:45:23)
1. Да, корректировка темплейта парселями, конечно, это разумно.
2. Удаление темы — не недоделка, а сознательная мера для сохранения целостности; но думаю, для полной поддержки CRUD я сделаю и удаление тем, вы правы.
3. Про children — вероятно, могут быть ошибки с русскоязычными URL, проверю.
4. Все записи текущего блога — [parcelle:posts:all], а если нужен конкретный блог, то [parcelle:blog-1:all] — все эти вещи уже есть.
Макс: 4. Я имел ввиду чтобы парсель чтобы сам определял текущий блог, а не заведомо выбранный блог. Чтобы в сайдбар воткнуть парсель, который отображал список ссылок всех записей текущего блога. (2 марта 2016 / 19:30:11)
Я понял.
Хорошо, сделаю.
Макс: Извините, еще вопрос, можно ли как-то использовать ПХП в шаблоне файла? Именно в шаблоне (3 марта 2016 / 18:23:57)
Да, вставляете в любом месте [phpcode:NAME], вместо NAME — своё название латиницей без пробелов, у вас появляется фрагмент для редактирования PHP-кода, где бы вы ни решили использовать. Это вы знаете. Можно ещё tiles использовать (см. документацию), почти то же самое, но без прямой правки кода.
Макс: Доброго времени суток.
У меня снова вопросы, как через ПХП узнать выбранный(текущий) язык сайта?
И как через ПХП узнать, что клиент залогинен? То есть, чтобы панель Менеджмент отображалась только админу? (6 марта 2016 / 22:07:40)
1) Текущий язык возвращает функция specifyLang()
2) На авторизованность проверяем так: if( defined('manage') ) { ... }
Макс: Такая ситуация. Главную страницу делаю отдельной, но хочу на ней отобразить последние пару новостей. Сначала особо не парился подгружал их через simple_html_dom.php (file_get_html). все работало дот тех пор пока не добавил во второй язык, и тут я понял, что нужно прикреплять в запросу file_get_html куки пользователя, чтобы грузились новости выбранного пользователем языка. Может есть какая-нибудь функция где можно прямым запросом получить страницу выбранного языка, что-то типа:

file_get_html('http://site.ru/blog/?ajax&lang=ru');

Не очень хочется грузить куки пользователя.

Еще проблема когда создаешь дополнительный блог, то у него Название только на одном языке, например блог "О городе" будет и на английской версии сайта и на русской с таким названием. Потом через тайл каждому блогу начал давать название подбирая название. Вот так:

if(specifyLang()=='ru')
{
$t = 'Новости';
}
else
{
$t = 'News';
}

Блогам же даю пустые имена, чтобы в заголовке блога не было два названия, но когда создаешь новый пост, то трудно выбрать к какому блогу будет принадлежать пост, в списке блогов, получается пустые пункты. (7 марта 2016 / 22:08:24)
1) Можно главную страницу оставить просто блогом, но убрать пагинацию в настройках и оставить 2 последние записи. А остальные новости давать содержанием парселем. Но если нужно именно язык получить, то функция specifyLang() учитывает и куки, и настройки.

2) Если вам нужен мультиязычный блог, то делайте так: заведите в папке Meruert папку langs-custom, в ней файл ru.php для русского языка и т.п., и там пишите термины с переводами по аналогии с файлами в папке langs:
English term = Русский перевод
А сам термин везде оставляйте английским в двойных квадратных скобках.
Макс: "Но если нужно именно язык получить, то функция specifyLang() учитывает и куки, и настройки."
Все верно specifyLang() учитывает и куки и настройки пользователя, но я загружаю страницу через
file_get_html('http://site.ru/blog/?ajax'); Понимаете? Когда я так загружаю страницу то используется куки сервера. То есть язык будет тот, который был выбран в настройках по умолчанию.
Вот допустим ситуация на сайте два языка: Рус. и Англ. По умолчанию стоит Рус. Пользователь зашел на сайт, видит сайт на русском, переключил на Англ. Весь сайт перевелся, кроме как на главной две последних новости, которые подгружены через file_get_html('http://site.ru/blog/?ajax'); Эти две новости загружены на русском, так как были загружены с сервера, а на сервере по умолчанию стоит Рус. Вот я и думаю может быть есть функция или как-то в параметр передать в запросе, чтобы игнорируя куки можно было получать новости на нужном языке. Например так:
file_get_html('http://site.ru/blog/?ajax&lang=ru');
И еще когда в настройках Переключатели языков: Выбираешь два языка, то обязательно в сайдбар ставится "родной" переключатель. Не всегда он нужен, в смысле иногда она не совпадает со стилем сайта. И приходится этому переключателю ставить display: none, и ставить свой переключатель.

"заведите в папке Meruert папку langs-custom, в ней файл ru.php для русского языка и т.п., и там пишите термины с переводами по аналогии с файлами в папке langs"
А вот это круто, позже попробую, а то я столько костылей сделал, всё меню сделал тайлом (8 марта 2016 / 06:25:21)
file_get_html и делать запрос по http к своему же серверу — это очень нетривиально.
мне кажется, тут стоит искать другие пути.
со временем я сделаю так, чтобы можно было любой фрагмент данных где угодно грузить, а в качестве альтернативной временной меры могу предложить делать блоги с адресами /en/, '/ru/', '/kz/', включать их напрямую и в них публиковать данные на нужном языке.
Макс: Еще вопросик)))
Реально ли сделать, при переключении языка на другой язык, делать редирект на страницу того же поста только на выбранном языке. Например:
Я делаю статичную страницу на русском "О ГОРОДЕ", выбираю ей язык "русский". Потом создаю новую статичную страничку перевожу страницу на английский даю название "ABOUT CITY" выбираю ей язык "английский". Как сделать чтобы эти странички при переключении языка редиректили друг на друга? (9 марта 2016 / 20:16:20)
Пока это возможно, только если адрес страницы один и тот же.
Но подобные замыслы в проекте, вероятно, скоро сделаю.
Макс: Доброго времени суток.
Вот накопились вопросы:
1) Можно ли как-то изменить форму ввода постов(редактор)? Очень неудобный редактор, как-то не понятно форматирует по "р" блокам. Если картинку на сайт загружать с компьютера, то в ней по клику, есть "Просмотр", а если грузить, с какого-нибудь хостинга картинок, то она вставляется без этого. еще блок "post" заваливается на комментарии, если в записи много картинок, то есть высота блога игнорирует картинки в записи. (http://kazpic.kz/images/2016/03/17/123123123.jpg)
2) РСС-ленту бы с выбором языка записей
3) Можно инфы по коду в самом низу шаблона (http://kazpic.kz/images/2016/03/17/123123123wmKe.jpg)









Что тут можно сделать?

5) Заметил что парсели ПШПСОДЫ, остаются в "системе", то есть если я когда-то создам, парсель [phpcode:test], то я его никак не удалю. Где они хранятся? Чтобы почистить сайт (17 марта 2016 / 19:11:36)
dieug: замечено:
в одном блоке пишу

parcelle:titles:5-s
parcelle:titles:5-r

первый парсель отсортировывает титлы рендомом.
второй парсель отсортировывает титлы рендомом.
разношу парсели по разным блокам.
если грузится страница с обоими парселями, то все титлы всех парселей - рендомом.
перехожу на страницу, где только второй парсель - сортировка второго парселя - как надо. (21 ноября 2016 / 03:47:23)