Как в произвольном месте index.php вывести заголовок страницы
<?php $document = &JFactory::getDocument(); echo $document->title; ?>
Написанное актуально для
Joomla 1.5.x
<?php $document = &JFactory::getDocument(); echo $document->title; ?>
Joomla 1.5.x
Как увеличить время выполнения PHP скрипта или как можно исправить ошибку Maximum execution time of 30 seconds exceeded?
Ошибка появляется если время выполнения скрипта больше, чем установлено в конфигурации PHP. Когда вы устанавливаете довольно большой компонент или производите импорт. В конфигурации PHP обычно максимальное время выполнения скриптов, задается в районе 30 секунд. Значение может варьироваться в зависимости от хостинга. Иногда стандартного времени выполнения скрипта не хватает. В таком случае, вам придется обратиться к хостеру, или самостоятельно изменить этот параметр в файлах Joomla.
Решить проблему максимального времени исполнения скриптов в Joomla можно несколькими способами.
1. Можно добавить в начало файла index.php который находится в корне сайта команду:
<?php ini_set("max_execution_time", "120"); ?>
<?php set_time_limit (120); ?>
php_value max_execution_time 120
У вас сайт на CMS Joomla или интернет магазин на Virtuemart. Для поисковой оптимизации важно правильно настроить файл robots.txt. Так, что же такое robots.txt для Joomla и Virtuemart и для остальных систем управления контентом сайта? Robots.txt - это текстовый файл, который находится в корне вашего сайта, интернет магазина в который записаны подробные инструкции для поисковых систем типа Yandex, Google и других. Robots.txt нужен для того чтобы сократить время индексации вашего сайта или интернет магазина, убрать дубли страниц, ускорить работу поисковых роботов. Файл robots.txt используется оптимизаторами для запрета индексации поисковиками, всего лишнего, файлов системы управления (движка), в нашем случае системных файлов Joomla и Virtuemart. Неправильная настройка robots.txt может серьезно осложнить работу по продвижению сайта.
Чтобы отредактировать, файл robots.txt для Joomla и Virtuemart, необходимо зайти на сайт по ftp протоколу, например через ftp клиент FileZilla (о том как настроить читайте в этой статье). Переходим в корень сайта на Joomla, видим файл robots.txt, открываем его для настройки.
Стандартный файл robots.txt в CMS Joomla.
Типовой файл robots.txt, который мы получаем при установке Joomla, выглядит следующим образом:
User-agent: * Disallow: /administrator/ Disallow: /cache/ Disallow: /components/ Disallow: /images/ Disallow: /includes/ Disallow: /installation/ Disallow: /language/ Disallow: /libraries/ Disallow: /media/ Disallow: /modules/ Disallow: /plugins/ Disallow: /templates/ Disallow: /tmp/ Disallow: /xmlrpc/
User-agent: * Disallow: /administrator/ Disallow: /cache/ Disallow: /components/ Disallow: /includes/ Disallow: /installation/ Disallow: /language/ Disallow: /libraries/ Disallow: /media/ Disallow: /modules/ Disallow: /plugins/ Disallow: /templates/ Disallow: /tmp/ Disallow: /xmlrpc/ Disallow: /*.pdf Disallow: /*.swf Disallow: /*print=1 Disallow: /*mailto/ Sitemap: http://yoursite.ru/sitemap Host: yoursite.ru
User-agent: * Disallow: /administrator/ Disallow: /cache/ Disallow: /components/ Disallow: /includes/ Disallow: /installation/ Disallow: /language/ Disallow: /libraries/ Disallow: /media/ Disallow: /modules/ Disallow: /plugins/ Disallow: /templates/ Disallow: /tmp/ Disallow: /xmlrpc/ Disallow: /*.pdf Disallow: /*.swf Disallow: /*print=1 Disallow: /*mailto/ Sitemap: http://yoursite.ru/sitemap Host: yoursite.ru User-agent: Yandex Disallow: /administrator/ Disallow: /cache/ Disallow: /components/ Disallow: /includes/ Disallow: /installation/ Disallow: /language/ Disallow: /libraries/ Disallow: /media/ Disallow: /modules/ Disallow: /plugins/ Disallow: /templates/ Disallow: /tmp/ Disallow: /xmlrpc/ Disallow: /*.pdf Disallow: /*.swf Disallow: /*print=1 Disallow: /*mailto/ Sitemap: http://yoursite.ru/sitemap Host: yoursite.ru
Файл robots.txt для Virtuemart
User-agent: * Disallow: /administrator/ Disallow: /cache/ Allow: /components/com_virtuemart/ Disallow: /components/ Disallow: /includes/ Disallow: /installation/ Disallow: /language/ Disallow: /libraries/ Disallow: /media/ Disallow: /modules/ Disallow: /plugins/ Disallow: /templates/ Disallow: /tmp/ Disallow: /xmlrpc/ Disallow: /*.pdf Disallow: /*.swf Disallow: /*print=1 Disallow: /*mailto/ Sitemap: http://yoursite.ru/sitemap Host: yoursite.ru User-agent: Yandex Disallow: /administrator/ Disallow: /cache/ Allow: /components/com_virtuemart/ Disallow: /components/ Disallow: /includes/ Disallow: /installation/ Disallow: /language/ Disallow: /libraries/ Disallow: /media/ Disallow: /modules/ Disallow: /plugins/ Disallow: /templates/ Disallow: /tmp/ Disallow: /xmlrpc/ Disallow: /*.pdf Disallow: /*.swf Disallow: /*print=1 Disallow: /*mailto/ Sitemap: http://yoursite.ru/sitemap Host: yoursite.ru
Создание модуля для для Joomla 2.5 и 3 значительно проще, чем создание компонента, который обычно реализует более сложную бизнес-логику. Обычно, стандартный модуль в Joomla представляет собой следующую структуру файлов:
mod_name (папка с файлами модуля, где name – это имя модуля):
– mod_name.xml (файл описания модуля в xml-формате)
– mod_name.php (основной файл модуля)
– helper.php (необязательный файл)
– index.html (пустой html-файл)
– tmpl (папка с шаблонами оформления вывода содержания блока)
– default.php (шаблон оформления по умолчанию)
– index.html (пустой html-файл)
Рассмотрим пример простейшего модуля «mod_news».
Пример содержания xml-файла mod_news.xml (необходимый файл, без которого вы не сможете установить модуль) :
<?xml version="1.0" encoding="utf-8"?> <extension type="module" version="2.5.0" method="install"> <name>mod_news</name> <author>Andrew</author> <creationDate>18.03.2013</creationDate> <copyright>Copyright (C) 2013 All rights reserved.</copyright> <license>GNU General Public License</license> <authorEmail>admin@myemail.ru</authorEmail> <authorUrl>poleshuk.ru</authorUrl> <version>2.5.0</version> <description>MOD_NEWS_XML_DESCRIPTION</description> <files> <filename module="mod_news">mod_news.php</filename> <folder>tmpl</folder> <filename>index.html</filename> <filename>mod_news.xml</filename> <filename>helper.php</filename> </files> </extension>
<?php /** * здесь описание и комментарии */ defined('_JEXEC') or die; // подключаем наш хелпер require_once __DIR__ . '/helper.php'; //вызываем метод getNews(), который находится в хелпере //(извлекает из базы данных нужную нам информацию $news = modNewsHelper::getNews(); //подключаем html-шаблон для вывода содержания модуля (шаблон default). require JModuleHelper::getLayoutPath('mod_news', $params->get('layout', 'default'));
<?php defined('_JEXEC') or die; class modNewsHelper { public static function getNews() { //подключаемся к базе данных $app = JFactory::getApplication(); $db = JFactory::getDbo(); //здесь какие-то действия и запросы к базе данных ... //возвращаем результат return $rows; } }
<?php defined('_JEXEC') or die; ?> <?php foreach ($news as $item) : ?> <li><?php echo $item->title;?></li> <li><?php echo $item->data;?></li> <?php endforeach; ?>
Пример простого запроса SELECT из одной таблицы:
// Подключаемся к базе данных $db = JFactory::getDbo(); // Создаем новый объект запроса $query = $db->getQuery(true); // Извлекаем из таблицы профилей все записи, //где тип профиля начинается с "custom" // Добавляем сортировку $query->select(array('user_id', 'profile_type', 'profile_value', 'ordering')); $query->from('#__user_profiles'); $query->where('profile_type LIKE \'custom.%\''); $query->order('ordering ASC'); // Устанавливаем запрос $db->setQuery($query); // Загружаем результат как список stdClass объектов $results = $db->loadObjectList();
$query ->select(array('user_id', 'profile_type', 'profile_value', 'ordering')) ->from('#__user_profiles') ->where('profile_type LIKE \'custom.%\'') ->order('ordering ASC');
// Подключаемся к базе данных $db = JFactory::getDbo(); // Создаем новый объект запроса $query = $db->getQuery(true); // Извлекаем все статьи пользователей, чье имя начинается с 'a' // Упорядочиваем по дате создания $query ->select(array('a.*', 'b.username', 'b.name')) ->from('#__content AS a') ->join('INNER', '#__users AS b ON (a.created_by = b.id)') ->where('b.username LIKE \'a%\'') ->order('a.created DESC'); // Устанавливаем запрос $db->setQuery($query); //Загружаем результаты как список stdClass объектов. $results = $db->loadObjectList();
$query ->select(array('a.*', 'b.username', 'b.name', 'c.*', 'd.*')) ->from('#__content AS a') ->join('INNER', '#__users AS b ON (a.created_by = b.id)') ->join('LEFT', '#__user_profiles AS c ON (b.id = c.user_id)') ->join('RIGHT', '#__categories AS d ON (a.catid = d.id)') ->where('b.username LIKE \'a%\'') ->order('a.created DESC');
// Подключаемся к базе данных $db = JFactory::getDbo(); // Создаем новый объект запроса $query = $db->getQuery(true); // Столбцы, куда происходит вставка $columns = array('user_id', 'profile_key', 'profile_value', 'ordering'); // Значения $values = array(1001, $db->quote('custom.message'), $db->quote('Inserting a record using insert()'), 1); // Подготавливаем запрос $query ->insert($db->quoteName('#__user_profiles')) ->columns($db->quoteName($columns)) ->values(implode(',', $values)); // Устанавливаем запрос $db->setQuery($query);
$db = JFactory::getDbo(); $query = $db->getQuery(true); // Обновляемые поля $fields = array( 'profile_value=\'Обновляем custom сообщение для пользователя с id = 42\'', 'ordering=2'); // Условия $conditions = array( 'user_id=42', 'profile_key=\'custom.message\''); $query->update($db->quoteName('#__user_profiles'))->set($fields)->where($conditions); $db->setQuery($query); try { $result = $db->query(); catch (Exception $e) { // Ловим ошибку }
// Создаем объект для записи, которую мы собираемся обновлять $object = new stdClass(); // Задаем значения $object->id = 1; $object->title = 'Моя запись'; $object->description = 'Мы обновляем запись в базе данных'; try { // Обновляем данные в таблице пользователей, используя id как the primary key. $result = JFactory::getDbo()->updateObject('#__custom_table', $object, 'id'); } catch (Exception $e) { // ловим ошибку }
$db = JFactory::getDbo(); $query = $db->getQuery(true); // Удаляем все custom ключи для пользователя 1001. $conditions = array( 'user_id=1001', 'profile_key LIKE \'custom.%\''); $query->delete($db->quoteName('#__user_profiles')); $query->where($conditions); $db->setQuery($query); try { $result = $db->query(); } catch (Exception $e) { // ловим ошибку }
Если вы пишите собственные модули, компоненты или плагины для Joomla и планируете использовать сессии для сохранения и извлечения данных, то вам необходимо использовать класс Joomla для работы с сессиями. Только в этом случае, ваши переменные будут доступны для других компонентов Джумла, а ваш скрипт сможет получать доступ к переменным, сохраняемым в сессии Джумлой.
В первую очередь мы должны получить объект сессии Joomla:
$session = JFactory::getSession();
$session->set('my_variable', 'значение');
$my_variable = $session->get('my_variable');
$my_variable = $session->get('my_variable', 'здесь значение по умолчанию');
$session->clear('my_variable');
$my_array = array('test1' => '1', 'test2' => '2'); $session->set('my_array', $my_array);
$sess_id = $session->getId();
$session->destroy();
$expire = $session->getExpire();
В Евросоюзе относительно недавно появилась проблема: законодательство потребовало от сайтов использовать куки только в случае согласия пользователя. Конечно, это не относится к таким важным для работоспособности сайта вещам, как авторизация, но социальные кнопки, видео со сторонних сервисов не могут сохранять информацию в куках без одобрения юзера.
Конечно, уже появилиь некоторые платные решения для сайтов, однако, они не универсальны и несовершенны, например, плагин Monster Cookies. Промучившись с ним, я его полностью снес, позаимствовав лишь некоторые стили оформления диалогового окна.
На сайте стояли кнопки соцсетей, Гугл Аналитикс, модуль видео от Vimeo. Мне удалось закрыть это все с возможностью выбора для пользователя «Accept Cookies». Использовал как JavaScript, так и php.
Принцип прост: если пользователь нажимал «принять куки», в куках сохранялась переменная cookies_accept. Далее в зависимости от ее существования уже подгружался (или нет) закрытый контент.
Что-то типа такого:
if(isset($_COOKIE["cookies_accept"]) && $_COOKIE["cookies_accept"]=="accept"): //не меняем output else: $output="<img src='картинка' title='You need to accept the cookies to use it'>"; endif;
<script> function setCookie (name, value, expires, path, domain, secure) { document.cookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); } function getCookie(name) { var cookie = " " + document.cookie; var search = " " + name + "="; var setStr = null; var offset = 0; var end = 0; if (cookie.length > 0) { offset = cookie.indexOf(search); if (offset != -1) { offset += search.length; end = cookie.indexOf(";", offset) if (end == -1) { end = cookie.length; } setStr = unescape(cookie.substring(offset, end)); } } return(setStr); } cookies_accept=""; cookies_accept = getCookie("cookies_accept"); if(cookies_accept=="accept"){ request=jQuery.ajax({ type: 'POST', url: '/ajax/get_video.php', data: 'sss=1', success: function(request) { jQuery('.vimeo').html(request); } }); jQuery("div.cc-cookies").addClass('content-hidden'); var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxx']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); }else{ jQuery(".cc-cookies").removeClass('content-hidden'); } jQuery(document).ready(function(){ jQuery("#accept").click(function(){ jQuery("div.cc-cookies").addClass('content-hidden'); setCookie("cookies_accept", "accept"); }); }); </script>