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

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

Я не намерен писать учебник по e107 и/или рассказывать, как её установить, настроить, описывать её фичи. Учебники писать у меня получается через то, на чем вы сидите (мир и покой тебе, учебник по NSIS). Писать я буду о том, как подставить костыли под наиболее хромающие места, как реализовать хаки вроде переопределения стандарных bb-кодов и шорткодов, и поделюсь своими плагинами. Все заинтересовавшиеся читают продолжение, остальным покажу котёнка в конце статьи.

Вы установили e107/получили в подарок от друга сайт на ней/whatever, и чаще всего вы будете иметь дело с админкой. Начиная с релиза e107 1.0 с ней поставляется новая дефолтная тема, сделанная "для удобства пользователей". Именно она используется как тема админ-центра по умолчанию, и начать стоит с её выпиливания.

Почему? Потому что:

  • в ней не реализованы механизмы сохранения пресетов для того, что вы постите, и уже этого вполне достаточно, чтобы от неё избавиться.
  • если нет - посмотрите файлы theme.php и style.css.

Разумно использовать старый вариант темы для админки, это тема Jayya.

Тема админ-центра e107

Вообще, темы в e107  - это форменное безумие. Если судить по верстке, то их создатели застряли где-то в начале 200х годов, а размеры шрифтов говорят о том, что делали их под разрешение 800x600.

Итак, чтобы не ломать глаза об шрифты Jayya, целесообразно убрать ограничения на их размеры, подредактировав style.css. А чтобы не потереть свои изменения при очередном апдейте, есть смысл склонировать тему, поместив её в папку Jayya2.

Если вы склонировали Jayya, то сразу поправьте пути к локализации в theme.php:

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

Теперь непосредственно шрифты. Я предпочитаю дать браузеру полную свободу в этом вопросе, поэтому просто удаляю все основные стили шрифтов в файле style.css:

Находим тему в админке, ставим её темой админ-центра, видим появившиеся кнопки сохранения пресетов:

ПРОФИТ!!

Тема сайта

Как я уже говорил, хороших тем для этой CMS "из коробки" нет. (Впрочем, после некоторого допила можно привести умолчанию тему Core во вполне презентабельный вид). Делайте самостоятельно или попробуйте подобрать что-то вот здесь, где иногда попадаются вполне себе годные варианты. Я лично, запуская Winaero, взял штатную тему Human Condition и немного переверстал её. Вид вышел неказистый, да ну и чёрт с ней. Для странички со списком софта и так сойдет. Ну а я в целях показательных буду использовать и терзать на протяжении всего цикла публикаций тему Leaf.

Если вы уже определились с темой и осмотрелись, самое время подставлять костыли. Костыли преимущественно будем подставлять при помощи файла темы, то бишь theme.php.

Использование файла темы для доработки/переопределения штатных фич снижает трудоемкость замены основной темы сайта, избавляет вас от необходимости править файлы "ядра" движка и упрощает обновление CMS e107.

Первое, что вы наверняка захотите сделать, это избавиться от идиотизма с отображением комментариев.

Отображение полной новости вместе с комментариями в e107

Первое, обо что я и Глеб споткнулись, запустив Winreview, было именно отображение комментариев. e107 отображает либо анонс+комментарии, либо анонс+полный текст.

Анонс, комментариев не видно:

Полный текст новости, комментариев не видно:

Пытаемся оставить комментарий, получаем анонс+комментарии:

Слишком много телодвижений, чтобы почитать комментарии. Бред, ИМХО.

Вариант анонс+полный текст+комментарии почему-то недоступен ни в одной из тем, хотя он реализован в движке и может использоваться. Я по дури в свое время кинулся дорабатывать "системные" файлы, призывая на себя проклятье геморройного обновления, делать этого ни в коем случае не стоит. Эта задача решается по-другому.

Чтобы задействовать означенную выше фичу, нужно создать аж три новых шорткода, один на замену {NEWSTITLE}, второй - на замену {EXTENDED}, и третий - это {NEWSBODY}, который нужно научить отображать полный текст новости для случая, когда пользователь читает комментарии.

И здесь мы применим первый трюк - переопределение стандартных шорткодов e107.

Как задаются шорткоды в теме , можно увидеть в той же теме leaf, в файле theme.php. В общем случае эта операция сводится до создания файла с кодом file.sc  и добавления в theme.php записи [code]$register_sc[] = 'FILE';[/code]

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

Регистрируем наши шорткоды обычным способом, добавляя в строчки в файл theme.php:

Теперь необходимо создать три SC-файла и разместить их рядом с файлом theme.php.

Файлы newstitle.sc и extended.sc нужно создать на основе кода системных шоркодов, доработав формирование ссылки вида comment.php?comment.news.10 (взамен news.php?news.extend и news.php?news.item).

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

extended.sc

[code]global $tp;
$news_item = getcachedvars('current_news_item');
$param = getcachedvars('current_news_param');
#if ($news_item['news_extended'] && (strpos(e_QUERY, 'extend') === FALSE || $parm == "force"))
if ($news_item['news_extended'] && (strpos(e_QUERY, 'extend') === FALSE || $parm == "force") && strpos(e_QUERY, 'comment.news') === FALSE)
{
if (defined("PRE_EXTENDEDSTRING"))
{
$es1 = PRE_EXTENDEDSTRING;
}
if (defined("POST_EXTENDEDSTRING"))
{
$es2 = POST_EXTENDEDSTRING;
}
if (isset($_POST['preview']))
{
return $es1.EXTENDEDSTRING.$es2."<br />".$tp->toHTML($news_item['news_extended'], TRUE, 'BODY, fromadmin', $news_item['news_author']);
}
else
{
return $es1."<a class='".$GLOBALS['NEWS_CSSMODE']."_extendstring' href='".e_HTTP."comment.php?comment.news.".$news_item['news_id']."'>".EXTENDEDSTRING."</a>".$es2;
}
}
else
{
return "";
}[/code]

newstitle.sc:

[code]global $tp;
$news_item = getcachedvars('current_news_item');
$param = getcachedvars('current_news_param');
return "<a href='".e_HTTP."comment.php?comment.news.".$news_item['news_id']."'>".$tp -> toHTML($news_item['news_title'], TRUE, 'TITLE')."</a>";[/code]

newsbody.sc

[code]global $tp;
$news_item = getcachedvars('current_news_item');
$param = getcachedvars('current_news_param');
$news_body = $tp -> toHTML($news_item['news_body'],    TRUE, 'BODY, fromadmin', $news_item['news_author']);
if($news_item['news_extended'] && (isset($_POST['preview']) || strpos(e_QUERY, 'extend') !== FALSE || strpos(e_QUERY, 'comment.news') !== FALSE))
{
$news_extended =$tp -> toHTML($news_item['news_extended'], TRUE, 'BODY, fromadmin', $news_item['news_author']);
$news_body .= $news_extended;
}
return $news_body;[/code]

Результат этой возни, несомненно, радует:

Если вы решите заменить функциональность ссылки "Комментарии", чтобы она тоже  вела на страницу полной новости с комментариями, переопределите шорткод  {NEWSCOMMENTS} аналогичным образом, рабочий код для newcomments.sc:

[code]global $pref, $sql;
if($pref['comments_disabled'] == 1)
{
return;
}
$news_item = getcachedvars('current_news_item');
$param = getcachedvars('current_news_param');

if (varsettrue($pref['multilanguage']))
{    // Can have multilanguage news table, monlingual comment table. If the comment table is multilingual, it'll only count entries in the current language
$news_item['news_comment_total'] = $sql->db_Select("comments", "*", "comment_item_id='".$news_item['news_id']."' AND comment_type='0' ");
}

if ($pref['comments_icon'] && $news_item['news_comment_total'])
{
$sql->db_Select('comments', 'comment_datestamp', "comment_item_id='".intval($news_item['news_id'])."' AND comment_type='0' ORDER BY comment_datestamp DESC LIMIT 0,1");
list($comments['comment_datestamp']) = $sql->db_Fetch();
$latest_comment = $comments['comment_datestamp'];
if ($latest_comment > USERLV )
{
$NEWIMAGE = $param['image_new_small'];
}
else
{
$NEWIMAGE = $param['image_nonew_small'];
}
}
else
{
$NEWIMAGE = $param['image_nonew_small'];
}
return ($news_item['news_allow_comments'] ? $param['commentoffstring']
:
''.($pref['comments_icon'] ? $NEWIMAGE : '')." <a href='".e_HTTP."comment.php?comment.news.".$news_item['news_id']."'>".$param['commentlink'].$news_item['news_comment_total'].'</a>');[/code]


 

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

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

💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.

Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!

Автор: Сергей Ткаченко

Сергей Ткаченко создал этот сайт в далёком 2009 году, и с тех пор продолжает над ним работать, публикуя новые материалы о Windows и её приложениях практически каждый день.

Cайт на e107. Ковыляем на костылях. Часть первая: 8 комментариев

  1. Сорри за оффтоп, но рассказ о е107 в блоге WordPress не просто толсто намекает, но еще и выглядит очень цинично 🙂

  2. Намекает, безусловно, толсто, но вдруг кому-то пригодится. Не на Winaero же писать 🙂

  3. Мне и котик понравился и статья, это очень плохо? 🙂
    Если надумаю заводить свой бложек, думаю, материал пригодится.

    1. В таком случае я рекомендую использовать WordPress. Тем более что e107 скорее для сайтов формата «скочал, помогите устоновить», нежели для «бложика». В случае бложика WordPress вне конкуренции.
      А вообще, как я прочитал на одном форуме недавно: «хорошая CMS — это та, которую ты хорошо знаешь».

  4. Сергей, определитесь наконец! Вы вроде как решили использовать WordPress. Тогда зачем писать о е107 в блоге WordPress? Или Вы все-таки используете е107?

  5. @Nikita , я использую e107 на Winaero.com, хотя, на самом деле, я бы мог там использовать вообще статический HTML.
    Кроме того, я помогаю приятелю/поддерживаю ещё два сайта на e107.
    Я считаю, есть смысл поделиться своим опытом и наработками, ведь наверняка они будут кому-то полезны.

  6. Привет, Сергей!

    Мне нравится e107, не знаю почему, но так сложилось. Все пытался научить (или приучить) себя отслеживать изменения и выносить их в «диффы», чтоб после обновления вносить обратно или найти в конце-концов правильный способ, но так и не научился 🙁

    За пример с шорткодами спасибо, очень полезно. А так же хотелось бы узнать, как ты сам следишь за вносимыми изменениями?

  7. Я раньше вручную сверял свои изменения с новой версией.
    Использовал Winmerge для этого.
    Сейчас все костыли вынес в файлы темы, в шаблоны и шорткоды, что не смог — сделал плагинами.
    В целом это избавляет от необходимости правки файлов движка, к чему я и стремился.

Обсуждение закрыто.

css.php