31мая,
2010
Когда делается сайт, всегда есть какие-то мелкие вещи, которые одинаковые на всех страницах, например, небольшой блок контактной информации внизу сайта, фразы и названия кнопок, текст кнопки выхода из системы, сменный фон на страницах, единый для всего сайта.
Самый простой вариант: Забить их жёстко и не давать менеджеру сайта возможность их редактировать.
И другой вариант: Все необходимое собрать в одном документе, вписать в TV-параметры и вызывать в нужным местах.
Выглядит это примерно так:
Делается шаблон Settings (можно его оставить пустым), cоздаётся документ в дереве сайта, тоже Settings (Я так его называю, чтобы сразу было понятно, что и для чего он), отключается отображение в меню, тогда не вылезет нигде в меню, присваивается шаблон, описанный выше, этому шаблону назначаются все необходимые TV-параметры. Их можно заполнить заранее или потом.
А в шаблоне любой страницы сайта пишется вызов Ditto, где будет, например, блок контактной информации:
[[Ditto? &documents=`20` &tpl=`settings`]]
Кэшируемый вызов Ditto, из документа Settings, у которого, ID-номер, например, 20, вызывается всё необходимое, tpl — шаблон для вывода на страницах сайта.
Шаблон вывода может выглядеть так:
<div>
<h3>[+longtitle+]</h3>
<p>[+introtext+]</p>
</div>
Заголовок для блока берётся из поля Longtitle, а сама контактная информация из Introtext-а. Достаточно заполнить их только в документе Settings, и они будут везде отображаться одинаково. И у клиента будет возможность самостоятельно их поменять, не придётся копаться, ни в чанках, ни в TV-параметрах или просить разработчика это сделать.
Это увеличивает немного нагрузку на базу и на систему в целом, но не критично, зато сильно облегчает жизнь менеджерам сайта и разработчикам и очень просто делается.
1мая,
2010
Как оказалось, AjaxSearch нигде и ничего не ищет, когда системные поля Modx-а YAMS заменяет на TV-параметры.
На официальном форуме предлагается решение в подробностях, которое у меня так и не заработало. Всё это делалось на версии Modx Evolution 1.0.3.
А нашлось оно совершенно случайно (как обычно, впрочем). Надо было поставить чуть постарше версию AjaxSearch-a.
А именно версию 1.8.4. Она лежит в Previous Releases AjaxSearch-a.
Либо вот прямая ссылка на неё.
Как выглядит сам вызов:
На всех страницах сайта (ну, или на тех, где поле для поиска нужно) разместить вызов сниппета:
[!AjaxSearch? &parents=`0` &mbstring=`0` &AS_landing=`25` &addJscript=`0` &extract=`0` &AS_showResults=`0` &ajaxSearch=`0` &language=`(yams_mname)` &withTvs=`+:pagetitle_en,longtitle_en,introtext_en,description_en,content_en,pagetitle_ru,longtitle_ru,introtext_ru,description_ru,content_ru` &tplLayout=`search_tpl`!]
mbstring я отключаю сразу, оно у меня не работает. Поиск без перезагрузки я не проверял, он не нужен мне в 99%, а то и во всех 100% случаев, вроде как он всё равно корректно не работает. Ну, а дальше, собственно, куда будет выводиться результат поиска, на каком языке будет всё описание и, то, по каким полям AjaxSearch будет искать. Ну и сами TV-параметры, которые создаёт YAMS и не находит AJAxSearch.
Шаблон формы поиска стандартный:
[+as.showForm:is=`1`:then=`
<form [+as.formId+] action=[+as.formAction+]«„ method=“post»>
<fieldset>
<input type="hidden" name="advSearch" value=[+as.advSearch+]«„ />
<label for=“ajaxSearch_input»>
<input id="ajaxSearch_input" type="text" name="search" value=[+as.inputValue+]«[+as.inputOptions+]„ />
</label>
<label for=“ajaxSearch_submit»>
<input id="ajaxSearch_submit" type="image" src=[(site_url)]«images/search.gif» name="sub" value=[+as.submitText+]«« />
</label>
</fieldset>
</form>
`+]
[+as.showIntro:is=`1`:then=`
<p id="ajaxSearch_intro">[+as.introMessage+]</p>
`+]
[+as.showResults:is=`1`:then=`
[+as.results+]
`+]
Страница вывода результатов:
[!AjaxSearch? &mbstring=`0` &AS_showResults=`1` &ajaxSearch=`0`, &AS_landing=`25`, &AS_showForm=`0` &language=`(yams_mname)` &withTvs=`+:pagetitle_en,longtitle_en,introtext_en,description_en,content_en,pagetitle_ru,longtitle_ru,introtext_ru,description_ru,content_ru` &tplResult=`searchresult_`!]
Шаблон вывода результатов:
<a href=»(yams_doc:[+as.id+])» title=[[YAMS? &get=`content` &from=`pagetitle` &docid=`[+as.id+]«`]]»>[[YAMS? &get=`content` &from=`pagetitle` &docid=`[+as.id+]`]]</a>
[+as.descriptionShow:is=`1`:then=`
<span>[+as.description+]</span>
`+]
[+as.extractShow:is=`1`:then=`
<div><p>[+as.extract+]</p></div>
`+]
[+as.breadcrumbsShow:is=`1`:then=`
<span>[+as.breadcrumbs+]</span>
`+]
Тут стоит обратить внимание, что вызовы плейсхолдеров AjaxSearch-а заменяются на вызовы сниппета YAMS.
Чтобы ссылка работала верно, она обязательно должна быть заменена на (yams_doc:[+as.id+])
Ну, а показать title или заголовок, то надо вызывать сниппет YAMS:
[[YAMS? &get=`content` &from=`pagetitle` &docid=`[+as.id+]`]]
Такой поиск работает корректно, ищет и находит и правильно ссылается на страницы из результатов поиска.
28апреля,
2010
YAMS — Yet Another Multilingual Solution — служит для создания многоязычных сайтов на базе Modx CMS.
Поиск по сайтам связанным с настройкой и работой с Modx уcпехом не увенчался. Вообще, никакой поиск успехом не увенчался, когда потребовалась информация на русском языке.
Пришлось разбираться с английской документацией и методом проб и ошибок делать проект.
Полностью переводить документацию не буду, расскажу в общих чертах, как его запустить и заставить работать.
Устанавливался YAMS на версию Modx Evolution 1.0.3, которая уже в дистрибутиве имеет предустановленный ManagerManager последней версии, без него YAMS просто не получится использовать.
Установка:
Надо скачать архив последней версии. Там что-то непонятное с версиями. Последняя версия почему-то не лежит на странице для скачки, а в списке Previous Releases, потому прямая ссылка на версию 1.1.7-alpha RC7, она пока последняя.
Распаковать архив и залить в папку assets/modules/yams, выставить права на папку yams 775.
Подключение модуля, плагина и сниппета:
Код модуля:
require_once ( $modx->config['base_path'] . 'assets/modules/yams/yams.module.inc.php' );
— Создать в администрационной части в разделе «Модули» новый модуль YAMS.
Описание: Yet Another Multilingual Solution Module
— Создать в администрационной части в разделе «Плагины» новый плагин YAMS.
Описание: Yet Another Multilingual Solution Plugin
Код плагина:
require ( $modx->config['base_path'] . 'assets/modules/yams/yams.plugin.inc.php');
В системных событиях плагина поставить галочки на:
OnLoadWebDocument
OnParseDocument
OnWebPageInit
OnWebPagePrerender
OnLoadWebPageCache
OnPageNotFound
OnBeforeDocFormSave
— Создать в администрационной части в разделе «Сниппеты» новый сниппет YAMS.
Описание: Yet Another Multilingual Solution Snippet
Код сниппета:
<?php
require ( $modx->config['base_path'] . 'assets/modules/yams/yams.snippet.inc.php' );
?>
После перезагрузить страницу, чтобы модуль заработал.
Настройка ManagerManager:
Независимо от того, что используется, в файле с правилами или чанке с правилами в конце надо прописать:
require ( $modx->config['base_path'] . 'assets/modules/yams/yams.mm_rules.inc.php' );
Собственно, YAMS готов к работе.
В «Инструментах» > «Конфигурации» включить Дружественные URL, разрешить вложенные URL, также использовать в связке с предыдущим параметром повторяющиеся псевдонимы, тогда путь до документа в адресной строке будет выглядеть:
site.com/en/catalogue/home-video
site.com/ru/catalogue/home-video
Настройка:
Во вкладке «Модули» > «YAMS» лежат все настройки.
Настройка языков:

Собственно, исчерпывающая страница, на которой показаны языки и как их добавлять. Теги, названия для отображения в самом же языке, в других языка, выбор письма справа налево или наоборот, теги (нужны для вызовов сниппета YAMS, обозначение, группы), системное название языка, имя сервера система подставляет автоматически. Set Default — поставить язык по умолчанию, чтобы с него открывался сайт.
Дальше идёт настройка сервера, после того, как созданы все необходимые языки, YAMS создаёт правила, которые надо вписать в .htaccess, чтобы правильно работали пути и редиректы.
Это находится на следующей вкладке:

Всё содержимое из этой вкладки просто скопировать в .htaccess
Другие настройки:

Эта вкладка содержит множество настроек будущего сайта. Такие, как типы редиректов, находится ли сайт в поддиректории или в корневой папке, разбивать ли языки при редактировании документов на табы, либо пускать списком на одной странице. По умолчанию сейчас стоит разбивка на табы, это и удобней, редиректы выставлены тоже по умолчанию нормально.
Последняя вкладка: Multilingual Templates
Нужна для того, чтобы YAMS перекраивал панель редактирования под многоязычный сайт.
YAMS заменяет стандартные поля Pagetitle, Longtitle, Content итд TV-параметрами с окончанием _ru, _en итд, то бишь, чтобы Pagetitle страницы был привязан именно к языку и полное название TV-параметра тогда выглядит pagetitle_ru.
Как только создаётся новый шаблон, во вкладке Multilingual Templates надо ему присвоить статус многоязычного.
Также можно создавать новые TV-параметры с нужным окончанием, они автоматически будут переноситься в соответствующий таб языков.
Не рекомендуется, даже больше, нельзя убирать поле Internal Name, оно нужно для отображения названия документа в дереве слева.
Создание шаблона:
Стандартный шаблон без дополнительных вызовов других сниппетов. YAMS автоматически определяет такие поля, как [*pagetitle*], [*longtitle*], [*content*]. То есть, достаточно вставить их в шаблон, сделать во вкладке Multilingual Templates шаблон многоязычным и при редактировании документа заполнить эти поля для каждого языка, при переключении языков на сайте, они будут меняться.
Механизм переключения языков:
Создаётся, например, чанк Languages, ставится в нужном месте в шаблоне и в чанк записывается:
[[YAMS? &get=`repeat` &repeattpl=`lang_tpl` ¤ttpl=`current_lang_tpl`]]
&repeattpl=`lang_tpl` — шаблон кнопки языка
¤ttpl=`current_lang_tpl` — шаблон кнопки текущего языка
Шаблон lang_tpl выглядит, например, вот так:
<a href="(yams_docr)">(yams_name)</a>
(yams_docr) — ссылка, сгенерированная до текущей страницы в этом или остальных языках
(yams_name) — имя языка, вписанное в табе Модули > Yams > Language Settings
¤ttpl — шаблон выбранного языка. Тоже самое, только можно добавить class="selected", ну, или что по вкусу, чтобы язык был виден, как текущий.
Точно таким же образом можно подставить и флажки вместо текста.
Wayfinder и YAMS
Вызов Wayfinder— a:
[[Wayfinder? &startId=`0` &useWeblinkUrl=`true` &rowTpl=`menu_tpl`]]
YAMS-у требуется, чтобы параметр &useWeblinkUrl был включён.
Чтобы Wayfinder правильно генерировал ссылки, всё в шаблоне работает через сниппет YAMS.
Шаблон одной кнопки — menu_tpl:
<li[+wf.id+][+wf.classes+]><a href="(yams_doc:[+wf.docid+])" [+wf.attributes+]>[[YAMS? &get=`content` &docid=`[+wf.docid+]` &from=`pagetitle`]]</a>[+wf.wrapper+]</li>
Ditto и YAMS:
С Ditto обстоит намного сложней, но без него никуда.
К вызову Ditto нужно подключать расширение:
&extenders=`@FILE assets/modules/yams/yams.extender.inc.php`
Если вызов некэшируемый [!Ditto!], то в параметрах вызова надо указывать id и язык:
&id=`(yams_id)` &language=`(yams_mname)`
А в шаблоне плейсхолдеры указываются тогда так:
[+(yams_id)_pagetitle+].
Если вызов кэшируемый [[Ditto]], то автор предлагает поместить в каждый язык по вызову Ditto, также в вызове прописать &id=`id` &language=`имя языка`.
И третий способ по пути наименьшего сопротивления, расширение подключать не нужно, в вызове Ditto чанк с шаблоном имеет окончание соответствующее языку:
[[Ditto? &tpl=`news_(yams_id)`]]
Существует два чанка news_ru, news_en. В зависимости от того, какой язык текущий, параметр (yams_id) подменяется обозначением языка.
А в самих чанках:
<h1>[+introtext_ru+]</h1><p>[+content_ru+]</p>
Это прямой вызов TV-параметров, заменивших встроенные поля.
Неудобен этот способ тем, что нужно создавать большое количество чанков, но работает без осечек, с некоторыми сниппетами, например, eForm-ом иначе и не получится.
Это общая информация, не вдаваясь в мелкие детали, чтобы собрать мультиязычный сайт её вполне достаточно.
Сначала пришлось набить шишек и довольно много с ним помучиться, тем более, что версии постарше не работали так, как нужно, но после нескольких осечек, уже проще разобраться, как работает YAMS и использовать его совершенно не проблематично.
21февраля,
2009
Уверен, что я не первооткрыватель, но всё же.
Есть готовый сниппет галереи — Maxigallery, но на мой взгляд он чересчур далёк от нормальной галереи.
Потому для вывода изображений я использую Ditto. Как оказалось, создать удобный шаблон, куда выводить уменьшенный вариант и вешать линк на полный размер при помощи Ditto очень просто. Если нет желания готовить маленькие версии картинок, то тут DirectResize в помощь, он делает это автоматически.
Собственно, о самом выводе.
Делаем в админке новый документ-контейнер «Gallery», где будут лежать все изображения галереи. Контейнер, потому что каждая фотография будет, как подраздел.
Задаём контейнеру необходимый шаблон, в шаблон же пишем вывод Ditto:
[!Ditto? &startID=`1` &tpl=`gallery_chunk` &sortBy=`menuindex`!]
Теперь пояснения:
&startID=`1` — это ID-номер контейнера, из которого будут браться вложенные документы для формирования галереи.
&tpl=`gallery_chunk` — шаблон (чанк) вывода предпросмотра и ссылки на полное изображение. Как его сделать, будет описано ниже.
&sortBy=`menuindex` — сортировать документы по порядковому номеру в меню. Выбрал именно этот вариант, потому что по дате не устраивает, а писать отдельные tv-параметры не вижу смысла, если уже при создании документа можно задать порядковый номер. Также можно ещё прописать &sortDir=`ASC или DESC`. ASC — по возрастанию DESC — по убыванию. По умолчанию DESC.
Чанк вывода «gallery_chunk»:
Он достаточно маленький. Для начала создадим два tv-параметра: [*image_preview*] и [*big_image*], на самом деле, называть можно, как угодно, главное вывести их в чанк «gallery_chunk». Задаём обоим «тип ввода» — Image и ставим галочку на тот шаблон, для которого хотим, чтобы они были доступны, сейчас это шаблон «gallery».
Затем делаем новый чанк, называем его «gallery_chunk». В него пишем:
<a href=[+big_image+]«„ rel=“lightbox» title=[+title+]"">
<img src=[+image_preview+]"" alt=[+title+]"" />
</a>
Вот и весь чанк для вывода одной картинки с подгрузкой уменьшенного изображения.
Пояснения:
подстановщики в Ditto пишутся не со *, а с +, но сути это не меняет, конечно.
href=[+big_image+]«„ — ссылка на большое изображение.
rel=“lightbox» — я любитель подключать для просмотра картинок lightbox, в ModX он есть предустановленный, можно вызывать его иначе, но я верстаю макеты, учитывая сразу его наличие.
title=[+title+]"" и alt=[+title+]"" — можно взять любое поле, заполняемое при создании очередной фотографии, title — для lightbox-а, а alt по стандарту и поясняющий текст к картинке.
src=[+image_preview+]"" — это, собственно, сама маленькая картинка.
Теперь заходим в админку и в документе «Gallery» создаём дочерний документ, назначаем ему шаблон gallery, потому что именно к нему привязаны эти два tv-параметра, при помощи которых будут выводиться изображения. Вписываем заголовок. Под текстовым полем появились ещё два поля для подгрузки картинок, загружаем маленькую картинку и большую. После сохранения уже работает.
P.S. Когда залогинены в системе, не пытайтесь смотреть работу лайтбокса через этот же браузер, скрипты блокированы. Откройте в другом браузере, либо скиньте логины.
P.P.S. Если использовать для этих целей DirectResize, то изображения грузятся прямо в поле основного содержимого документа, и маленькое изображение генерируется автоматически, отпадает надобность в дополнительных tv-параметрах.