Joomla — это система управления контентом, которая имеет своих поклонников, почитателей, пользователей и конечно команду, которая занимается её поддержкой и дальнейшей разработкой. Всё бы хорошо, если бы можно было создать что-то идеальное, чтобы работало, не ломалось и не нуждалось в обслуживании. В этой статье рассмотрим, что из внесённых изменений в работу Joomla слетает при её апдейте, и что приходится восстанавливать после каждого её апдейта.
BackUp сайта по любому случаю — это здоровая паранойя и сон младенца в промежутках между работой =)
Любую работу по вмешательству в любую работающую систему лучше всегда начинать с создание слепка того, что работает. Ибо работать оно не будет вечно — это во-первых, а во-вторых, кто из вас застраховал свой сайт на случай неудачного апдейта Joomla? Я не страховал, поэтому любой апдейт для меня повод сделать очередной бэкап сайта. ; )
Тем более, что делать его очень просто.
Накатывание апдейта Joomla на сарвер
Самое простое в Joomla — это накатить готовый апдейт. Тем более, что админка постоянно при входе напоминает о том, что вышла новая версия Joomla и что хорошо бы её обновить. А обновлять её действительно хорошо, так как разработчики не зря трудятся в поте лица, что-то улучшая в коде, в том числе закрывая найденные уязвимости, которые тоже случаются и которыми обязательно воспользуется какой-нибудь злодейский злодей, если ваша версия Joomla будет долго висеть без установленных обновлений, закрывающих вход в разные дырки всяким непрошеным гостям. Да и наверняка в новой версии будут присутствовать какие-нибудь приятные новые фишки или просто Joomla начнёт работать чуть быстрее и меньше нагружать сервер. Приятно же. =)
Что слетает в Joomla после апдейта и это нужно исправлять
Итак, апдейт Joomla успешно установлен. Теперь в порядке важности восстановления сайта после апдейта и приведение его в рабочее состояние, которое будет не хуже того, что было до апдейта.
1. Контекстная реклама Google
Для тех, кто делает сайт не просто потому что это круто или интересно, а чтобы он приносил доход, пожалуй самое важное — это в первую очередь восстановить выдачу контекстной рекламы.
Для этого требуется открыть файл /components/com_content/views/article/view.html.php
и отредактировать выдачу рекламы в тексте статьи и в конце статьи:
- читать: «Вставка рекламного объявления Google AdSense между вступлением и основной частью статьи в Joomla»
- читать: «Вставка рекламного объявления Google AdSense сразу после статьи в Joomla»
- альтернативный вариант вставки через модули Joomla: «Как вставить модуль Joomla в любое место шаблона (в код любого шаблона). На примере вставки кода объявлений Google AdSense в код шаблона материала.»
2. Кнопки социальных сетей «Поделиться»
Чтобы не открывать файл /components/com_content/views/article/view.html.php
дважды, сразу имеет смысл вставить в него и код вставки кнопок «Поделиться» в социальных сетях:
- читать: «Как вставить блок социальных кнопок Поделиться в начало статьи в Joomla»
- читать: «Вставка кнопок социальных сетей «Поделиться» после статьи на страницу сайта Joomla»
- альтернативный вариант вставки через модули Joomla: «Как вставить модуль Joomla в любое место шаблона (в код любого шаблона). На примере вставки кода кнопок Яндекс.Поделиться в код шаблона материала.»
Код для пунктов 1 и 2: со 164-й строчки в файле view.html.php
// читаем код рекламного блока в переменную $AdSense и $AdSense2
$AdSense = file_get_contents('./templates/protostar/includes/GaD-inarticle-up.php');
$AdSense2 = file_get_contents('./templates/protostar/includes/GaD-inarticle-down.php');
// читаем код вставки социальных кнопариков в переменные $YaShareUp и $YaShareDown
$YaShareUp = file_get_contents('./templates/protostar/includes/YaShare-up.php');
$YaShareDown = file_get_contents('./templates/protostar/includes/YaShare-down.php');
// NOTE: The following code (usually) sets the text to contain the fulltext, but it is the
// responsibility of the layout to check 'access-view' and only use "introtext" for guests
if ($item->params->get('show_intro', '1') == '1')
{
$item->text = $YaShareUp . $item->introtext . $AdSense . '<br><br>' . $item->fulltext . $YaShareDown . $AdSense2; // выводим переменную $AdSense сразу после introtext и до fulltext
}
2.1 Альтернативный вариант вставки через модули Joomla
// читаем код рекламного блока в переменную $AdSense и $AdSense2
// читаем код вставки социальных кнопариков в переменные $YaShareUp и $YaShareDown
// вставка кода Звёздного рейтинга
jimport( 'joomla.application.module.helper' );
$moduleUp = JModuleHelper::getModules('GaS-inarticle-up');
$moduleDown = JModuleHelper::getModules('GaS-inarticle-down');
$YamoduleDown = JModuleHelper::getModules('YaShare-down');
$attribs['style'] = 'none';
$AdSense = JModuleHelper::renderModule($moduleUp[0], $attribs);
$AdSense2 = JModuleHelper::renderModule($moduleDown[0], $attribs);
$YaShareDown = JModuleHelper::renderModule($YamoduleDown[0], $attribs);
$SSR = '<div id="mb4star"></div>';
// NOTE: The following code (usually) sets the text to contain the fulltext, but it is the
// responsibility of the layout to check 'access-view' and only use "introtext" for guests
if ($item->params->get('show_intro', '1') == '1')
{
$item->text = $item->introtext . $AdSense . '<br><br>' . $item->fulltext . $YaShareDown . $AdSense2 . $SSR; // выводим переменную $AdSense сразу после introtext и до fulltext
}
2.2 Код для вставки Яндекс.Рекламы (общий для всех блоков, вставляется перед </head>
в index.php
шалона)
<!-- Yandex Native Ads -->
<script>window.yaContextCb=window.yaContextCb||[]</script>
<script src="https://yandex.ru/ads/system/context.js" async></script>
3. Восстанавливаем выдачу заголовков статей тегом <H1>
Для того, чтобы пользователи сайта (и поисковики) понимали, что является заголовком статьи, имеет смысл сразу вернуть заголовкам статей обрамление тегом <H1>. Для этого нужно внести изменения в файл /components/com_content/views/article/tmpl/default.php
, который находится в папке по соседству с теми, что мы только что правили выше.
Исправляем код в файле default.php (с 52-й строчки)
<?php if ($params->get('show_title')) : ?>
<h1 itemprop="headline">
<?php echo $this->escape($this->item->title); ?>
</h1>
<?php endif; ?>
4. Восстанавливаем выдачу заголовков категорий тегом <H2> на странице материала
Для того, чтобы не было несколько заголовков <H1>
на странице, нужно в строке 31 файла /components/com_content/views/article/tmpl/default.php
, в которой происходит выдача заголовка страницы, исправить выдачу его в теге <H2>
, а не в <H1>
. Подробно о том, как и почему, описано в → этой статье, а сам код должен выглядеть так:
<?php if ($this->params->get('show_page_heading')) : ?>
<div class="page-header">
<h2> <?php echo $this->escape($this->params->get('page_heading')); ?> </h2>
</div>
<?php endif;
5. Восстанавливаем favicon
Далее, чтобы не сводить с ума поисковые машины тем, что у нас поменялся favicon сайта, сразу восстановим индексный файл шаблона сайта /templates/protostar/index.php
, ну и до кучи, индексный файл index.php
и файл логина login.php
шаблона админки /administrator/templates/isis/
(если кто-то понял, насколько это удобно иметь собственную favicon админки при работе с сайтом):
- читать: «Как в Joomla сделать favicon для всех платформ»
- читать: «Как админке Joomla сделать favicon для всех платформ»
Код для вставки в файл index.php шаблона Protostar сайта (со 134-й строчки)
<!-- favicon -->
<link rel="apple-touch-icon" sizes="180x180" href="/templates/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" href="/templates/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/templates/favicon/favicon-194x194.png" sizes="194x194">
<link rel="icon" type="image/png" href="/templates/favicon/android-chrome-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="/templates/favicon/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="/templates/favicon/manifest.json">
<link rel="mask-icon" href="/templates/favicon/safari-pinned-tab.svg" color="#587bf5">
<link rel="shortcut icon" href="/templates/favicon/favicon.ico">
<meta name="apple-mobile-web-app-title" content="MoonBase">
<meta name="application-name" content="MoonBase">
<meta name="msapplication-TileColor" content="#587bf5">
<meta name="msapplication-TileImage" content="/templates/favicon/mstile-144x144.png">
<meta name="msapplication-config" content="/templates/favicon/browserconfig.xml">
<meta name="theme-color" content="#587bf5">
<!-- favicon -->
Код для вставки в файлов index.php и login.php шаблона isis админки (со 175-й и 108-й строчки соответственно)
<!-- favicon -->
<link rel="apple-touch-icon" sizes="180x180" href="/../administrator/templates/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" href="/../administrator/templates/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/../administrator/templates/favicon/favicon-194x194.png" sizes="194x194">
<link rel="icon" type="image/png" href="/../administrator/templates/favicon/android-chrome-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="/../administrator/templates/favicon/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="/../administrator/templates/favicon/manifest.json">
<link rel="mask-icon" href="/../administrator/templates/favicon/safari-pinned-tab.svg" color="#aa44ee">
<link rel="shortcut icon" href="/../administrator/templates/favicon/favicon.ico">
<meta name="msapplication-TileColor" content="#aa44ee">
<meta name="msapplication-TileImage" content="../administrator/templates/favicon/mstile-144x144.png">
<meta name="msapplication-config" content="../administrator/templates/favicon/browserconfig.xml">
<meta name="theme-color" content="#aa44ee">
<!-- favicon -->
6. Вставка поддержки всплывашек с предупреждениями
Вставляем подготовленные файлы css и js в код индексного файла шаблона сайта ibdex.php:
...
<link href="/templates/protostar/css/moonbase.css" rel="stylesheet" />
</head>
...
<script src="/templates/protostar/js/moonbase.js"></script>
</body>
</html>
Подробности читать тут. Это для случая вставки через модуль Joomla (остальной код будет подцеплен и вставлен из соответствующего модуля).
7. Вставляем подсветку кода highlight.js и нумерацию строк кода
Перед закрывающим тегом </head>
после вставки favicon вставляем подсветку кода highlight.js и нумерацию строк кода так, как описано в статьях про highlight.js:
<link rel="stylesheet" href="/templates/protostar/css/shades-of-purple.css">
<link rel="preload" href="/templates/protostar/js/highlight.pack.js" as="script">
<script src="/templates/protostar/js/highlight.pack.js"></script>
8. Убираем meta-тег name="generator"
Чтобы не открывать файл шаблона сайта дважды, сразу уберём meta-тег name="generator"
. Зачем он нам? ;)
Код для вставки в файл index.php шаблона Protostar сайта (в 16-ю строчку)
$this->setGenerator(null);
9. Вставка года начала проекта в копирайте сайта
И снова, чтобы не открывать файлы шаблонов сайта и админки дважды, лучше сразу вставить год начала проекта в копирайт сайта.
Код для правки в файл index.php шаблона Protostar сайта (231-я строчка) в шаблоне админки тоже где-то внизу файлов index.php и login.php
© 2006—<?php echo date('Y'); ?> <?php echo $sitename; ?>
10. Вставляем анимацию favicon
Как работает анимация favicon подробно описано в → этой статье. Для включения анимации фавиконки нужно перед закрывающим тегом </body>
в файле index.php
шаблона добавить следующий код:
<script>
var counter = 1;
var NumberOfPics = 3 + 1;
var pause = 400;
var nodeFavicon = document.getElementsByTagName("link");
function animateFavicon() {
for (var i = 0; i < nodeFavicon.length; i++)
{
if((nodeFavicon[i].getAttribute("rel") == "shortcut icon") || (nodeFavicon[i].getAttribute("rel") == "icon"))
{
nodeFavicon[i].setAttribute("href", "/templates/favicon/" + counter + ".png");
}
}
if (counter < NumberOfPics) {
setTimeout(animateFavicon, pause);
counter++;
if (counter == NumberOfPics) { counter = 1; }
}
}
animateFavicon();
</script>
11. Вставляем код для объявлений уровня страницы Google AdSense
Для этого нужно скопировать код для объявлений уровня страницы в Google AdSense и прописать его в теге <head>
файла шаблона index.php
.
12. Стили шаблона Protostar
Изменение размера, семейства и цвета шрифта текста сайта
Вот не знаю, кому как, а для меня шрифт шаблона Protostar мелковат, сероват, да и семейство шрифтов какое-то слишком ретро. =)
Поэтому в файл /templates/protostar/css/template.css имеет внести некоторые изменения:
Строка 213:
font-family: Open Sans, sans-serif;
Строка 214:
font-size: 15px;
Строка 216
color: #1c2b40;
Подсветка активного подпункта Главного меню сайта на Joomla
В стандартном решении для меню сайта есть недоработки с подсветкой активного подпункта Главного меню сайта. Это решаемо и описано в статье:
Строка 7464
.navigation .nav-child li.active > a {background-color: #8888cc; color: #fff;}
Правильная нумерация списков в Joomla 3
Для того, чтобы смешанные нумерованные и ненумерованные списки в Joomla 3 и в хлебных крошках Kunena Forum выглядели красиво (как в договорах), нужно вставит ниже код:
- читать: «Правильная нумерация списков в Joomla 3»
- читать: «Правильная нумерация списков в хлебных крошках Kunena Forum в Joomla 3»
Строки 7470..7482
ol {
list-style: none;
counter-reset: li;
}
ol > li:before {
counter-increment: li;
content: counters(li,".") ". ";
color: #d14;
font-weight: 900;
}
ol.breadcrumb > li:before {
content: '';
}
13. Добавление рекламных объявлений Google AdSense в виде сообщения в теме форума
В районе стр.120 в файле:
/components/com_kunena/template/crypsis/layouts/topic/item/default.php
14. Добавление кнопки «Удалить совсем» чтобы быстрее убивать спамеров
В районе стр.603 в файле:
/components/com_kunena/controller/message/item/actions/display.php
15. Добавление любых тэгов в заголовок модуля Joomla
Для добавления любых тэгов в заголовок модуля Joomla нужно добавить строчку filter="raw"
в файл module.xml
в районе 13-й строчки.
Полный путь к файлу:
administrator/components/com_modules/models/forms/module.xml
Полный текст поля title
:
<field
name="title"
type="text"
label="JGLOBAL_TITLE"
description="COM_MODULES_FIELD_TITLE_DESC"
class="input-xxlarge input-large-text"
size="40"
maxlength="100"
required="true"
filter="raw"
/>
16. Добавление любых тэгов в название заголовка статьи Joomla
Для добавления любых тэгов в название заголовка статьи Joomla нужно добавить строчку filter="raw"
в файл article.xml
в районе 30-й строчки.
Полный путь к файлу:
/administrator/components/com_content/models/forms/article.xml
Полный текст поля title
:
<field name="title" type="text" label="JGLOBAL_TITLE" description="JFIELD_TITLE_DESC" class="input-xxlarge input-large-text" size="40" required="true" filter="raw" />
17. Интеграция подсветки кода highlight.js
в редактор TinyMCE
Подробности в → этой статье.
Нужный файл:
/media/editors/tinymce/plugins/codesample/plugin.min.js
Чтобы преобразовать код HTML вставки для highlight.js
нужно заменить:
function i(e,t,r){e.undoManager.transact(function(){var i=o(e);r=l.encode(r),i?(e.dom.setAttrib(i,"class","language-"+t),i.innerHTML=r,n.highlightElement(i),e.selection.select(i)):(e.insertContent('<pre id="__new" class="language-'+t+'">'+r+"</pre>"),e.selection.select(e.$("#__new").removeAttr("id")[0]))})}
на:
function i(e,t,r){e.undoManager.transact(function(){var i=o(e);r=l.encode(r),i?(e.dom.setAttrib(i,"class","language-"+t),i.innerHTML=r,n.highlightElement(i),e.selection.select(i)):(e.insertContent('<pre><code id="__new" class="language-'+t+'">'+r+"</code></pre>"),e.selection.select(e.$("#__new").removeAttr("id")[0]))})}
Чтобы поменять список языков вставки подсветки кода в TinyMCE на тот, который требуется и который был выбран при сборке highlight.js
, нужно заменить:
function r(e){var t=[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],n=e.settings.codesample_languages;return n?n:t}
на
function r(e){var t=[{text:"PHP",value:"php"},{text:"Apache",value:"apache"},{text:"Bash",value:"bash"},{text:"CSS",value:"css"},{text:"HTML",value:"html"},{text:"XML",value:"xml"},{text:"HTTP",value:"http"},{text:"JSON",value:"json"},{text:"JavaScript",value:"javascript"},{text:"Markdown",value:"markdown"},{text:"Nginx",value:"nginx"},{text:"Properties",value:"properties"},{text:"SQL",value:"sql"},{text:"Shell",value:"shell"}],n=e.settings.codesample_languages;return n?n:t}
18. Уязвимость конфига Joomla к взлому изнутри. Уязвимость configuration.php
В файле:
/administrator/components/com_config/model/application.php
в 481 строке:
if (!$ftp['enabled'] && JPath::isOwner($file) && !JPath::setPermissions($file, '0640'))
в 501 строке:
if (!$ftp['enabled'] && JPath::isOwner($file) && !JPath::setPermissions($file, '0440'))
Подробности про эту уязвимость → тут.
Заключение
Это пока всё, что нужно накатить обратно и поправить в движке Joomla и файлах шаблонов и стилей после того, как сделан апдейт Joomla.
Статья будет дополняться по мере работы с наращиванием функционала сайта и модернизации шаблона.
Оставляйте свои комментарии ниже или на форуме в теме обсуждения этой статьи. ; )
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)