Приветствую вас, редкий вменяемый читатель. Я таки решился поделиться своим личным опытом создания сайтов на 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.
Сорри за оффтоп, но рассказ о е107 в блоге WordPress не просто толсто намекает, но еще и выглядит очень цинично 🙂
Намекает, безусловно, толсто, но вдруг кому-то пригодится. Не на Winaero же писать 🙂
Мне и котик понравился и статья, это очень плохо? 🙂
Если надумаю заводить свой бложек, думаю, материал пригодится.
В таком случае я рекомендую использовать WordPress. Тем более что e107 скорее для сайтов формата «скочал, помогите устоновить», нежели для «бложика». В случае бложика WordPress вне конкуренции.
А вообще, как я прочитал на одном форуме недавно: «хорошая CMS — это та, которую ты хорошо знаешь».
Сергей, определитесь наконец! Вы вроде как решили использовать WordPress. Тогда зачем писать о е107 в блоге WordPress? Или Вы все-таки используете е107?
@Nikita , я использую e107 на Winaero.com, хотя, на самом деле, я бы мог там использовать вообще статический HTML.
Кроме того, я помогаю приятелю/поддерживаю ещё два сайта на e107.
Я считаю, есть смысл поделиться своим опытом и наработками, ведь наверняка они будут кому-то полезны.
Привет, Сергей!
Мне нравится e107, не знаю почему, но так сложилось. Все пытался научить (или приучить) себя отслеживать изменения и выносить их в «диффы», чтоб после обновления вносить обратно или найти в конце-концов правильный способ, но так и не научился 🙁
За пример с шорткодами спасибо, очень полезно. А так же хотелось бы узнать, как ты сам следишь за вносимыми изменениями?
Я раньше вручную сверял свои изменения с новой версией.
Использовал Winmerge для этого.
Сейчас все костыли вынес в файлы темы, в шаблоны и шорткоды, что не смог — сделал плагинами.
В целом это избавляет от необходимости правки файлов движка, к чему я и стремился.