NewsSlidingTabs 1.0
12.08.2009 →Модуль, как и Articles By Date, предназначен, в основном, для новостных сайтов. Выводит так же материалы по дате создания, но использует mootools.
Основан на скрипте sliding-tabs. Как видно из демо, вместо Alpha, Beta ... будет выводится соответствующий день Сегодня, Вчера ... либо дата. В самом теле будут выводиться материалы (вступительный текст) за соответствующую дату.
Articles By Date 1.0.0
12.08.2009 →Модуль для вывода материалов по дате создания. Вывод материалов выглядит следующим образом:
сегодня
---------------------------------------------------------------------
Заголовок Новость 1
Заголовок Новость 2
вчера
---------------------------------------------------------------------
Заголовок Новость 1
Заголовок Новость 2
2 дня назад
---------------------------------------------------------------------
Заголовок Новость 1
Заголовок Новость 2
... и т.д.
NewsTicker 1.0
12.08.2009 →Простенький модуль для вывода заголовков материалов в виде печатующего текста. Основан на скрипте so_ticker
Создание контент плагина
05.06.2009 Документация Joomla 2.5 → Разработка модуля Joomla 2.5Существует достаточно много способностей использования Контент Плагина. Они имеют отношение к показу Вашего контента и Ваших статей. Для создания контент плагина понадобиться как минимум два файла: XML и PHP. Поскольку есть много различий между двумя Контент Плагинами в PHP файле рассмотрим их оба. Так же к плагину можно добавить файл локализации .ini.
XML файл
Файл XML называют так же как и файл PHP, и он является одним из необходимых файлов. Этот файл всегда начинается с тегов XML, где определятся кодировка:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install PUBLIC
"-//Joomla! 1.5//DTD plugin 1.0//EN" "http://dev.joomla.org/xml/1.5/plugin-install.dtd">
Что бы определить что устанавливается именно плагин, относящийся к контенту добавляем строчку:
<install version="1.5" type="plugin" group="content">
type определит что это плагин, group определит что он относится к Контент Плагину.
Дальше можно добачить немного информации о разработчике и плагине:
<name>Имя Контент Плагина</name>
<creationDate>Дата создания</creationDate>
<author>Имя автора</author>
<authorEmail>e-mail автора</authorEmail>
<authorUrl>website автора</authorUrl>
<copyright>Copyright</copyright>
<license>Лицензия, для примера GNU/GPL</license>
<version>Версия плагина</version>
<description>Описание плагинаr</description>
Теперь подключаем PHP файл к Контент Плагину. Название этого файла должно быть таким же как и XML файла.
<files>
<filename plugin="nameofplugin">nameofplugin.php</filename>
</files>
Как видите имя файла еще ставится в теге <filename plugin="nameofplugin">. Если нужно использовать больше одного файла, то поместите их в теги <filename> между тегами <files> и </files>.
Подключени локализации производится с помощью тегов <languages>
<languages>
<language tag="en-GB">en-GB.plg_content_nameofplugin.ini</language>
</languages>
Опционально, Вы можете добавить свои параметры к Плагину, это делается так:
<params>
<param name="paramname" type="typeofparameter" default="defaultsetting" label="title" description="description"/>
</params>
- name - название параметры. Это название будет использоваться в PHP файле;
- type - тип параметра, подробнее читайе Joomla Standard parameter types;
- default - значение по умолчанию;
- label - название параметра, отображаемое в Менеджере Плагинов при редактировании;
- description - описание раметра;
Если Вы не используете никаких параметров, вставьте следующий тег:
<params/>
Конец установочного XML файла заканчивается тегом:
</install>
PHP файл
Начинается код плагина, как и все файлы Joomla с защиты:
После этого Вы должны подключить главный плагин Joomla из библиотеки:
jimport( 'joomla.plugin.plugin' );
Что бы указать что используется Контент Плагин, добавьте следующий код:
class plgContentNameofplugin extends JPlugin {
Обратите внимания как используютя заглавные буквы. Вы должны заменить Nameofplugin на название своего плагина.
Теперь пришло времы создавать сам плагин:
/**
* Constructor
*
* Для PHP 4 мы не должны использовать __constructor как constructor для плагинов
* потому что функция func_get_args ( void ) возвратит копии всех переданных ссылок параметров в NOT.
* Это вызывает проблемы с системой перекрестных ссылок.
* @param object $subject Объект наблюдения
* @param object $params Объект, который содержит параметры
* @since 1.5
*/
function plgContentNameofplugin( &$subject, $params )
{
parent::__construct( $subject, $params );
}
Теперь нужно выбрать когда будет выводится плагин. Можно выбрать из следующего:
- onBeforeContentSave - Это событие возникает перед тем как контент запишется в БД;
- onAfterContentSave - Это событие возникает после того как контент запишется в БД;
- onPrepareContent - Это первый этап в подготовке материала для вывода и это самое основное событие для плагинов, ориентированных на работу с материалами. На этом этапе выполняется большая часть их работы. Перед тем, как вывести текст на экран, он может быть обработан в соответствии с вашими требованиями и параметрами самого материала;
- onAfterDisplayTitle - Событие возникает для информирования плагина о возможности вывести текст между заголовком и текстом материала;
- onBeforeDisplayContent - Это событие для определения, что должно быть размещено непосредственно перед сгенерированным контентом;
- onAfterDisplayContent - Событие возникает для информирования плагина о выводе информации непосредственно после сгенерированного материала;
Более подробную информацию о событиях можно найти здесь - (Joomla) Content Events for Plugin System.
onBeforeContentSave и onAfterContentSave
Используйте следующий код:
function onBeforeContentSave( &$article, $isNew )
{
global $mainframe;
//добавляем код плагина здесь
return true;
}
Параметры article и isNew должны содержать следующее:
- article - Ссылается на объект JTableContent, который сохраняетсятся и содержит данные статьи.
- isNew - Переменная (boolean), которая возвращает истину, если материл был создан.
onPrepareContent
function onPrepareContent( &$article, &$params, $limitstart )
{
global $mainframe;
//добавлеям код плагина здесь
//не возвращает значения
}
Параметры article, params и limitstart содерджат следующее:
- article - Ссылается на статью, которая выполняется представлением.
- params - Ссылается на ассоциативный массив соответствующих параметров.
- limitstart - Целое число, определяющее "страницу" контента, которая должна быть сгенерирована.
onAfterDisplayTitle, onBeforeDisplayContent и onAfterDisplayContent
Для них код будет идентичен:
function onAfterDisplayContent( &$article, &$params, $limitstart )
{
global $mainframe;
//добавлеям код плагина здесь
return '';
//возвращает строковое значение. Возвращенное значение из этого события отображается в placeholder.
//Большинство шаблонов отображает placeholder после разделителя материала.
}
Параметры article, params и limitstart содерджат следующее:
- article - Ссылается на статью, которая выполняется представлением.
- params - Ссылается на ассоциативный массив соответствующих параметров.
- limitstart - Целое число, определяющее "страницу" контента, которая должна быть сгенерирована.
Пример PHP файла
Этот Контент Плагин позволит отображать модули в области контента. Эта функция будет включена в Joomla 1.6 и уже доступна начиная с версии 1.5.10.
<?php
// The general information at the top of each file
/**
* @version $Id$
* @package Joomla
* @copyright Copyright (C) 2005 - 2009 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License, see LICENSE.php
*/
// No direct access allowed to this file
defined( '_JEXEC' ) or die( 'Restricted access' );
// Import Joomla! Plugin library file
jimport('joomla.plugin.plugin');
//The Content plugin Loadmodule
class plgContentLoadmodule extends JPlugin
{
/**
* Plugin that loads module positions within content
*/
// onPrepareContent, meaning the plugin is rendered at the first stage in preparing content for output
public function onPrepareContent( &$row, &$params, $page=0 )
{
// A database connection is created
$db = JFactory::getDBO();
// simple performance check to determine whether bot should process further
if ( JString::strpos( $row->text, 'loadposition' ) === false ) {
return true;
}
// expression to search for
$regex = '/{loadposition\s*.*?}/i';
// check whether plugin has been unpublished
if ( !$this->params->get( 'enabled', 1 ) ) {
$row->text = preg_replace( $regex, '', $row->text );
return true;
}
// find all instances of plugin and put in $matches
preg_match_all( $regex, $row->text, $matches );
// Number of plugins
$count = count( $matches[0] );
// plugin only processes if there are any instances of the plugin in the text
if ( $count ) {
// Get plugin parameters
$style = $this->params->def( 'style', -2 );
$this->_process( $row, $matches, $count, $regex, $style );
}
// No return value
}
// The proccessing function
protected function _process( &$row, &$matches, $count, $regex, $style )
{
for ( $i=0; $i < $count; $i++ )
{
$load = str_replace( 'loadposition', '', $matches[0][$i] );
$load = str_replace( '{', '', $load );
$load = str_replace( '}', '', $load );
$load = trim( $load );
$modules = $this->_load( $load, $style );
$row->text = preg_replace( '{'. $matches[0][$i] .'}', $modules, $row->text );
}
// removes tags without matching module positions
$row->text = preg_replace( $regex, '', $row->text );
}
// The function who takes care for the 'completing' of the plugins' actions : loading the module(s)
protected function _load( $position, $style=-2 )
{
$document = &JFactory::getDocument();
$renderer = $document->loadRenderer('module');
$params = array('style'=>$style);
$contents = '';
foreach (JModuleHelper::getModules($position) as $mod) {
$contents .= $renderer->render($mod, $params);
}
return $contents;
}
}
INI файл(ы)
Для локализации плагина удобно создавать ini файлы. В которых будут хранится значения переменных, выводящих текст.
MODE=Mode
SELECT HOW THE EMAILS WILL BE DISPLAYED=Select how the e-mails will be displayed
NONLINKABLE TEXT=Nonlinkable text
AS LINKABLE MAILTO ADDRESS=As linkable mailto address
Советы:
- В PHP файлах часто забывают ставить (;) в конце строки, которая естественно будет вызывать ошибку. Проверяйте это регулярно, перед тем как тестировать свой плагин и это избавит Вас от многих ошибок.
- Забодьтесь о том что бы правильно объявлять параметры в XML файле. Все параметры которые объявляете должны быть закрыты правильно, тегом </param>.
- Тестируйте плагины на локальном компьютере, это поможет сократить Ваше время и нервы. Вы сможете быстро исправить ошибку.
- Типичный архив плагина содержит следующие файлы:
- nameofplugin.XML
- nameofplugin.PHP
- en-GB.plg_content_nameofplugin.ini
Создание плагина для Joomla 1.5
05.06.2009 Документация Joomla 2.5 → Разработка модуля Joomla 2.5Эти практические рекомендации должны предоставить Вам основы, для того что бы могли создавать свои плагины. Большинство плагинов в Joomla состоят из одного файла, но так же потребуется еще установочный файл XML.
Создаем установочный файл
Как и все адоны в Joomla? плагины легко устанавливаются через .zip файлы (так же поддерживаются .tar.gz). Но они должны иметь правильный установочный XML файл. Вот пример такого файла для категорий searchbot плагина:
<?xml version="1.0" encoding="iso-8859-1"?>
<install version="1.5" type="plugin" group="search">
<name>Categories searchbot</name>
<author>Joomla! Project</author>
<creationDate>November 2005</creationDate>
<copyright>(C) 2005 Open Source Matters. All rights reserved.</copyright>
<license>GNU/GPL</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>1.1</version>
<description>Allows searching of Categories information</description>
<files>
<filename plugin="categories.searchbot">categories.searchbot.php</filename>
</files>
<params>
<param name="search_limit" type="text" size="5" default="50" label="Search Limit" description="Number of search items to return"/>
</params>
</install>
Как можно видеть это практически такой же XML, который использовался в модуле и компоненте. Различие состоит в том, что в теге <install> появилась группа group="xxx" и расширенная информация в теге <filename>. Эта информация говорит Joomla в какую директорию копировать файл и в какую группу добавлять плагин.
Если Вы создаете плагин , который будет отвечать на сущестующие основные события, то группа должна соответствовать этим событиям. Например group="authentication" или group="user". В создании нового плагина, отвечающего за основные события важно что бы имя плагина было уникально. И не совпадало с другими именами плагинов.
Если Вы создаете плагин, который будет отвечать на не основные события, то выбор группы может быть любым, главное что бы он не совпадал с уже существующими.
Создаем плагин
В Joomla 1.5, в отличие от Joomla 1.0 ввели более объектно-ориентированный метод написания плагинов. Пример шаблона для плагина:
<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
// Import library dependencies
jimport('joomla.event.plugin');
class plg<PluginGroup><PluginName> extends JPlugin
{
/**
* Constructor
*
* For php4 compatability we must not use the __constructor as a constructor for
* plugins because func_get_args ( void ) returns a copy of all passed arguments
* NOT references. This causes problems with cross-referencing necessary for the
* observer design pattern.
*/
function plg<PluginGroup><PluginName>( &$subject )
{
parent::__construct( $subject );
// load plugin parameters
$this->_plugin = > JPluginHelper::getPlugin( '<GroupName>', '<PluginName>' );
$this->_params = new JParameter( $this->_plugin->params );
}
/**
* Plugin method with the same name as the event will be called automatically.
*/
function <EventName>()
{
global $mainframe;
// Plugin code goes here.
return true;
}
}
?>
Использование плагина в коде
Итак Вы создали плагин, наверняка нужно его теперь вывести. В ядре Joomla встроенно достаточно много событий с помощью которых можно выводить плагины. Код будет таким:
$dispatcher =& JDispatcher::getInstance(); $results = $dispatcher->trigger( '<EventName>', <ParameterArray> );
Здесь важно отметить что параметры должны быть в массиве. Сама функция получит параметры как единственное значение.
Если Вы создаете плагин, для неосновного случая, так же важно не забыть активировать его, после того как Вы установили его. И конечно предшествовать любой ссылке Вашего плагина должна команда JPluginHelper::importPlugin().
Создание модуля часть 2
04.06.2009 ШаблоныВ первой части был продемонстрирован приметивный модуль, который фактически ничего не делал. Теперь рассмотрим более сложный модуль с использованием MVC. Итак второй модуль назовем "Hello World 2", который должен будет содержать следующие файлы:
- /modules/mod_hello_world2/index.html
- /modules/mod_hello_world2/mod_hello_world2.php
- /modules/mod_hello_world2/mod_hello_world2.xml
- /modules/mod_hello_world2/helper.php
- /modules/mod_hello_world2/en-GB.mod_hello_world2.ini
- /modules/mod_hello_world2/tmpl/index.html
- /modules/mod_hello_world2/tmpl/default.php
Как можно заметить различия состоит в том, что появилось 3 дополнительных файла: helper.php, tmpl/default.php, и en-GB.mod_hello_world2.ini. Цель в добавлении первых двух файлов является двоякой. Во-первых вся логика и доступ к БД будет осуществлятся в файле helper.php. Во-вторых появится шаблон вывода информации (/tmpl/default.php). Такое разделение очень полезно, так как не затрагивая логику, можно будет легко переделать шаблон под свой сайт.
/modules/mod_hello_world2/mod_hello_world2.php:
<?php
//no direct access
defined('_JEXEC') or die('Direct Access to this location is not allowed.');
// подключаем файл helper.php
require_once(dirname(__FILE__).DS.'helper.php');
// берем параметры из файла конфигурации
$userCount = $params->get('usercount');
// берем items из файла helper
$items = ModHelloWorld2Helper::getItems($userCount);
// подключаем шаблон для отображения
require(JModuleHelper::getLayoutPath('mod_hello_world2'));
Важное отличие здесь является в том что мы подключаем вспомогательный файл helper.php, который будет "рабочей лошадкой" для нашего модуля. Вся логика и работа с данными будет происходит в нем, затем передоваться в шаблон вывода, который будет использовать данные по своему усмотрению.
/modules/mod_hello_world2/mod_hello_world2.xml
<?xml version="1.0" encoding="utf-8"?>
<install type="module" version="1.5.0">
<!-- Name of the Module -->
<name>Hello World 2 - Hello</name>
<!-- Name of the Author -->
<author>Ambitionality Software LLC</author>
<!-- Version Date of the Module -->
<creationDate>2008-06-23</creationDate>
<!-- Copyright information -->
<copyright>All rights reserved by Ambitionality Software LLC 2008.</copyright>
<!-- License Information -->
<license>GPL 2.0</license>
<!-- Author's email address -->
<authorEmail>info@ambitionality.com</authorEmail>
<!-- Author's website -->
<authorUrl>www.ambitionality.com</authorUrl>
<!-- Module version number -->
<version>1.0.0</version>
<!-- Description of what the module does -->
<description>Provides a random listing of registered users</description>
<!-- Listing of all files that should be installed for the module to function -->
<files>
<!-- The "module" attribute signifies that this is the main controller file -->
<filename module="mod_hello_world2">mod_hello_world2.php</filename>
<filename>index.html</filename>
<filename>helper.php</filename>
<filename>tmpl/default.php</filename>
<filename>tmpl/index.html</filename>
</files>
<languages>
<!-- Any language files included with the module -->
<language tag="en-GB">en-GB.mod_hello_world2.ini</language>
</languages>
<!-- Optional parameters -->
<params>
<!-- parameter to allow placement of a module class suffix for the module table / xhtml display -->
<param name="moduleclass_sfx" type="text" default="" label="Module Class Suffix" description="PARAMMODULECLASSSUFFIX" />
<!-- just gives us a little room between the previous paramter and the next -->
<param name="@spacer" type="spacer" default="" label="" description="" />
<!-- A parameter that allows an administrator to modify the number of users that this module will display -->
<param name="usercount" type="text" default="5" label="LABEL USER COUNT" description="DESC USER COUNT" />
</params>
</install>
Основные отличия в том, что добавилась ссылка на файл локализации и добавились некоторые параметры.
/modules/mod_hello_world2/helper.php:
<?php
defined('_JEXEC') or die('Direct Access to this location is not allowed.');
class ModHelloWorld2Helper
{
/**
* Returns a list of post items
*/
public function getItems($userCount)
{
// подключаемся к БД
$db = &JFactory::getDBO();
// берем список случайных пользователей ограниченных переменной $userCount
$query = 'SELECT a.name FROM `#__users` AS a ORDER BY rand() LIMIT ' . $userCount . '';
$db->setQuery($query);
$items = ($items = $db->loadObjectList())?$items:array();
return $items;
} //конец функции getItems
} //end SimplestForumLatestPostsHelper
Этот вспомогательный класс (замедьте он называется так же как называется модуль) просто возвращает список случайных (random) пользователей, ограниченный количеством $userCount.
/modules/mod_hello_world2/tmpl/default.php:
Здесь просто с помощью цикла распечатывается список имен пользователей, полученных от помощника (helper.php).
/modules/mod_hello_world2/en-GB.mod_hello_world2.ini:
LABEL USER COUNT=Счетчик пользователя
DESC USER COUNT=Количество пользователей
RANDOM USERS=Случайные пользователи для Hello World2
USER LABEL=%s это случайный список пользователей
Здесь мы просто идентифицируем строки, которые появляются в файле конфигурации модуля и шаблоне модуля (операторы JText:: _ или JText:: sprintf). Это позволяет легко локализовать (перевести) модуль на любой язык не затрагивая основные файлы .
Создание модуля часть 1
28.05.2009 ШаблоныБудем начинать с создания приметивного модуля. Создадаим простой модуль, который будет выводить надпись "Администратор". Этот модуль может использоваться как фундамент, что бы на его основе создавать более сложные модули.
Для начала создадим папку, в которой будет находиться модуль. Как принято имя папки должно начинаться с приставки mod_ и дальше должно идти название модуля, т.е. в нашем случае папка будет называться mod_admin. В созданной папке создадим файл mod_admin.php содержащий следующее:
Как видно код состоит всего из 2-х строчек:
Используется во всех расширениях Joomla. Это своего рода защита от прямого обращения к скрипту.
В этой строчке непосредственно выводится приветствие с помощью команды echo. Обратите внимание, что здесь используется встроенный класс
Затем создадим файл XML, который будет указывать Joomla как и куда устанавливать модуль. Название этого файла такое же как было описано выше, только расширение будет *.xml. Итак создаем и сохраняем в нашей папке файл mod_admin.xml, содержащий следуещее:
<?xml version="1.0" encoding="utf-8"?>
<install type="module" version="1.5.0">
<name>Админ</name>
<!-- The following elements are optional and free of formatting conttraints -->
<creationDate>Март 2009</creationDate>
<author>Николай S.</author>
<authorEmail>kolyamba831@inbox.ru</authorEmail>
<authorUrl>http://www.joomlafree.ru</authorUrl>
<copyright>All rights reserved</copyright>
<license>GNU/GPL</license>
<version>1.0.0</version>
<description>Простой модуль - выводит слово "Администратор" </description>
<files>
<filename module="mod_admin">mod_admin.php</filename>
</files>
</install>
Рассмотрим его подробнее:
- Начльный тэг <install> инструктирует Joomla что устанвливается модуль, совместимый с версиями 1.5 и выше;
- <name> - определяет название модуля;
- <author> - имя автора;
- <creationDate> - дата создания;
- <copyright> - сведения о копирайте;
- <license> - лицензия;
- <authorEmail> - e-mail автора;
- <authorUrl> - сайт автора;
- <version> - версия модуля;
- <description> - описание модуля;
- <filename> - определяет файлы (элементы), которые использует модуль. В данном случае 1 файл;
Это все что потребуется для создания простейшего модуля. Все что остается зделать это запокавать папку mod_hello в архив ZIP и установить этот модуль через Менеджер Расширений (Extension Manager) Расширения -> Установить/Удалить. Так же не забыть опубликовать этот модуль в нужной позиции.
Добавление дополнительного параметра к материалу
10.03.2009 ОбщиеИногда, для автоматизации, необходимо к материалу добавить еще параметр, в зависимости от которого будет выводиться то что Вам требуется. В этой статье я раскажу как это можно реализовать. На примере Вы сможете добавлять/удалять свои (и стандартные) параметры в группе расширенных параметров материала.
Добавляем заголов материала к ссылке Подробнее...
06.03.2009 НовостиВ Joomla материал можно разбить на две части - вступительный текст и основной текст. И когда Вы создаете блог категории, раздела либо публикуете материалы на главной странице, то в начале виден вступительный текст, затем идет кнопка "Подробнее". Нажав на которую происходит переход на вид вывода материала и виден вступительный текст и полный текст, либо просто полный текст. В этой статье рассказывается как к этой кнопоке (ссылке) "Подробнее" добавить заголовок материала.
Шаблоны вывода контента
03.03.2009 ОбщиеВ этой статье рассматривается стандартные шаблоны вывода контента в Joomla 1.5. Изначально в Joomla есть 5 основных способов выводда контента - это вывод первой страницы, материала, категории, разддела и архива. Прочитав эту статью, надеюсь, Вы поймете основной принцип вывода контента в Joomla. Для изменения структуры вывода контента много знаний не надо, достаточно знать представление о HTML, ну и конечно CSS.