Вынесенная в заголовок задача не столь уж редко встает перед джумловодами. То свой текст нужно добавить, то изменить корявый или неинформативный (и зачастую еще - изобилующий ошибками) текст, составленный разрабами сторонних расширений. В Менеджере языков административного раздела сайта имеется достаточно вразумительный интерфейс для переопределения констант (Решение 2), и им, в принципе, можно бы и ограничиться. Но если вам, как и мне, интересно разобраться досконально в языковой структуре Joomla, то эта статья для вас.

В статье о замене устаревшей капчи компонента JComments на reCAPTCHA v2 (NO CAPTCHA) от Google описаны изменения в коде компонента. При этом, поскольку ввод новой капчи не требует вводить буквенно-цифровой код с картинки, потребовалось также заменить сообщение об ошибке. Оригинальное сообщение для русского языка загружалось из языкового файла компонента посредством константы:

ERROR_CAPTCHA="Пожалуйста, введите код изображенный на картинке!"

Новый текст, в полном соответствии с гугловским, должен быть таким: "Пожалуйста, подтвердите, что вы не робот!".

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

Решение 1. На уровне шаблона

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

ya ne robot ya robert

Небольшая предыстория. Я изначально использовал родную капчу компонента JComments - kcaptcha. В какой-то момент отключил ее, поскольку она раздражала комментаторов. Тут же в комментарии посыпался спам в гигантских количествах. Начал использовать CleanTalk - символически платный ($9 в год) плагин, защищающий от спамботов не только комментарии, но и вход/регистрацию, контакты и формы многих сторонних расширений. Спам было прекратился, но в последнее время эти гады настрополились слать мусорные комментарии, по форме маскирующиеся под нормальные и даже включающие в тексте заголовки статей. Их CleanTalk пока отфильтровать не может. Подобных "комментариев" стало приходить по 4-5 в день - не очень критично, да и убивать их легко прямо из уведомлений в почте. Но все же захотелось найти компромиссное решение проблемы - капчу, блокирующую не отлавливаемый CleanTalk-ом спам, но в то же время не раздражающую потенциальных комментаторов.

NO CAPTCHA reCAPTCHA от Гугла (или просто reCAPTCHA v2.0) подходит идеально. Начиная с Joomla 3.4, вторая версия включена в плагин reCAPTCHA, поставляемый с CMS. На время написания прошло почти два года с того релиза, а разрабы JComments так и не озаботились добавить поддержку этого плагина в свой компонент. Это никак не умаляет его достоинств - JComments был и остается лучшим бесплатным решением для комментариев на Джумла-сайте. Тем более что встроить сабж в комментарии достаточно просто своими силами. Для этого вам предстоит выполнить ряд несложных действий.

Во вступлении к статье о фильтрации контента по материалам, категориям и компонентам я упомянул, что для избирательной привязки модуля последних комментариев требуется создавать некоторое количество его копий. На сайте, достаточно разветвленном по структуре и тематике, а особенно - в случае многоязычности, это количество может исчисляться десятками. Каждая копия имеет свои настройки, устанавливаемые в менеджере модулей. Если нужно изменить какие-либо параметры во всех или даже нескольких копиях модуля, предстоит кропотливая и нудная работа в админке сайта - открывать страницу каждой копии и вручную вносить изменения. Можно, конечно, объединять комментарии к нескольким смежным темам в один общий модуль, но не лучше ли найти гибкое решение, позволяющее и рыбку съесть - четко отфильтровать комменты к каждой теме или даже подтеме, и манту не замочить - свести количество копий модуля к минимуму, а то и к одной-единственной. Я, как мне кажется, таковое решение нашел, и помогло мне в этом знание структуры внутренних ссылок страниц приложений, формируемых движком Джумлы.

Как известно, модули Joomla привязываются к пунктам меню. В случае mod_jcomments_latest введена также привязка к компонентам. Есть еще и дополнительная фильтрация по категориям, но лишь для случая, когда в списке компонентов выбран ТОЛЬКО com_content. Соответственно, нужны отдельные копии модуля для каждой категории основного компонента Joomla, а также для каждого дополнительного приложения. В пределах копии можно объединять категории com_content или несколько компонентов. Нет возможности объединить, например, комментарии к категориям и комментарии к приложениям, отличным от com_content, в один блок. Мой метод позволяет в пределах блока фильтровать комментарии к категориям и отдельным материалам приложения com_content и одновременно - к другим компонентам и их структурным элементам. Подробно и с примерами объясню принцип такой гибкой фильтрации.

Upd: English version of the article: Post an illustrated Joomla-site article on Facebook using OG-tags.


Некоторое время назад я написал цикл статей о внедрении кнопок социальных медиа в сайт на Joomla 2.5. Перейдя на 3.x (на момент написания этот сайт работает под 3.4.4), я продолжал держать на страницах статей кнопки от share42, интегрированные по той же методике, и до определенного времени их функционал работал на ура. Однако с некоторых пор начались определенные глюки при расшаривании статей в некоторых соцсетях. В частности, раньше при попытке поделиться в Facebook давалась возможность выбрать одну из картинок, имеющихся на странице. Теперь же такая опция пропала, картинка выбиралась самим скриптом Фейсбука, причем отфонарно. Пришлось разобраться, что изменилось в политике Закерберга, и под эти изменения подстроиться. Результатам этого исследования данная статья и посвящена.

Но прежде всего я обновил скрипт от share42 и обнаружил, что он теперь датируется маем 2014-го. Я на тот момент использовал версию от октября 2013-го. Заменил скрипт на более свежий, но проблема осталась. Найдя в коде событие клика по кнопке FB, открывающее окно "Поделиться", обнаружил, что вызывается сервис sharer.php. Перед его вызовом формируется строка запроса, состоящая из нескольких параметров: url, title, summary (description) и массив images[]. Последний параметр-массив и формировал выбор картинок в диалоге.

С некоторых пор Facebook изменил набор параметров sharer.php. Собственно, все кроме ссылки на расшариваемую страницу были попросту уволены. Нынешний вид обработки события клика по кнопке должен выглядеть так:

Upd: English version of the article: Joomla: Content filtering by articles, categories and components.


В статьях о привязке соцкнопок и хлебных крошек к определенным страницам Joomla-сайта рассматривалась фильтрация только по материалам. Единственное исключение - во второй из них было также указано, как скрыть навигатор на странице избранных материалов. Но что если нужно привязать модуль либо другое расширение, а в общем случае - любой кусок кода к выбранным категориям, компонентам, определенным страницам компонентов, а то и ко всему перечисленному одновременно? Вы скажете, что модули и так привязываются к пунктам меню, а при использовании более продвинутого менеджера модулей (например, Advanced Module Manager) - и к категориям, статьям, пользователям, компонентам и т. д. Это так; но, чтобы выводить модуль с разными настройками вывода на соответствующих страницах, придется создать несколько его копий, привязанных к этим страницам. Например, на этом сайте модуль последних комментариев выводит список комментариев к материалам тех категорий и компонентов, на странице которых он высвечивается. Поскольку структура сайта достаточно разветвленная, да к тому же он еще и мультиязычный, количество копий модуля - целых 8 (восемь!) только для русской части сайта. Неудобно.

Предлагаемое решение обеспечит гибкость и контекстность вывода контента по заданным критериям. Знание кода желательно, но я постараюсь дать точные рекомендации по его внедрению, что позволит и менее квалифицированным джумловодам его использовать при условии точного выполнения процедуры. К тому же, я попытался в отдельной статье подробно описать структуру внутренних ссылок сайта на Joomla, что призвано облегчить понимание алгоритма. Ну что, по коням?

Upd: English version of the article: The structure of internal links within Joomla site.


За последнее время я написал и внедрил несколько функций, позволяющих фильтровать вывод страниц сайта, работающего на CMS Joomla версии 2.5 и новее. Перед тем, как поделиться ими с общественностью, затрону тему, вынесенную в заголовок этой статьи, поскольку понимание принципа формирования внутренних ссылок на страницы джумловских приложений поможет лучше разобраться в их алгоритмах.

Немного теории

Приложения для CMS Joomla разрабатываются в виде компонентов. Компоненты отвечают за вывод страниц сайта. Ссылка на каждую страницу генерируется в соответствующем компоненте в стандартном формате URI:

http://[имя сайта]/index.php?[строка запроса]

Строка запроса (query string) представляет из себя последовательность пар ключ=значение, разделенных амперсандом. Значения ключей и определяют вывод каждой страницы. URI страниц генерируются в соответствии со структурой компонента. Нас сейчас интересует не механизм формирования ссылок, а результат для каждой страницы или групп страниц конкретного приложения. Зная, как идентифицировать ключи и их значения, можно гибко манипулировать выводом контента.

Upd: English version of the article: Using of menu item aliases in Joomla.


В предыдущей статье я описал процесс переноса информационного наполнения сайта-источника на сайт-приемник и интегрирования его в виде отдельного раздела в структуру сайта-приемника. Компонент J2XML справился с этой задачей хорошо. Поставить ему оценку "отлично" не позволил тот факт, что, как отмечалось в конце статьи, его функционал не включает перенос и интеграцию структуры меню. Впрочем, воспроизвести ее на сайте-приемнике вручную не заняло много времени. А вот когда я начал привязывать пункты к соответствующим элементам контента, то столкнулся с некоей проблемой. Именно в процессе ее решения я впервые в своей практике познакомился с опцией, вынесенной в заголовок данной статьи.

Опишу задачу. На сайте-источнике было несколько меню. На сайте-приемнике нужно поместить их в том же виде - отдельными модулями, но, поскольку новый контент должен по задумке стать отдельным разделом, в URL и хлебных крошках все подразделы должны содержать название и алиас раздела. Меню же, соответствующие подразделам, при этом должны быть первого уровня. Однако, если выполняется второе условие, то не выполняется первое. Вот тут и помогла опция выбора типа пункта меню как псевдонима другого пункта.

Логика возникновения проблемы станет ясной, когда я проиллюстрирую ее конкретным примером. Для пущей наглядности заменю узкую тематику моего сайта-источника более популярной, а именно - автомобилями. Надеюсь, читатели, относящиеся к прекрасному полу, простят меня за тему, более типичную для интересов пола сильного )).

Upd: English version of the article: Joomla: Merge two sites into one using component J2XML.


Не так давно я имел помимо данного сайта еще один. По некоторым причинам решил присоединить второй сайт к этому в качестве отдельного раздела. При этом тот другой сайт появился даже раньше этого и имел несколько сотен статей, разделенных на полтора десятка категорий, а также полсотни зарегистрированных пользователей. На этом сайте к тому времени информации было не меньше. Задача: перенести наполнение сайта на другой так, чтобы создать объединенную структуру.

Нашелся отличный компонент J2XML, заточенный именно под подобную задачу. Он бесплатный, имеет гибкие настройки. Экспортирует связанную структуру материалов, категорий и пользователей с сайта-донора и интегрирует ее в структуру сайта-акцептора. До комплекта переносит еще и картинки в статьях, а также ссылки (WebLinks). Перенос, как следует из названия, осуществляется через XML-файлы. Детальному рассмотрению настроек и функционала компонента J2XML и посвящена эта статья.

Upd: English version of the article: Photoshop: Processing photos of paintings for online gallery.


Как я уже отмечал в статье о редактировании анимированных GIF-ов, я никак не являюсь экспертом по Фотошопу. Однако, изучив некоторые сценарии обработки изображений, с успехом их использую. К примеру, когда открыл здесь на сайте галереи двух не чужих мне юных художников, то озаботился методом, вынесенным в заголовок статьи. Опишу задачу нагляднее.

Дано: фотография картины. В своем первозданном виде она никак не годится для выкладывания:

ogri.me | Photoshop: Обработка снимков картин для online-галереи #01

Ожидаемый результат:

ogri.me | Photoshop: Обработка снимков картин для online-галереи #02

Последовательность действий по превращению первого во второе и вынесена на повестку сегодняшнего дня.

Upd: English version of the article: Custom 404 error page in Joomla 2.5.


Тема, вынесенная в заголовок статьи, вроде бы описана и обсуждена в сети множество раз. И тем не менее, как это зачастую бывает, информация в каждом источнике неполна. Общая картина складывается из разрозненных сведений, а некоторые частные глюки, с которыми мне пришлось столкнуться, не освещены вообще, - по крайней мере, я такового освещения не нашел и придумал свое решение. Поэтому цель данной статьи (как и всех прочих) - собрать воедино инфу из инета, структурировать, дополнить собственным опытом и передать на суд сетевой общественности.

Upd: English version of the article: Joomla 2.5: Remove breadcrumbs from specific pages.


Хлебные крошки (breadcrumbs), известные также как навигатор сайта, - полезный модуль Joomla. И, как всякий модуль, они могут привязываться ко всем или только определенным пунктам меню. Также можно отвязать их от всех или конкретных пунктов. Многие джумловоды желают скрыть навигатор на главной странице сайта, поскольку на ней он содержит только пункт "Главная" | "Home", к тому же без линка, не неся таким образом ни смысловой, ни функциональной нагрузки. Возможно, структура сайта предусматривает и другие страницы, на которых по тем или иным причинам есть смысл скрывать навигатор. Самым типичным примером является кастомная страница ошибки 404, которая, как я отмечаю в соответствующей статье, посвященной правилам ее создания и настройки, должна быть вписана в шаблон сайта, но при этом стоять как бы особняком. Навигатор на ней не только не нужен, но еще и идеологически вреден. Будем рассматривать именно эту страницу как частный случай, описывающий общий принцип отвязки хлебных крошек от определенного материала.