Как в произвольном месте index.php вывести заголовок страницы

<?php
$document = &JFactory::getDocument();
echo $document->title;
?>

Написанное актуально для
Joomla 1.5.x

Добавлено: 19 Июля 2018 21:43:43 Добавил: Андрей Ковальчук

Как увеличить время выполнения PHP скриптов в Joomla?

Как увеличить время выполнения 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); ?>

или добавив в файл .htaccess следующий код:
php_value max_execution_time 120

Если такого файла в корне нет создайте его, с этим содержанием.

2. В том случае если все эти меры не привели к нужному результату и ошибка Maximum execution time of 30 seconds exceeded присутствует то ничего не остается как обратиться к хостеру с просьбой об увеличении времени выполнения PHP-скриптов, допустим до 2 минут.

Добавлено: 08 Мая 2018 17:16:03 Добавил: Андрей Ковальчук

Настройка robots.txt для Joomla и Virtuemart

У вас сайт на 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: * - обозначает, что правила robots.txt, действуют для всех поисковых систем.
Disallow: - устанавливает запрет на индексацию.
Allow: - разрешает индексацию, выбранного пути.
Как мы видим стандартный файл robots.txt запрещает индексацию картинок сайта Disallow: /images/, что автоматически лишает ваш сайт посещений с Google и Яндекс картинок. Также хорошо было бы прописать путь к вашей карте сайта и указать директиву Host: для исключения нежелательных отображений вашего сайта, выбрав только один вид с www или без www. Исключим нежелательную индексацию, pdf файлов, swf анимации, почтовых ссылок и путей печати. После настройки файла robots.txt получаем следующее.

Правильно настроенный файл robots.txt для Joomla.
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

Можно еще точнее настроить файл robots.txt для Joomla, ввести директивы отдельно для поисковой системы Yandex, после настройки роботс.тхт будет выглядеть так:
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

Т.к. файлы интернет магазина Virtuemart, находятся в папке /components/, нужно установить дополнительный путь к индексации товаров магазина. Этот вариант настройки robots.txt также подходит и для Virtuemart 2.
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

Директива Allow: /components/com_virtuemart/ открыла путь к индексации нашего интернет магазина на Virtuemart.

Добавлено: 08 Мая 2018 10:43:02 Добавил: Андрей Ковальчук

Создание модуля для Joomla 2.5 и 3.

Создание модуля для для 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>

Как видно из примера, сначала включается информация об авторе и версиях, затем – информация о файлах и папках, которые поставляются с модулем.

Пример содержания файла mod_news.php (основной файл модуля):
<?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'));

Пример хэлпера helper.php
<?php
 
defined('_JEXEC') or die;
 
class modNewsHelper
{
	public static function getNews()
	{
		//подключаемся к базе данных
		$app	= JFactory::getApplication();
		$db = JFactory::getDbo();
 
		//здесь какие-то действия и запросы к базе данных
		...
		//возвращаем результат
		return $rows;
	}
}

Файл вывода содержимого нашего модуля default.php
<?php
defined('_JEXEC') or die;
?>
<?php foreach ($news as $item) : ?>
	<li><?php echo $item->title;?></li>
	<li><?php echo $item->data;?></li>
<?php endforeach; ?>

Добавлено: 07 Апреля 2018 14:27:43 Добавил: Андрей Ковальчук

Работа с базой данных в Joomla 2.5

Пример простого запроса 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');

Запросы типа INSERT
// Подключаемся к базе данных
$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);

UPDATE запросы
$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) {
    // ловим ошибку
}

Пример запроса DELETE
$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) {
   // ловим ошибку
}

Добавлено: 07 Апреля 2018 14:26:10 Добавил: Андрей Ковальчук

Как работать с сессиями в Joomla.

Если вы пишите собственные модули, компоненты или плагины для 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();

Добавлено: 07 Апреля 2018 14:23:23 Добавил: Андрей Ковальчук

Как закрыть куки на сайте Joomla?

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

Конечно, уже появилиь некоторые платные решения для сайтов, однако, они не универсальны и несовершенны, например, плагин 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;

JavaScript:
<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>

Хочется создать какое-то универсальное решение для всех сайтов, но пока ничего не придумал. У каждого свои особенности.

Добавлено: 14 Февраля 2015 15:23:12 Добавил: Андрей Ковальчук