Главная > Решение проблем, Сайт > Сайт на e107. Ковыляем на костылях. Часть вторая

Сайт на e107. Ковыляем на костылях. Часть вторая

Я обещал в прошлый раз, что расскажу свою методику подпирания костылями перевода и кеша e107, а также о реализации меню категорий. У меня есть желание начать с последнего, в своё время это был первый остро стоящий вопрос.

Традиционно, целевая аудитория читает текст, нецелевая - смотрит симпатичного котика в конце статьи. Поехали.

Меню категорий новостей в e107

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

Плагин там был далеко не всегда, и на панацею он не тянет, так как всё, что он делает - это простая выборка из таблицы категорий. Это открывает, с одной стороны, простор для творчества - вы можете начать с исправления корявой разметки и закончить созданием более человечного оформления этого меню. С другой стороны, не стоит заниматься хернёй.

Текущая версия e107 позволяет сгенерировать из категорий так называемые "Ссылки сайта" - блок ссылок, которые можно вывести в одно или несколько локаций разметки темы. Инструмент несколько несуразный, хотя пользоваться им просто, и в итоге можно заполучить весьма гибкое и нарядное меню категорий новостей.

Идем в "Настройки - Ссылки сайта". Создаем новую ссылку, абсолютно всё равно, какой у неё будет текст и на что она будет ссылаться - мы будем использовать её как заглушку для Генератора подменю. Единственное, что нас здесь на самом деле интересует, так это параметр "Категории ссылок". Используем любое свободное число, не задействованное ранее.

Идем в "Настройки - Ссылки сайта - Генератор подменю". Генерируем ссылки из "Категории новостей", указывая в качестве родителя только что созданную заглушку:

У вас получится что-то вроде этого:

Теперь просто удаляем заглушку, и все ссылки становятся ссылками первого уровня. Замечательно!

Добавляем в нашу тему шорткод {SITELINKS=flat:номер выбранной категории}, у меня вот так:

В данном случае я не заморачиваюсь разметкой, у меня нет задачи "сделать красиво", поэтому рендеринг "умолчальный" и выглядит неказисто:

Теперь вы знаете, куда и в каком направлении нужно двигаться. Реализовав меню категорий новостей e107 подобным образом, вы получите гибкие возможности по его оформлению, возможность размещать меню категорий в любом из вариантов  - как горизонтальном, так и вертикальном без дополнительных плагинов, и получите возможность произвольной сортировки меню категорий новостей. Пример хорошего, годного меню - на сайте Темы для Windows 8.

Советую почитать раздел Wiki Styling Individual Sitelink Menus, лишним не будет.

Реализовав наконец меню категорий, вы обнаружите, что название категорий выводится откровенно лажово. Хромает перевод, и нажав на категорию "Новости", вы увидите следующее:

Выглядит довольно несуразно, поэтому целесообразно убрать "Новости - Категории 'Новости'", и оставить лишь "Новости". Я перерыл добрую половину Wiki e107, но ответ нашел непосредственно в коде этой CMS.

При выводе названия категорий новостей e107 обрабатывает значение переменной $NEWSLISTTITLE. Если она задана, то в ней производится замена значения шорткода {NEWSCATEGORY} на реальное название. Не знаю, как написать это по-русски, покажу на реальных примерах.

Пример №1. Добавляем в файл темы theme.php следующую строчку:

$NEWSLISTTITLE = '{NEWSCATEGORY}';

Результат будет таким:

Пример №2

$NEWSLISTTITLE = 'Список статей раздела "{NEWSCATEGORY}"';

Таким образом, задав в файле темы theme.php значение переменной $NEWSLISTTITLE, вы можете переопределить название категории, появляющееся при просмотре входящих в неё публикаций. Это позволит придать вашему сайту более аккуратный вид.

Борьба с кривым переводом e107

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

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

Разберем небольшой актуальный пример.

Итак, у меня установлена последняя версия e107, и в её код закралась ошибка - вместо того, чтобы сообщать посетителю, что для комментирования новостей ему необходимо быть зарегистрированным/залогиниться, система рапортует, что комментарии заблокированы.

Воспользуемся ситуацией, и переопределим строковую константу. Нас интересует константа define("COMLAN_328", "Комментарии заблокированы");, заданная в файле:

/e107_languages/Russian/lan_comment.php

Я переопределю её, добавив в файл /e107_themes/leaf/languages/Russian.php следующую строку:

define("COMLAN_328", "Вы должны войти, чтобы отправлять комментарии на этот сайт - пожалуйста, либо войдите, либо - если вы еще не зарегистрированы - щелкните");

Этот корявый текст - тот самый текст, который должна была бы отобразить  e107, если бы ошибки не было. Я взял его исключительно для примера. И тем не менее, поставленной цели мы добились:

Теперь я уберу переопределение константы, и исправлю ошибку.

Ошибка, кстати, будет поправлена в следующем релизе, и находится она в файле e107_handlers/comment_class.php, в строке 602, которая выглядит так:

if (($lock != '1') && ($this->getCommentPermissions() === 'rw'))

Её нужно привести к виду:

if ($lock != '1') 

Таки бездумно копировать куски кода есть плохая практика. Не все в e107 Inc это знают, видимо.

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

Теперь, когда всё работает так, как нужно, разберем второй случай - облагородим перевод, снова переопределив строковую константу. На этот раз используется "правильная" константа COMLAN_6, именно в неё записана феерическая бредятина на рисунке выше.

Добавим в наш Russian.php темы строки вида:

define('COMLAN_6','Оставлять комментарии могут только зарегистрированные пользователи. Пожалуйста, <a href="login.php">войдите</a> или <a href="signup.php">зарегистрируйтесь</a>.');

define('COMLAN_321','');

define('COMLAN_322','');

В данной реализации костылей мы:

  • Во-первых, подменили текст сообщения в COMLAN_6
  • Во-вторых, это сообщение составное, и необходимо затереть его оставшиеся части. COMLAN_321 содержит текст ссылки, а COLMAN_322 - это "чтобы зарегистрироваться".

Альтернативный вариант реализации переопределения строковых ресурсов в данном конкретном случае мог бы быть таким:

define('COMLAN_6','Оставлять комментарии могут только зарегистрированные пользователи. Пожалуйста, <a href="login.php">войдите</a> или ');

define('COMLAN_321','зарегистрируйтесь');

define('COMLAN_322','');

Второй вариант - более правильный.

Таким образом, можно переопределить любую строковую константу, значение которой вас не устраивает, будь то строка в системе локализации загрузок, либо где-то ещё. Добавив новое значение в файл темы, вы затрете старое, и получите требуемый результат, не меняя основных файлов CMS. Вот ещё парочка актуальных костылей для перевода:

  • В "Загрузках" перепутаны строки "По возрастанию" и "По убыванию". Добавляем в файл Тема\Languages\Russian.php строки
    define("LAN_dl_26", "По убыванию");
    define("LAN_dl_25", "По возрастанию");
  • Ещё одна ошибка в комментариях, для её устранения добавляем строку
    define("COMLAN_12", "Пользователь");
    В оригинале написано "Потльзователь".

Исправляем ошибку с заголовком новостей в e107 при включенном кэше

Кеш в e107 вполне себе годный, он действительно сокращает время загрузки страниц и снижает нагрузку на сервер, так как тело статьи не парсится из шорткодов, база не дергается запросами, а всё содержимое статьи берется из статического php-файла простым Include.

Но если включить кэш, вместо заголовка новости (тэг title) вы увидите название сайта+слово "Комментарии". Это уж совсем непростительный косяк, ибо после этого поисковые системы будут смотреть на ваш сайт, как на говно.

Если вы посмотрите код, вы увидите, что проблема заключается в том, что в режиме кэширования не задается значение константы e_PAGETITLE, именно она должна задавать заголовок страницы с новостью. Давайте подопрем систему очередным костылем, для чего добавим несколько строчек в уже надоевший нам файл theme.php.

Суть костыля заключается в том, что если мы смотрим новость, то нужно "дёрнуть" из базы данных заголовок текущей новости, и положить его в e_PAGETITLE. Написанный и используемый мной код выглядит следующим образом:

//e_PAGENAME for cache
$temp_query = explode(".", e_QUERY);
$action = $temp_query[0];            // Usually says 'comment' - may say 'reply'
$table = $temp_query[1];            // Table containing item associated with comment(s)
$id  = intval(varset($temp_query[2], 0));    // ID of item associated with comments (e.g. news ID)
if ( ($action == 'comment') && ($table == 'news') ) {
$query = "SELECT n.news_title FROM #news AS n WHERE n.news_id={$id}";
if ($sql->db_Select_gen($query)) {
$newsitem = $sql->db_Fetch();
$subject = $tp->toForm($newsitem['news_title']);
define("e_PAGETITLE", "{$subject}");
unset($subject);
unset($newsitem);
unset($query);
}
}
unset($action);
unset($table);
unset($id);
unset($temp_query);

Ничего сложного. Режим отображения новости определяется по URL, и если это полная новость - то выбираем заголовок из базы. Согласитесь, так гораздо лучше:


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

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

Winreview.ru можно найти в Вконтакте, Facebook и Twitter. Присоединяйтесь!