Создание шаблонов Joomla!

Создание шаблонов – пожалуй, одно из самых приятных занятий, с которым можно столкнуться в процессе разработки сайта под управлением CMS Joomla!. Наши идеи могут быть легко воплощены в жизнь, никаких преград перед нами не стоит.

Для чего нужен шаблон joomla?
  • Создает расположение элементов страницы
  • Отображает все системные и модульные позиции cms
  • Обеспечивает функционирование пользовательской части
  • Задает определенные стили форматирования текста
Шаблон состоит из
  • файла index.php, определяющий базовую разметку страницы вашего сайта
  • файл CSS-стилей, который отвечает за оформление блоков страницы (цвета, размеры шрифтов и т.п)
  • XML-файл для установки шаблона
  • Файл графического предпросмора Приведенный выше список является обязательным для того, чтобы шаблон был установлен через панель администратора.
    Шаблон может содержать значительно большее число файлов.

Подготовка к созданию

Для начала нам потребуется создать структуру папок самого шаблона. Удобнее всего начать создание непосредственно на локальном сервере denwer или его аналоге.
Таким образом мы сможем следить за всем процессом локально.

  1. Все шаблоны располагаются в /templates/
  2. Создаем свою папку (допустим my)
  3. В папке my делаем папки /css, /images, в которых мы будем хранить файлы стилей и картинки
  4. В корневой дирректории шаблона требуется создать 2 файла: index.php и templateDetails.xml; В папке /css создаем файл template_css.css

«Нарезка» макета

Первым этапом верстки является «нарезка» дизайн-макета любым слайсером, схожим с тем, что имеется в Adobe Photoshop и Image Ready.

Тут научить ничему нельзя, так как требуется понимание структуры и метода верстки. 

Я решил показать, как выгдлядел мой сайт в состоянии разбиения на фрагменты. 

Итоги работы со слайсером

На данном этапе мы закончили один из самых важных моментов подготовки для верстки нашего с Вами шаблона, а именно сейчас мы «нарезали» элементы оформления. 

Результаты данной работы не могут быть заменены средствами css и html, при сохранении изображений использовалось 80% качество jpg, что позволило использовать ~ 22кб на графику. Остальные же элементы будут использованны через css стили.

Создание базового css файла

Так как мы будем стараться придерживаться критериев современного понятия верстка, то основную часть нашего шаблона вынесем в файл template_css.css, который был нами уже создан и ждет своего часа.

Напомню, что требуемые файлы для нормального функционирования шаблона — это

  1. index.php
  2. templateDetails.xml
  3. template_css.css

Структура шаблона предполагает наличие папок /css и /images, файл index.php и templateDetails.xml располагаются в корне шаблона, template_css.css в папке /css, в папку /images мы сохраним все картинки, нарезанные слайсером. Для удобства картики мы будем сохранять с человечески понятными именами.

Содержимое файла index.php


<?php
defined( "_VALID_MOS" ) or die( "Прямой вызов файла запрещён." ); // запрет прямого вызова шаблона
$iso = explode( '=', _ISO );
echo '<?xml version="1.0" encoding="'. $iso[1] .'"?' .'>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <!-- тип страницы -->
<head>
<?php mosShowHead();&nbsp; // так задается вывод метатегов ?>
<meta http-equiv="Content-Type" content="text/html; <?php echo _ISO; ?>" />
<link href="<?php echo $mosConfig_live_site; // это у нас url сайта ?>/templates/<?php echo $cur_template; // имя шаблона, можно вписывать и имя папки ?>/css/template_css.css" rel="stylesheet" type="text/css" />
</head>
<body>
  <!-- последующий html код -->
</body>
</html>

Файл templateDetails.xml

 
<?xml version="1.0" encoding "windows-1251"?> 
 
<mosinstall type="template" version="1.0.x"> 
 
   <name>mytemplate</name> 
 
   <creationDate>17/03/2008</creationDate> 
 
   <author>poizon</author> 
 
   <copyright>GPL</copyright> 
 
   <authorEmail> электронная почта автора  </authorEmail> 
 
   <authorUrl>http://eldia.org.ua</authorUrl> 
 
   <version>1.0</version> 
 
   <description>Описание шаблона</description> 
 
</mosinstall>

Но в данном случае шаблон не может быть установлен через администраторскую панель, но тем неменее при прямой закачке в папку templates будет прекрасно работать

Содержимое файла template_css.css пока что сделаем таким

 
html, body { 
 
background:#ffe4cd; /* цвет фона страницы */ 
 
margin:0; /* прижатие к сторонам браузера */ 
 
color:#333333; /* цвет текста по-умолчанию */ 
 
font-size:11pt; /* размер шрифта */ 
 
font-family:Arial, Helvetica, sans-serif; /* используемые шрифты на странице */ 
 
} 
 

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

Создадим меню

Для того, чтобы создать меню в joomla нам потребуется модуль меню и используемые им стили css. Лично я предпочитаю использовать модуль от Mitrich (mod_mljoostinamenu). В настройке данного модуля требуется указать вывод только ссылками — это важно!.
Стиль меню по умолчанию a.mainlevel
Попробуем создать такое же меню как и у меня на сайте. Для этого нам потребуются кружки для меню, которые мы распакуем в папку /images Далее в ранее созданный index.php выставим позицию для модуля. Дальнейшая работа с ним происходит в области
<body> … </body>

Вставляем
<div id=»menus»><?php mosLoadModules(‘top’, -2); ?></div>

В администраторской панели задаем отображение модуля в данную позицию.
В файл template_css.css вносим

 
a.mainlevel /* нормальное отображение пункта меню */ {
background:url(../images/circle.jpg) no-repeat top center; 
/* тут мы выведем кружок в обычном его состоянии */ 
height:109px; /* задаем высоту блока */ 
width:109px; /* задаем ширину блока */ 
display:block; /* тип отображения элемента - блок */
float:left; /* обозначим обтекание по левому краю */
text-align:center; /* отцентрируем текст по центру элемента */
margin-right:25px; /* зададим отсуп между элементов */ 
padding-top:45px; /* укажем высоту отодвижения сожержимого элемента вниз */
color:#e52727; /* цвет текста */ 
font-weight:bold; /* толщина текта */ 
} 
a.mainlevel:hover /* отображение пункта меню при наведении на него */ {
background:url(../images/circle_hover.jpg) no-repeat top left; /* кружок с обводкой */
} 
a.mainlevel#active_menu /* отображение пункта меню при нахождении внутри ссылки */ { 
background:url(../images/circle_active.jpg) no-repeat top left; /* красный кружок */ 
color:#FFFFFF; /* цвет текста - белый */ 
} 
 

В случае, если не было допущено ошибок, то у нас получилось такое же меню как и у меня.
С следующем уроке Мы будем создавать каркас сайта.

Создание системной разметки Joomla!

Как и любой другой cms у Joomla есть шаблонизатор. Вывод любого содержимого осуществляется через специальные «теги», которые в разы проще для освоения, чем в шаблонизаторе Smarty, именно благодаря этому многим удобнее и проще работать именно с joomla. В Joomla сушествует 5 способов задания позиций модулям.

 
<?php mosLoadModules ('left'); ?> 
 

выводит содержимое модуля в таблице

 
<table cellpadding="0" cellspacing="0" class="moduletable"> 
 <tr> 
  <td>
<!-- Содержимое модуля -->
   </td>
  </tr>
</table> 
 
 
<?php mosLoadModules ('user1', 1); ?>
 

используется для вывода модулей горизонтально

 
<?php mosLoadModules ('user1', -1); ?> 
 

выводит содержимое модуля без каких либо внешних тегов

 
<?php mosLoadModules ('user1', -2); ?> 
 

обрамляет модуль в теги <div class=»moduletable»><!— Содержимое модуля —></div>

 
<?php mosLoadModules ('user1', -3); ?> 
 

выводит модуль в 4 слоя. Смысл данного варианта — создание закругленных углов для блока. Данный медот опишу позже.

 
<div class="module"> 
  <div> 
   <div> 
    <div> 
    <!-- Содержимое модуля --> 
    </div> 
  </div> 
 </div> 
</div> 
 

Лично по моему опыту лучше всего использовать вариант номер 3.

Начнем осваивать структуру шаблона Joomla!

Первым делом вспоминаем про «Подготовка к созданию» и «Создание системной разметки joomla». Как известно есть два способа верстки любого макета:

  1.  табличная
  2.  слоями

В именно этой статье я приведу листинг 3х колоночного шаблона, построенного на таблице, так как данный способ будет явно проще для понимания тем, кто только начал осваивать азы.
В итоге применения приведенного в статье кода получится шаблон из 3х колонок с тянущимся по горизонтали центром.

 <?phpdefined( "_VALID_MOS" ) or die( "Прямой вызов файла  запрещён." );$iso = explode( '=', _ISO );echo '<?xml version="1.0"  encoding="'. $iso[1] .'"?' .'>';?><!DOCTYPE html PUBLIC  "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html  xmlns="http://www.w3.org/1999/xhtml"><head><?php  mosShowHead(); ?><meta http-equiv="Content-Type" content="text/html;  <?php echo _ISO; ?>" /><link href="<?php echo  $mosConfig_live_site; ?>/templates/<?php echo $cur_template;  ?>/css/template_css.css" rel="stylesheet" type="text/css"  /></head><body><table width="100%" border="0"  cellpadding="0" cellspacing="0">  <tr>    <td class="left"  width="250"><?php mosLoadModules ('left', -2); ?></td>     <td class="center"><?php mosMainBody(); ?></td>    <td  class="right" width="250"><?php mosLoadModules ('right', -2);  ?></td>   </tr></table></body></html>

Начнем осваивать структуру шаблона Joomla! — 2

В предыдущей статье был описан способ создания простейшего шаблона на основе слоев. В этой статье будет приведен идентичное решение предыдущему способу, только без таблицы.

 <?php defined( "_VALID_MOS" ) or die( "Прямой вызов файла запрещён."  );$iso = explode( '=', _ISO );echo '<?xml version="1.0" encoding="'.  $iso[1] .'"?' .'>';?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML  1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html  xmlns="http://www.w3.org/1999/xhtml"><head><?php  mosShowHead(); ?><meta http-equiv="Content-Type" content="text/html;  <?php echo _ISO; ?>" /><link href="<?php echo  $mosConfig_live_site; ?>/templates/<?php echo $cur_template;  ?>/css/template_css.css" rel="stylesheet" type="text/css"  /></head><body><div id="wrapper"> <div  id="left"><?php mosLoadModules('left', -2); ?></div> <div  id="center"><?php mosMainBody(); ?></div> <div  id="right"><?php mosLoadModules('right', -2); ?></div>   <div  class="clear"></div></div></body></html> 


Файл стилей шаблона должен содержать

 
body { margin:0; }
div.clear {  clear:both; }
div#wrapper div#left, div#center, div#right { float:left;  display:block; }
div#left { width:25%; }
div#center { width:50%;  }
div#right { width:25%; }
 

Создание CSS для Joomla!

В этой статье описано, как научиться применять на практике каскадные таблицы стилей для Joomla! за самое короткое время. В качестве примера и иллюстраций используетя предшественница CMS Joomla! CMS Mambo. За пример взят стандартный шаблон — rhuk_solarflare_ii, который включен в стандартный дистрибютив Mambo и Joomla!
 

1. Изображения со стилями CSS.


Все изображения ниже представляют самые последние стили, реализованные в Mambo CMS 4.5.2.3 на примере шаблона по умолчанию — rhuk_solarflare_ii. Данный шаблон также есть по умолчанию в CMS Joomla!


2. Где находиться файл CSS-стилей сайта на Joomla!?

Каждый шаблон имеет в своей папке файл, названный template_css.css. Этот файл должен находиться в папке my_site/templates/ваш_шаблон/css/.

Структура же шаблона должна быть такой:

my_site/templates/
  |
  +- ваш_шаблон/
       |
       +- index.php
       |
       +- template_thumbnail.png 
       |
       +- templateDetails.xml
       |
       +- css/
       |    |
       |    +- template_css.css
       |
       +- images/

3. Идем дальше.

Прочитав первые две части этой статьи, Вы лишь кратко познакомились со стилями Joomla! (Mambo CMS). Здесь же, я представляю все стили с описанием, чтобы Вам было понятно, что к чему. Вы даже можете использовать этот материал со стилями для своего сайта, просто скопировав нужный Вам стиль. Потому что многие шаблоны не включает в себя некоторые стили, даже которые поставлены в Joomla! по умолчанию.

 /* СТАНДАРТНЫЙ ФАЙЛ CSS ДЛЯ MAMBO 4.5.X ШАБЛОНОВ *//* By Dinh Viet Hung (C)http://www.mambotheme.com: free templates and Professional Templates Club */  /* СТАНДАРТНЫЕ НАСТРОЙКИ *//* Представленные ниже настройки, это настройки по умолчанию, используются, когда нет другого стиля. */ body {} /* Стиль для тэга body вашего сайта, задает фон, шрифты и т.д. */p {} /* Форматирует все <div>, для которых нет своего класса. */td {} /* Форматирует все <td> элементы. Используется, когда для определенной <td> нет своего класса. */tr {} /* Форматирует все <tr> элементы. Используется, когда для определенной <tr> нет своего класса. */ul {} /* Форматирует все <ul> элементы (список). Используется, когда нет своего класса. */a:link {} /* Главный стиль ссылок */a:visited {}a:hover {}hr {} /* горизонтальная линия в вашем шаблоне (разделитель) */hr.separator {} /* НАСТРОЙКИ ФОРМ */ .button {}.inputbox {}.search {} /* форматирует <div>, которые отвечают за элементы поиска: inputbox, search button... */ /* НАСТРОЙКИ НАВИГАЦИИ/МЕНЮ */a.mainlevel{} /* стили для ГЛАВНЫХ элементов меню */a.mainlevel:link {}a.mainlevel:visited {}a.mainlevel:hover {}#active_menu {} /* этот стиль применяется для элемента меню, когда он активный */ul#mainlevel-nav {}ul#mainlevel-nav li{}#mainlevel-nav a:link {}#mainlevel-nav a:visited{}#mainlevel-nav a:hover {}a.sublevel{} /* стили для элементов меню, которые являются подменю */a.sublevel:link {}a.sublevel:visited {}a.sublevel:hover {}.pagenavbar {} /* Устанавливает стиль для нижней навигации ("<< Start < Prev Next > End >>"), когда они не работают как гиперссылки (если размещено всего несколько статей). */.pagenavbar:link {} /* Стиль для нижней навигации ("<< Start < Prev Next > End >>"), когда они работают как ссылки* /.pagenavbar:visited {}.pagenav {} /* форматирование в нижней навигации отображения страниц "<< Start < Previous 1 Next > End >>" */a.pagenav:visited {}a.pagenav:hover {}a.readon:link {} /* Стиль для кнопки "Подробнее" в статье/новости */a.readon:hover {}a.readon:visited {}.back_button {} /* Стиль для кнопки "Вернуться" */.pagenav_prev {} /* Стиль для кнопки "Предыдущий" */.pagenav_next {} /* Стиль для кнопки "Следующий" */.latestnews ul {} /* Стиль для списка последних новостей - по умолчанию, "Последние новости" стоят в позиции user1 */.latestnews li {}.mostread ul{} /* SСтиль для списка популярных новостей - по умолчанию, "Популярные новости" стоят в позиции user2 */.mostread li{} /* НАСТРОЙКИ СТРАНИЦЫ КОНТЕНТА */a.category:link {}a.category:hover {}a.category:visited {}.blogsection {} /* Форматирование ссылок в блоге */.blog_more {} /* "Подробнее" в секции блога */a.blogsection:link {} /* формат ссылок блога */a.blogsection:visited {} a.blogsection:hover {} .componentheading {}/* Название компонента .*/.contentheading {} /* Название стаьи, новости и т.д. */.contentpane {} /* Таблица, в которой находяться компоненты, контакты, но не элементы контента. */.contentpaneopen {} /* Таблица для контента. */.contentpagetitle {} /* Название статьи */a.contentpagetitle:hover {} /* Название статей, новостей и т.д. */a.contentpagetitle:link {}a.contentpagetitle:visited {}.contentdescription {} /* Форматирование "ОПИСАНИЯ" секций, категорий (Новости/Ссылки/Последние новости...) */table.contenttoc {} /* Форматирование таблицы для статей или контента, которые содержат не одну страницу */table.contenttoc td {} /* тоже самое, что и выше, только форматирует ячейки <td> */table.contenttoc th {} /* тоже самое, что и выше, только форматирует название каждой страницы* /table.contenttoc td.toclink {} /* тоже самое, что и выше, только форматирует таблицу, в которой находяться другие страницы */a.toclink:link {} /* тоже самое, что и выше, только форматирует в этой таблицы ссылки */a.toclink:visited {} a.toclink:hover {}  /* ПОКАЗ СЕКЦИЙ MAMBO */.sectiontableheader {} /* Это стиль для отображения заголовка секции Например: заголовок таблицr "Дата", "Название", "Автор" и "Просмотров" */.sectiontableentry1 {} .sectiontableentry2 {} /* ФОРМАТИРОВАНИЕ МОДУЛЕЙ MAMBO */table.moduletable {} /* Форматирование таблицы модуля */table.moduletable th {} /* Форматирование заголовка модуля и названия модуля */table.moduletable td {} /* Форматирование таблицы самого модуля с содержимым */ /* ДРУГОЕ */ /* Даты , Авторы */.createdate {} /* Стиль для отображения даты создания статьи/новости */.modifydate {} /* Стиль для отображения даты последнего обновления статьи/новости */.small {} /* Форматирование "Автор:...." текста */.smalldark {}/* Стиль для результатов опроса, строка "Число голосовавших".. */ /* ОПРОСЫ */.poll {} /* Формат таблицы опроса */.pollstableborder {} /* Задает рамку для опроса */ /* ССЫЛКИ */.weblinks{} /* ну.. форматирует названия объектов */a.weblinks:hover {} /* тоже самое, что и выше, только форматирует ссылки на эти названия */ /* Лента новостей */.newsfeedheading {} /* Заголовок ленты новостей. ВНИМАНИЕ: это не будет затрагивать сами новости */.newsfeeddate {} /* да.. дата ленты новостей */.fase4rdf {} /* Это - основной текст ленты новостей */ /* ПОИСК */table.searchintro {} /* Форматирование поля "Ключевок слово для поиска", а также форматирование результатов поиска */ /* ТАБЛИЦЫ АДМИНИСТРИРОВАНИЯ MAMBO В ВИДИМОЙ ЧАСТИ САЙТА ( FrontEnd) */ /* Эти CSS стили работают только тогда, когда администратор авторизируется */.ontab {}/* Форматирование кнопок "Tab" при редактировании содержания в фронт-энде. Когда это активно или нажато */.offtab {} /* Тоже самое, что и выше. Только когда, это неактивно или не нажато */.tabpadding {} /* Стиль устанавливает позиции для вышеупомянутых стилей */ .tabheading {} /* Не уверен для чего это используется. Немогу пока найти ничего, что с этим связано */.pagetext {} /* Этот стиль используется для редактирования контента во время использования редакторов во фронт-энде */  

4. Joomla! шаблон CSS: Настройка
Обычно, Вы настраиваете template_css.css для того, чтобы полностью доделать свой шаблон ( задать ему соответствующие настройки и дополнить цветовую гамму ), или же просто для того, чтобы Ваш шаблон отличался от других шаблонов. Поэтому, всевозможное редактирование css стилей шаблона Joomla!, наиболее популярно среди пользователей этой системы. Если же Вы не хотите писать свой css стиль заново, то Вы можете открыть любой другой стиль и править его под себя.

5. Все ли это?
template_css.css это только часть создания шаблона под Joomla! CMS. CSS довольно сильно может изменить Ваш сайт. Но расположение модулей также очень важно. 

История создания и развития CMS Joomla!

Данная история развития системы CMS Joomla!, приведенная ниже, со временем будет дополнена детальными фактами и датами. А на данный момент предлагаем вам окунуться в пятнадцатилетную историю создания системы управлением сайтом нового поколения. Год 2000

Компания Rice Studios (ранее называлась Miro, находится в городе Мельбурн, Австралия) выпустила первый релиз программного продукта под названием CMS «Mambo» с закрытым кодом.

Год 2001

В апреле вышла третья версия Mambo, которая стала распространяться по двум различным лицензиям, одна из которых была Open Source. Эта версия получила название Mambo Site Server и была выпущена под лицензией GNU GPL.

Год 2002

Mambo Site Server переименован на Mambo Open Source, чтобы была видна разница между коммерческой и версией с открытым исходным кодом. Проект Mambo Open Source оказался чрезвычайно успешным и получил большое количество престижных Open-Source наград.

Год 2004

Журнал Linux Format удостоил Mambo звание «Лучший проект года свободного программного обеспечения», а журнал Linux User and Developer — званием «Лучшее программное обеспечение для Linux и открытое программное обеспечение». Но самое важное, что шаблоны, предлагаемые системой Mambo, становятся предметом зависти пользователей любой современной на тот момент системы управлением сайтом.

Год 2005Mambo удостоена еще более важных наград, таких как «Лучшее открытое решение» и «Лучшая демонстрация — законченное промышленное решение» — на выставке LinuxWorld, проходившей в Бостоне, и «Лучшее открытое решение» — на выставке LinuxWorld в Сан-Франциско.

В 2005 году коммерческая версия Mambo была переименована в «Jango». Создана организация Mambo Foundation и была поставлена цель, чтобы эта организация способствовала защите принципов Mambo и обеспечивала более структурированную методологию работы.

Создание Mambo Foundation создало раскол в сообществе Mambo Open Source.

Создание этой организации рассматривалось многими как попытка Rise Studio получить контроль над проектом Mambo Open Source.

К сожалению, в августе 2005 года разгорается спор, связанный с принятием решений в координационном совете Mambo Foundation.

Mambo Foundation, в основном состояла из Mambo Open Source разработчиков, которые публично объявили о том, что они намерены отказаться от Mambo Open Source. Разработчики объединяются в неприбыльную организацию под названием Open Source Matters и образуют свою собственную группу, в которую входят основные разработчики, которые решили порвать связи с Rise Studio (Miro) и оставить проект Mambo.

Open Source Matters создала Joomla!. Проект, со 100% открытым исходным кодом и GPL-лицензией. Первый релиз Joomla! (Joomla! 1.0) был очень похож на последнюю версию Mambo и большинство расширений были совместимы.

После серьезной доработки, в сентябре 2005 года, Open Source Matters выпустила Joomla 1.0!. За прошедшие месяцы Mambo также реформирует свои команды и структуры поддержки и отказывается от дальнейшего развития версии 4.5.3, решив продолжить поддержку текущей стабильной базы программного кода.

В конце этого года начинается разработка новой системы Joomla! 1.1, которая так и ни когда не вышла в публичный релиз. Эта версия стала переходной с весии 1.0 до версии 1.5. Именно по Joomla! 1.1 выходят первой альфа версии новой системы.

Год 2006

С наступлением 2006 года оба проекта — Mambo и Joomla! — продолжили свое победное шествие, при этом они были основаны на одной и той же базовой версии 4.5.2.

На репозитории разработчиков начали выходить первые альфа-версии Joomla! 1.1. В конце года выходит первая бета-версия с измененной нумерацией — Joomla! 1.5 Beta. В это время команда переводов начинает привлекать из разных стран мира локализаторив для создания переводов.

На конкурсе проводимом компанией Packt Publishing, Joomla! CMS признана лучшей бесплатной системой управлением сайтом 2006 года.

Год 2007

Различные ограничения в Joomla! 1.0 заставили разработчиков задуматься, как бы все перестроить. После длительного периода развития, и нескольких бета-версий, Joomla! 1.5 был выпущен в середине 2007 года.

В обоих проектах был произведен полный рефакторинг исходных текстов и выпущены новые версии — Mambo 4.6 и Joomla! 1.5.

Joomla! 1.5 сильно отличается от Joomla! 1.0 и Mambo. Joomla! 1.5 вводит много новых классов и реализует полноценный фреймворк. Радикальным изменением является введение MVC (модель-вид-контроллер) структуры компонентов. Эти изменения привели к существенному снижению совместимости Joomla! и Mambo.

В этом году на конкурсе проводимом компанией Packt Publishing, Joomla! CMS была признана лучшей в номинации «Best Open Source PHP CMS».

Год 2008

22 января 2008 года: выход первой стабильной версии Joomla! 1.5

В конце года объявлено новую политику перевода и локализации, как еще один шаг к снижению барьеров для развития проекта Joomla!

Объявлено о прекращении поддержки Joomla! 1.0

  • 13 октября 2008: объявление прекращения поддержки Joomla! 1.0 и расширений для нее.
  • 31 марта 2009: прекращение принятия расширений для Joomla! 1.0 в JED.
  • 30 июня 2009: все расширения для Joomla! 1.0 будут удалены из JED.
  • 22 июля 2009: окончание любой поддержки Joomla! 1.0.

Год 2009

В 2009 году было выпущено 7 обновлений (см. список в конце статьи). Значительно продвинулись работы в создании новой версии Joomla! 1.6.
Также была проделана огромная работа по популяризации CMS Joomla! — в разных городах мира проведено масса конференций.
  Что дальше?

Ведется полным ходом разработка и неплохо освещается следующая версия — Joomla! 1.6. По предварительным анонсам она будет совместима с Joomla! 1.5 но полностью перейдет на PHP 5,0 и не планирует поддержку режима Legacy Mode, а следовательно и расширений, разработанных для Joomla! 1.0.

Год 2010

В 2010 году было выпущено 7 релизов безопастности для Joomla! 1.5 (см. список в конце статьи). Все силы общества брошены на разработку революционной Joomla! 1.6 — выпущен пакет бета версий, и к концу года появился релиз-кандидат.

Год 2011

В начале года, 10 января вышла первая стабильная версия линейки Joomla! 1.6
Год 2012

В начале года, 10 января вышла первая стабильная версия линейки Joomla! 1.6Год 2013

В начале года, 10 января вышла первая стабильная версия линейки Joomla! 1.6Год 2014

В начале года, 10 января вышла первая стабильная версия линейки Joomla! 1.6Год 2015

В начале года, 10 января вышла первая стабильная версия линейки Joomla! 1.6Выход версий Joomla! 1.0: 17 сентября 2005 года: Joomla! 1.0.0 [Sunrise] 21 сентября 2005 года: Joomla! 1.0.1 [Sunburst] 2 октября 2005 года: Joomla! 1.0.2 [Sunset] 14 рктября 2005 года: Joomla! 1.0.3 [Sunlight] 21 ноября 2005 года: Joomla! 1.0.4 [Sundial] 24 декабря 2005 года: Joomla! 1.0.5 [Sunspot] 15 января 2006 года: Joomla! 1.0.6 [Sunscreen] 15 января 2006 года: Joomla! 1.0.7 [Sunburst] 26 февраля 2006 года: Joomla! 1.0.8 [Sunshade] 5 июня 2006 года: Joomla! 1.0.9 Stable [Sunshine] 26 июня 2006 года: Joomla! 1.0.10 [Sundown] 28 августа 2006 года: Joomla! 1.0.11 [Sunbow] 25 декабря 2006 года: Joomla! 1.0.12 Stable [Sunfire] 21 июля 2007 года: Joomla! 1.0.13 [Sunglow] 22 февраля 2008 года: Joomla! 1.0.15 [Daytime]
22 июля 2009 года — окончание поддержки Joomla! 1.0

Выход версий Joomla! 1.5:
12 октября 2006 года: Joomla! 1.5 [BETA] 5 мая 2007 года: Joomla! 1.5 Beta-2 [Red Barchetta]
1 сентября 2007 года: Joomla! 1.5 RC2 [Endeleo]
6 октября 2007 года: Joomla! 1.5 RC3 [Takriban]
19 декабря 2007 года: Joomla! 1.5 RC4 [Karibu] 22 января 2008 года: Joomla! 1.5 Stable [Khepri]
8 февраля 2008 года: Joomla! 1.5.1 [Seenu]
23 марта 2008 года: Joomla! 1.5.2 [Woi]
8 июля 2008 года: Joomla! 1.5.4 [Naiki]
28 июля 2008 года: Joomla! 1.5.4 [Mamni]
12 августа 2008 года: Joomla! 1.5.6 [Vusani]
9 сентября 2008 года: Joomla! 1.5.7 [Wovusani]
10 ноября 2008 года: Joomla 1.5.8 [Wohnaiki]
10 января 2009 года: Joomla 1.5.9 [Vatani] 28 марта 2009 года: Joomla! 1.5.10 [Wohmamni] 3 июня 2009 года:Joomla 1.5.11 [Vea] 1 июля 2009 года:Joomla 1.5.12 [Wojmamni Ama Woi] 22 июля 2009 года:Joomla 1.5.13 [Wojmamni ama baji] 30 июля 2009 года:Joomla 1.5.14 [Wojmamni ama naiki] 4 ноября 2009 года: Joomla 1.5.15 [Wojmamni ama mamni]
23 апреля 2010 года: Joomla 1.5.16 [Wojmamni ama busani]
27 апреля 2010 года: Joomla 1.5.17 [Wojmamni ama woobusani]
28 мая 2010 года: Joomla 1.5.18 [Wojmamni ama wojnaiki]
15 июля 2010 года: Joomla 1.5.19 [Wojmamni ama batani]
18 июля 2010 года: Joomla 1.5.20 [senu takaa]
6 октября 2010 года: Joomla 1.5.21 [senu takaa ama wepulai]
5 ноября 2010 года: Joomla 1.5.22 [senu takaa ama woi]
4 апреля 2011 года: Joomla 1.5.23 [senu takaa ama baji] 17 октября 2011 года: Joomla 1.5.24 [senu takaa ama naiki] 14 ноября 2011 года: Joomla 1.5.25 [senu takaa ama mamni] 27 марта 2012 года: Joomla 1.5.26 [senu takaa ama busani]2012 год — окончание поддержки Joomla! 1.5.xВыход beta-версий Joomla! 1.6:
17 мая 2010 года: Joomla! 1.6 Beta-1 31 мая 2010 года: Joomla! 1.6 Beta-2
14 июня 2010 года: Joomla! 1.6 Beta-3
28 июня 2010 года: Joomla! 1.6 Beta-4
12 июля 2010 года: Joomla! 1.6 Beta-5
26 июля 2010 года: Joomla! 1.6 Beta-6
9 августа 2010 года: Joomla! 1.6 Beta-7
23 августа 2010 года: Joomla! 1.6 Beta-8
6 сентября 2010 года: Joomla! 1.6 Beta-9 20 сентября 2010 года: Joomla! 1.6 Beta-10
4 октября 2010 года: Joomla! 1.6 Beta-11
18 октября 2010 года: Joomla! 1.6 Beta-12
1 ноября 2010 года: Joomla! 1.6 Beta-13
15 ноября 2010 года: Joomla! 1.6 Beta-14
29 ноября 2010 года: Joomla! 1.6 Beta-15
14 декабря 2010 года: Joomla! 1.6 RC1

Выход версий Joomla! 1.6:
10 января 2011 года: Joomla! 1.6 Stable [Onward]
7 марта 2011 года: Joomla! 1.6.1
14 апреля 2011 года: Joomla! 1.6.2
18 апреля 2011 года: Joomla! 1.6.3
27 июня 2011 года: Joomla! 1.6.4
11 июля 2011 года: Joomla! 1.6.5
26 июля 2011 года: Joomla! 1.6.6
Выход версий Joomla! 1.7: 6 июня 2011 года: Joomla! 1.7 Alpha
28 июня 2011 года: Joomla! 1.7 Beta 1
12 июля 2011 года: Joomla! 1.7 RC1
19 июля 2011 года: Joomla! 1.7.0
26 сентября 2011 года: Joomla! 1.7.1
11 октября 2011 года: Joomla! 1.7.2
14 ноября 2011 года: Joomla! 1.7.3
24 января 2012 года: Joomla! 1.7.4
2 февраля 2012 года: Joomla! 1.7.5

Выход версий Joomla! 2.5:
22 декабря 2011 года: Joomla! 2.5 Beta 111 января 2012 года: Joomla! 2.5 Beta 218 января 2012 года: Joomla! 2.5.0 RC1
24 января 2012 года: Joomla! 2.5.0
2 февраля 2012 года: Joomla! 2.5.1
5 марта 2012 года: Joomla! 2.5.2
15 марта 2012 года: Joomla! 2.5.3
2 апреля 2012 года: Joomla! 2.5.4
18 июня 2012 года: Joomla! 2.5.5
19 июня 2012 года: Joomla! 2.5.6
13 сентября 2012 года: Joomla! 2.5.7
8 ноября 2012 года: Joomla! 2.5.84 февраля 2013 года: Joomla! 2.5.9
24 апреля 2013 года: Joomla! 2.5.10
26 апреля 2013 года: Joomla! 2.5.11

25 июля 2013 года: Joomla! 2.5.13
1 августа 2013 года: Joomla! 2.5.14
6 ноября 2013 года: Joomla! 2.5.15
6 ноября 2013 года: Joomla! 2.5.16
18 декабря 2013 года: Joomla! 2.5.17
6 февраля 2014 года: Joomla! 2.5.18
6 марта 2014 года: Joomla! 2.5.1930 апреля 2014 года: Joomla! 2.5.2011 июня 2014 года: Joomla! 2.5.2112 июня 2014 года: Joomla! 2.5.2224 июля 2014 года: Joomla! 2.5.2325 июля 2014 года: Joomla! 2.5.2423 сентября 2014 года: Joomla! 2.5.2530 сентября 2014 года: Joomla! 2.5.261 октября 2014 года: Joomla! 2.5.2710 декабря 2014 года: Joomla! 2.5.28
31 декабря 2014 года — окончание поддержки Joomla! 2.5
Выход версий Joomla! 3.0:
12 июля 2012 года: Joomla! 3.0 Alpha-1
16 августа 2012 года: Joomla! 3.0 Alpha-2
6 сентября 2012 года: Joomla! 3.0 Beta 1
27 сентября 2012 года: Joomla! 3.0.0
9 октября 2012 года: Joomla! 3.0.1
8 ноября 2012 года: Joomla! 3.0.2
7 февраля 2013 года: Joomla! 3.0.3

Выход версий Joomla! 3.1:
7 марта 2013 года: Joomla! 3.1 Beta 1
21 марта 2013 года: Joomla! 3.1 Beta 2
1 апреля 2013 года: Joomla! 3.1 Beta 3
12 апреля 2013 года: Joomla! 3.1 Beta 4
21 апреля 2013 года: Joomla! 3.1 Beta 5
24 апреля 2013 года: Joomla! 3.1.0
26 апреля 2013 года: Joomla! 3.1.1
6 ноября 2013 года: Joomla! 3.1.2

18 декабря 2013 года: Joomla! 3.1.3

25 июля года: Joomla! 3.1.4
1 августа 2013 года: Joomla! 3.1.5

Выход версий Joomla! 3.2:

11 октября 2013 года: Joomla! 3.2 Beta 1
24 октября 2013 года: Joomla! 3.2 Beta 2
1 ноября 2013 года: Joomla! 3.2 Realease Candidate (RC)
6 ноября 2013 года: Joomla! 3.2.0

18 декабря 2013 года: Joomla! 3.2.1

6 февраля 2014 года: Joomla! 3.2.2
6 марта 2014 года: Joomla! 3.2.3

Выход версий Joomla! 3.3:

3 апреля 2014 года: Joomla! 3.3 Beta 1

9 апреля 2014 года: Joomla! 3.3 Beta 2

21 апреля 2014 года: Joomla! 3.3 Beta 3

25 апреля 2014 года: Joomla!

3.3 Realease Candidate (RC)

30 апреля 2014 года: Joomla! 3.3.0

11 июня 2014 года: Joomla! 3.3.1

24 июля 2014 года: Joomla! 3.3.2

25 июля 2014 года: Joomla! 3.3.3

23 сентября 2014 года: Joomla! 3.3.4

30 сентября 2014 года: Joomla! 3.3.5

1 октября 2014 года: Joomla! 3.3.6

Выход версий Joomla! 3.4:

27 января 2015 года: Joomla! 3.4 Beta 1
3 Февраля 2015 года: Joomla! 3.4 Beta 2

11 февраля 2015 года: Joomla! 3.4 Beta 3

17 Февраля 2015 года: Joomla!

3.4 Realease Candidate (RC)

24 Февраля 2015 года: Joomla! 3.4

16 февраля 2014 года: Joomla! 3.2.2
6 марта 2014 года: Joomla! 3.2.3

Выход версий Joomla! 3.3:

3 апреля 2014 года: Joomla! 3.3 Beta 1

9 апреля 2014 года: Joomla! 3.3 Beta 2

21 апреля 2014 года: Joomla! 3.3 Beta 3

25 апреля 2014 года: Joomla! 3.3 Realease Candidate (RC)

30 апреля 2014 года: Joomla! 3.3.0

11 июня 2014 года: Joomla! 3.3.1

24 июля 2014 года: Joomla! 3.3.2

25 июля 2014 года: Joomla! 3.3.3

23 сентября 2014 года: Joomla! 3.3.4

30 сентября 2014 года: Joomla! 3.3.5

1 октября 2014 года: Joomla! 3.3.6

Выход версий Joomla! 3.4:

27 января 2015 года: Joomla! 3.4 Beta 1
3 Февраля 2015 года: Joomla! 3.4 Beta 2

11 февраля 2015 года: Joomla! 3.4 Beta 3

17 Февраля 2015 года: Joomla! 3.4

Realease Candidate (RC)

24 Февраля 2015 года: Joomla! 3.4

Создаем модуль ICQ статуса для Joomla!

Данное руководство ни на что не претендует, просто напишу как сам делаю.

До того как написать вот это я просмотрел несколько подобных руководств и понял что не все они для меня достаточно понятны. Некоторые были слишком просты и ограничивались выводом надписи «Hello World», другие наоборот , а в связи с тем что у меня знаний в области программирования просто никакие пришлось все это долго анализировать просматривать различные готовые модули и пытаться понять как оно работает.

Ну вот и решил написать этот документ который адресуется людям далеким от программирования, но желающим сделать что-то свое.

Сразу скажу что «Hello World» мы делать не будем. А зачем? Практической пользы это не приносит. Мы будем делать что-нибудь полезное и на примере моего «полезного», Вы сделаете свое «полезное». Погнали. Вот посидел и придумал, надо сделать ICQ информер. После размещения на сайте он будет показывать есть вы в аське или нет.
Модуль у нас состоит минимум из двух файлов.

mod_myicq.php и mod_myicq.xml

Так я их назвал что бы потом когда установлю этот модуль на сайт можно было отличить его от других установленных модулей. Поэтому имеет смысл давать осмысленные имена (во как закрутил).

Создание установочного файла модуля
 

Создаем текстовый документ переименовываем его в mod_myicq.xml и вставляем в него код:

 
<?xml version="1.0" encoding="windows-1251"?>
<mosinstall type="module" version="1.0.0">
<name>ICQ_online?</name>
<author>LightDeath</author>
<creationDate>jule 2008</creationDate>
<copyright>(C) 2008 Open Source Matters. All rights reserved.</copyright>
<license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license>
<autorEmail>autor(собака)mail.ru</autorEmail>
<authorUrl>http://cms-joomla.info</authorUrl>
<version>1.0.0</version>
<description>Информер статуса ICQ</description>
<files>
<filename module=" mod_myicq "> mod_myicq.php</filename>
</files>
<params>
<param name="moduleclass_sfx"type="text" default="" 
label="Суффикс класса модуля" description="Тут можно прописать свой суффикс класса модуля."      />
</params>
</mosinstall>

Этот файл можно даже назвать установочным.
Разберем что есть что: Первая строчка очень важная и должна быть обязательно.

xml version=»1.0″ эта часть информирует браузер о том, что файл имеет формат XML

encoding=»windows-1251 это сообщает браузеру в какой кодировке надо показывать ваш модуль, при необходимости можно исправить на ту кодировку которая является основной для вашего сайта. (помогает когда все выводится крякозябрами).
Самое главное перед этой строчкой не должно быть пробелов и она должна быть самой первой.

<mosinstall type=»module» version=»1.0.0″> Этот тег говорит Joomla что это вообще такое каким образом и в какую папку установить. А определяет он просто по типу «module».

Ну, а version=»1.0.0″ это для того чтобы определить на какую версию Joomla этот модуль.

<name>ICQ_online ?</name> Это имя вашего модуля. Оно будет отображаться в списке установленных модулей.

<author>LightDeath</author> Тут мы тешим самолюбие и вписываем свое имя. Ну должны ведь потомки знать кто это наКОДил тут (или нашкодил :)).

<creationDate>jule 2008</creationDate> Здесь указано когда мы это сделали

<copyright>(C) 2008 Open Source Matters. All rights reserved.</copyright> Здесь наши копирайты. Если вы собираетесь бесплатно раздавать этот модуль, то пусть так и останется. А если вы намерены его продавать , тогда правьте как вам угодно.

<license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license> Эта ссылка на лицензию. Если вы поменяли копирайт то пишите ссылку на свою лицензию.

<authorEmail>autor(@)mail.ru</authorEmail> Ну тут понятно ваша электропочта.Ну надо ведь потом осуществлять поддержку своего творения.

<authorUrl>http://cms-joomla.info</authorUrl> Ссылка на ваш сайт.

<version>1.0.0</version> А это версия Вашего модуля. Вдруг Вы начнете наращивать функционал и исправлять ошибки.

<description>Информер статуса ICQ</description> Ну, а тут описание того что это вообще за чудо такое. Что бы пользователь не забыл что это за модуль такой и для чего он нужен.

<files>
<filename module=» mod_myicq «> mod_myicq.php</filename>
</files>

Между тегами <files></files> мы перечисляем все файлы которые будут входить в ваш модуль, а так как файл *.php в модуле должен быть обязательно, то один файл будет всегда. Выглядеть эта строчка должна именно так, ну только соответственно имя модуля надо будет менять в соответствии с именем модуля. Мы здесь задали атрибут «module» файлу mod_nmyicq.php и он принял значение имени модуля без расширения. Короче мы сообщили Joomla каким файлом запускать ваш модуль. Потом попозже мы попробуем добавить другие файлы в ваш модуль (например картинки), а пока этого нам достаточно.

<params>
<param name=»moduleclass_sfx» type=»text» default=»» label=»Суффикс класса модуля» description=»Тут можно прописать свой суффикс класса модуля.» />
</params>

Вот мы дошли до интересных тегов <params></params>. Между этих тегов мы будем добавлять параметры которые будут использоваться для настройки вашего модуля. Вернемся к ним попозже когда будем их добавлять. А сейчас посмотрите тот параметр который у нас указан. Он в принципе не обязателен, но ставить его как мне кажется признак хорошего тона. Вдруг человек который воспользуется вашим модулем захочет применить свой стиль CSS к вашему модулю ну и пожалуйста, мы все для него подготовили.

Ну и вроде все закрываем тег </mosinstall> который сообщает что файлик кончился. Сохраняем то что у нас получилось.



Создание основного файла модуля

Переходим к следующему файлу модуля:
 

По аналогии с предыдущим создаем текстовый документ и переименовываем его в mod_myicq.php.

Открываем его и вставляем в него вот этот код:

 
<?php
   /**
   * @version 1.0
   * @package ICQ_online ?
   * @copyright &copy; 200 LightDeath
   * @license <!--[if gte vml 1]>   <![endif]-->http://www.gnu.org/copyleft/gpl.html GNU/GPL
   */
 
defined('_VALID_MOS' ) or die( 'Restricted access' );
 ?>

Ну и тоже его разберем на кусочки:

 
/**
* @version 1.0
* @package ICQ_online ?
* @copyright &copy; 200 LightDeath
* @license <!--[if gte vml 1]> <![endif]-->http://www.gnu.org/copyleft/gpl.html GNU/GPL
*/
 

Эта часть является блоком комментариев соответственно:

  • номер версии
  • наименование
  • копирайт
  • ссылка на лицензию

Далее идет очень важная строчка:

 
defined( '_VALID_MOS' ) or die( 'Restricted access' );

Эта строчка является основой безопасности вашего модуля она должна быть обязательно.
С помощью этой строки мы запрещаем доступ к модулю напрямую пользователем и разрешаем доступ к файлу только движку Joomla. Сильно про это не думайте, а просто запомните что эта строка должна быть.

Вот и все сохраните этот файлик на всякий случай. Потому что все обязательные условия мы выполнили для создания нового модуля. И эта часть меняться уже не будет.

Теперь займемся написанием именно того кода который и будет отображать наш модуль.

Нам понадобится код который будет осуществлять запрос статуса вашей ICQ и отображать соответствующую картинку на вашем сайте.

Выглядит этот код вот так: 

 
<img src="http://wwp.icq.com/scripts/online.dll?icq=55522230&amp;img=21"  
border="0" alt="Статус ICQ"/>

Ну тут все просто, мы получаем картинку с сервера ICQ соответствующую статусу on/off, принадлежащую номеру 55522230. Цифра 21 говорит о том какой стиль картинки будет использоватся (Icq нам предоставляет разные стили от 1-27 для того чтобы можно было подобрать под дизайн сайта).

Что мы делаем с этим кодом? Да просто именно в таком виде как есть вставляем его в наш mod_myicq.php. Должно получится вот так:

 
<?php
/**
* @version 1.0
* @package ICQ_online
* @copyright &copy; 200 LightDeath
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
*/
defined('_VALID_MOS' ) or die( 'Restricted access' );
?>
 
<img src="http://wwp.icq.com/scripts/online.dll?icq=55522230&amp;img=21" border="0" 
alt="Статус ICQ"/>

Вот и все сохраняем опять файлик. А теперь надо посмотреть как работает наш модуль. Что бы это сделать надо его установить. Для этого два наших файла запаковываем в архив mod_myicq.zip. Идем в админку Joomla и устанавливаем обычным способом наш модуль. Теперь заходим в список модулей и находим наш модуль, опубликовываем его и идем смотреть что там у нас получилось.

Пример модуля icq статуса

Вот вроде модуль уже и готов. А что можно еще сделать?

А можно его например унифицировать вот если у вас сменится номер вам придется открывать код и менять номер на новый или кто-то скачал ваш модуль, а у него соответственно номер и ему придется тоже копаться в чужом коде, хоть он пока и маленький. Но человек может быть не таким подготовленным как Вы.

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

Итак что мы можем поменять в этом несложном коде

 
<img src="http://wwp.icq.com/scripts/online.dll?icq=55522230&amp;img=21" border="0" 
alt="Статус ICQ"/>

Ну как минимум сам UIN (это так не по русски называют номер ICQ), идентификационный номер отображаемой картинки.

Вот этим и займемся.

Для этого открываем файл mod_myicq.xml и начинаем добавлять наши параметры которые я обещал в начале статьи.

Добавляем между тегов

 
<params> </params>

вот такую строчку

 
<param name="myuin" type="text" default="" 
 
label="Номер ICQ " description="Введите ваш номер ICQ без пробелов и дефиса."       />

Посмотрим что мы сделали:

Мы добавили поле для ввода текста type=»text»

Добавили имя для этого поля label=»Номер ICQ»

И добавили всплывающую подсказку description=»Введите ваш номер ICQ без пробелов и дефиса. «

И имя параметра нашего поля для ввода текста name=»myuin»

Теперь по аналогии добавляем второе поле для ввода ID картинки:

 
<param name="idimg" type="text" default="5" label="id стиля картинки" 
description="Введите число от 1 до 27." />

Тут все точно также только одно отличие , мы добавили значение параметру «default» значение «21», сделали мы это для того чтобы поле было изначально заполнено значением.

Ну вот таким образом теперь должен выглядеть ваш mod_myicq.xml 

 
<?xml version="1.0" encoding="windows-1251"?>
 <mosinstall   type="module" version="1.0.0">
 <name>ICQ_online?</name>
 <author>LightDeath</author>
 <creationDate>jule 2008</creationDate>
 <copyright>(C) 2008 Open Source Matters. All rights reserved.</copyright>
 <license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license>
 <authorEmail>autor(@)mail.ru</authorEmail>
 <authorUrl>http://cms-joomla.info</authorUrl>
 <version>1.0.0</version>
 <description>Информер статуса ICQ</description>
 <files>
 <filename module="mod_myicq">mod_myicq.php</filename>
 </files>
 <params>
 <param name="moduleclass_sfx" type="text" default="" 
label="Суффикс класса модуля" description="Тутможно прописать свой суффикс класса модуля."       />
 <param name="myuin" type="text" default="" label="Номер ICQ"
 description="Введите ваш номер ICQ без пробелов и дефиса." />
 <param name="idimg" type="text" default="21" label="id стиля картинки"
 description="Введите число от 1 до 27."/>
 </params>
 </mosinstall>

Сохраняем этот файл. Вот для чего это делалось.

Открываем mod_myicq.php

Теперь мы должны добавить в наш код переменные которые будут принимать значение соответствующие тем данным которые мы будем вводить при настройке нашего модуля.

Для этого добавляем в наш код вот такие строки:

 
$myuin = $params->get( 'myuin');
 $idimg = $params->get( 'idimg', '21' );

Это мы создаем переменные и даем понять нашему коду откуда он должен взять данные и какой переменной присвоить соответствующие значения. Обратите внимание они у нас совпадают с именами полей ввода которые мы сделали в mod_myicq.xml.

Теперь осталось вставить наши переменные в код который отвечает за вывод картинки.

Делаем мы это очень простым способом используя функцию PHP echo вот что должно получится:

 
<div  align="center">
 <img src="http://wwp.icq.com/scripts/online.dll?icq= <?php echo $myuin; ?> 
&amp;img=<?php echo $idimg; ?> " border="0" alt="Статус ICQ" />
 </div>

Обратите внимание я все это поместил еще и в блок DIV для того чтобы просто отцентрировать нашу картинку по середине нашего модуля.

Предлагаю добавить к нашей картинке снизу еще и сам номер ICQ, чтобы человек мог увидеть на какой номер написать. А еще сделаем этот номер ссылкой на ваш профиль ICQ. Делается это вот таким кодом:

 
<a href="http://wwp.mirabilis.com/scripts/Search.dll?to=<?php echo $myuin; ?> " 
target="_blank" class="menu"><?php echo $myuin; ?></a>

Тут мы тоже заменили номер на переменную.
Вот так будет выглядеть наш mod_myicq.php с новыми изменениями:

 
<?php
 /** 
 * @version 1.0 
 * @package ICQ_online ? 
 * @copyright &copy; 200 LightDeath 
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL 
 */ 
 defined( '_VALID_MOS' ) or die( 'Restricted access' ); 
    $myuin = 
    $params->get( 'myuin'); 
    $idimg = 
    $params->get( 'idimg', '21a' ); 
    ?> 
    <div 
    align="center"> 
    <img src="http://wwp.icq.com/scripts/online.dll?icq=<?php echo $myuin; 
    ?>&amp;img=<?php echo $idimg; ?>" border="0" alt="Статус ICQ"   /><br> 
    <strong> 
    <a href="http://wwp.mirabilis.com/scripts/Search.dll?to=<?php echo $myuin; 
    ?> " target="_blank" 
    class="menu"><?php echo $myuin; ?></a></strong>
 
 </div>

Ну вот вроде и все можно упаковывать в *.zip и устанавливать, если вы устанавливали предыдущий вариант то его надо предварительно удалить.
Ну а после установки и настройки параметров. Можно будет посмотреть на результат:

Незнаю насколько понятно я обьяснил, но сложностей именно с эти вроде не должно возникнуть.
Точно таким же образом можно делать какие угодно модули, смело использую PHP, JAVA и HTML.

Ну я думаю что это не конец, что нибудь придумаю еще и на примере этого модуля буду учится сам и может помогу еще кому нибудь.

Люди которые понимают в програмировании побольше (учитывая что я ничего почти не понимаю и делаю интуитивно), прошу писать замечания и советы может они помогут мне и всем остальным.

Создаем компонент «Моя доска объявлений» — II

Продолжение статьи «Создаем компонент «Моя доска объявлений»- I

Работа компонента с базой данных

Шаг шестой. Доступ к базе данных.

Итак, на пятом шаге мы создали структуру нашего компонента. Теперь нужно написать каждый из шести наших обработчиков (Почему из шести? Объясняю: 1- реакия на нажатие пункта меню Наша доска; 2 – отображение основной страницы компонента по умолчанию, т.е. реакция на нажатие подменю пункта Наша доска -> Просмотр и удаление объявлений, 3 – Реакция на нажатие кнопки Редактировать (отображение страницы редактирования объявления); 4 – Реакция на нажатие кнопки Закрыть (отмена редактирования сообщения и возврат к главной странице); 5 – Реакция на нажатие кнопки Удалить; 6 – Реакция на нажатие кнопки Сохранить.)

Заметим, что если оставить структуру, созданную раннее без изменений, то некоторые обработчики будут частично повторять друг друга.

Мы поступим следующим образом (для того, чтобы лучше разобраться в возможностях): сначала, напишем обработчики для каждого события компонента, вставляя их в созданную нами структуру; потом учитывая то, что некоторые части повторяются попробуем оптимизировать код администраторской части компонента. В итоге у нас должно получится 2 работоспособных варианта компонента.

Каждый начинающий создатель компонентов сам решит, какой вариант разработки ему нравится больше.

Перед тем как начать непосредственно программировать, рассмотрим основные моменты доступа к базам данных (с помощью встроенных средств Joomla).

Рассматривать буду Joomla 1.0.13 (поэтому гарантировать что описанные мной классы, методы и свойства присутствуют и в следующих версиях не могу, хотя вероятно они вряд ли кардинально изменились).

Для работы с базами данных в Joomla присутствует библиотека ../includes/database.php.

Если вам интересно откройте этот файл и внимательно рассмотрите. В нем описано 2 класса: database и mosDBTable.

Рассмотрим первый из них. Он имеет довольно много свойств и методов, но рассмотрим только те, которые нам пригодятся, а именно: для выполнения запросов к базе данных (выборка и запись информации).

Итак чтобы выполнить какой либо запрос нужно выполнить последовательность следующих действий (команд и .т.д):

 
$database->setQuery(<запрос>);  
$database->query();
 

Запрос может быть следующих видов:

  • “select * from jos_user”
  • “select * from #__users”

          Использование комбинации символов #__ вместо префикса таблиц позволяет использовать компонент с разными базами данных joomla (отличающимся префиксом таблиц). В процессе выполнения функции setQuery, #__ заменяется на текущий префикс. Поэтому предпочтительнее использовать второй вид запросов.

Функция query возвращает истину если запрос удачен, и ложь в остальных случаях. Для того чтобы возвратить результат запроса нужно выполнить одну из перечисленных функций (заменив на нее $database->query();). Допустим результат должен быть помещен в переменную $result.

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

 
loadResultArray(<номер поля >);
 

Поля нумеруются с нуля, если значение параметра функции не указано, то по умолчанию считается равным нулю)

Если результат должен быть получен виде ассоциативного массива, используем:

 
loadAssocList();
 

Также существует еще несколько функции расширяющих возможности по обработке результатов запроса. Сейчас не будем акцентировать на них свое внимание.

Попробуем применить полученные знания на практике. Для этого сделаем так чтобы при нажатии на пункт меню нашего компонента «Просмотр и удаление объявлений» появлялся список имен пользователей зарегистрированных в системе.

Открываем файл admin.mybord.php и вставляем вместо строчки

 
echo 'Отображение компонента по умолчанию';
 

следующий код:

 
$query = 'select * from  `#__users`';
$database->setQuery($query);
$result =  $database->loadResultArray(1);
for  ($i=0;$i<count($result);$i++)
{
echo($result[$i]."<br>");
}
 

Или этот (отличаются они только реализацией обхода результирующего массива)

 
$query =  'select * from `#__users`';
$database->setQuery($query);
$result =  $database->loadResultArray(1);
foreach ($result as  $row)
{
echo($row."<br>");
}
 

Теперь как и в предыдущих шагах архивируем файлы компонента и устанавливаем. Смотрим что получилось. В дальнейшем для того чтобы изменить компонент мы не будем удалять его, менять и снова устанавливать.

Поступать будем так: заходим на сервере (локальном или удаленном, удобнее конечно разрабатывать на локальном, например Denwer)

если редактируем часть администратора, то ../administrator/components/com_myboard (в нашем случае!!!)

если редактируем frontend, то ../components/com_myboard

делаем требуемые изменения и проверяем как работает компонент. Если все нормально, то можно скопировать в одно место содержимое этих двух катологов и заархивировать(получим готовый, к установке компонент).

Попробуйте обязательно выполнить какой-нибудь запрос с помощью функции query(); Например создайте таблицу #__proba с любыми полями.

У меня получилось вот что:

 $query = 'CREATE TABLE  `proba` (`id_proba` INT NOT NULL  AUTO_INCREMENT ,`proba` TEXT NOT NULL  ,PRIMARY KEY (  `id_proba` ));';$database->setQuery($query);if  ($database->query()){echo('Таблица успешно создана!');} 

На следующем шаге мы рассмотрим основы SQL запросов.

Шаг седьмой. Небольшое отступление. Потренируемся создавать запросы в Joomla.

На предыдущем шаге мы уже попробовали создать несколько простых запросов. Сейчас нашей целью будет рассмотреть основные возможности языка SQL. Подробно описывать теорию я не буду — этого материала полно в сети, написана уйма книг. Поэтому буду упоминать определенную возможность и иллюстрировать её на примере. Примеры будем опробовать, так же как и в шестом шаге – вставляем код в место, где описывается реакция на нажатие подпункта меню Наша доска -> Просмотр и удаление объявлений.

Итак начнем.

SQL запросы на выборку данных:

1. SELECT * FROM <Имя таблицы>

SELECT * FROM `#__users` -используя, описанные в предыдущем шаге методы класса database выполните запрос.

 
$query = 'SELECT * FROM  `#__users`';
$database->setQuery($query);
$result =  $database->loadResultArray(3);
foreach ($result as  $row)
{
echo($row."<br>");
}
 

Отобразит список е-мэйлов зарегистрированных в CMS пользователей. Звездочка в запросе означает, что база данных вернет значения всех полей, которыми обладает данная таблица. Если значения каких-то полей не нужны лучше использовать следующий вид запроса.

2. SELECT <Имя поля1>, <Имя поля2>, …, <Имя поляN> FROM <Имя таблицы>

SELECT `id`, `name`, `username` FROM `#__users`

 
$query = 'SELECT `id`,  `name`, `username` FROM `#__users`';
$database->setQuery($query);
$result =  $database-> loadAssocList();
foreach ($result as  $row)
{
echo($row['id'].' - '.$row['name'].' -  '.$row['username']."<br>");
}
 

Отображает список, состоящий и идентификатора, имени и логина пользователей, зарегистрированных в системе.

      3. SELECT * FROM `Имя таблицы` WHERE `Имя поля`  <  <Параметр>

SELECT * FROM `Имя таблицы` WHERE `Имя поля`  =  <Параметр>

SELECT * FROM `Имя таблицы` WHERE `Имя поля`  >  <Параметр>

            SELECT * FROM `#__users` WHERE `id`<69

 
$query = 'SELECT * FROM  `#__users` WHERE `id`<69';
$database->setQuery($query);
$result =  $database-> loadAssocList();
foreach ($result as  $row)
{
echo($row['id'].' - '.$row['name'].' -  '.$row['username']."<br>");
}
 

Отображает данные только тех пользователей, id которых меньше 69. За ключевым словом WHERE идет условие отбора записей. Условие может быть как простым (в прмере), так и сложным.((Имя поля1 < 1) AND (Имя поля2 > 2)).

   4.  SELECT <Имя таблицы1>.<Имя поля3>, <Имя таблицы2>.<Имя поля4>

FROM <Имя таблицы1>,<Имя таблицы2>

WHERE <Имя таблицы1>.<Имя поля1>=<Имя таблицы2>.<Имя поля2>

SELECT `#__content`.`title`, `#__users`.`id` FROM `#__users`, `#__content`

WHERE `#__users`.`id`= `#__content`.`created_by`

 
$query = 'SELECT  `#__content`.`title`, `#__users`.`id` 
FROM `#__users`, `#__content` 
WHERE `#__users`.`id`= `#__content`.`created_by`';
$database->setQuery($query);
$result = $database-> loadAssocList();foreach ($result as $row)
{
echo($row['id'].'-'.$row['title']."<br>");
}
 

Отображает список заголовков статей, и идентификатор пользователя, который их создал.

5. SELECT * FROM <Имя таблицы> LIMIT <целое неотрицательное число>

SELECT * FROM `#__content` LIMIT 5

 
$query = 'SELECT * FROM  `#__content` LIMIT 5';
$database->setQuery($query);
$result = $database->  loadAssocList();
foreach ($result as  $row)
{
echo($row['title']."<br>");
}
 

Отобразит значения поля title первых пяти записей таблицы #__content

6. SELECT * FROM <Имя таблицы>

LIMIT <целое неотрицательное число1>,<целое неотрицательное число2>

SELECT * FROM `#__content` LIMIT 2, 5

 
$query = 'SELECT * FROM  `#__content` LIMIT 2, 5';
$database->setQuery($query);
$result = $database->  loadAssocList();
foreach ($result as  $row)
{
echo($row['title']."<br>");
}
 

Отобразит значения поля title 5 записей из таблицы #__content, начиная с 2 (Нумеруются записи с нуля)

7. SELECT * FROM <Имя таблицы> ORDER BY <Имя поля>

SELECT * FROM `#__content` ORFDER BY `modified`

 
$query = 'SELECT * FROM  `#__content` ORDER BY `modified`';
$database->setQuery($query);
$result = $database->  loadAssocList();
foreach ($result as  $row) 
{
echo($row['modified'].' - '.$row['title']."<br>");
}
 

Выводятся поля значения полей modified и title всех записей таблицы #__content. Сортировка при выводе идет по полю modified.

            SQL запросы на создание, удаление и редактирование таблиц.

1. CREATE TABLE <Имя таблицы> [(параметры)]

 $query = 'CREATE TABLE  `test` (`id_test` INT NOT NULL ,`test` TEXT NOT NULL ,`description` TEXT NOT NULL ,PRIMARY KEY ( `id_test` ));';$database->setQuery($query);if  ($database->query()){echo('Успешно<span>');}else {echo('НЕУспешно');}</span>

Создает таблицу в текущей базе данных с полями id_test (целочисленное, не нуль), test, description (текстовые). Поле id_test – первичный ключ. (Если запрос выполнится, то будет выведена надпись Успешно, Неуспешно в обратном случае.)

2. ALTER TABLE `test` <параметр>

Основные значения параметра приведены в таблице:

ADD <Имя поля1> <Тип поля> [FIRST | AFTER <Имя поля2>] Добавление нового поля в таблицу Конструкция FIRST добавляет новое поле перед столбцом <Имя поля2>. Конструкция AFTER добавляет поле после поля <Имя поля2>.
ADD INDEX [<Имя индекса>] (<Имя поля1>, …) Добавление индекса для поля <Имя поля1>. Если имя индекса не указано, то ему присваивается имя совпадающее с именем поля.
ADD PRIMARY KEY (<Имя поля1>, …) Делает поле <Имя поля1> первичным ключом таблицы.
CHANGE <Старое имя поля> <Новое имя поля> <Тип поля> Изменение поля <Старое имя поля> на поле <Новое имя поля> с типом <Тип поля>
DROP <Имя поля> Удаление поля
DROP PRIMARY KEY Удаление первичного ключа таблицы
DROP INDEX <Имя индекса> Удаление индекса

Например отредактируем таблицу test, созданную ранее. Удалим у неё поле description

 
$query = 'ALTER TABLE  `test` DROP `description`';
$database->setQuery($query);
if  ($database->query()){echo('Успешно<span>');}
else  {echo('</span>НЕУспешно<span>');}
</span>


3. DROP TABLE <Имя таблицы> 

<i>$query = 'DROP TABLE  `test`';
$database->setQuery($query);
if  ($database->query()){echo('Успешно<span>');}
else  {echo('</span>НЕУспешно<span>');}
</span></i>

Удаление таблицы test.

SQLзапросы на вставку, редактирование и удаление данных в таблицах.

                       1. INSERT INTO <Имя таблицы> VALUES (<Значение1>, …)

<i>$query = 'INSERT INTO  `mdo_message` VALUES (1,"text", 1,1,1)';$database->setQuery($query);if  ($database->query()){echo('Успешно');}else  {echo('НЕУспешно');}</i>

2. INSERT INTO <Имя таблицы> (<Имя поля1>, …) VALUES (<Значение1>, …)

<i>$query = 'INSERT INTO `mdo_message` (`message`) VALUES ("text")';$database->setQuery($query);if  ($database->query()){echo('Успешно');}else  {echo('НЕУспешно');}</i>

Вставляет запись в таблицу mdo_message. Значения всех полей кроме message устанавливаются по умолчанию.

                     3. DELETE FROM <Имя таблицы> WHERE <Усвловие> 

<i>$query = 'DELETE FROM  `mdo_message` WHERE `id_message`<1000';$database->setQuery($query);if  ($database->query()){echo('Успешно');}else  {echo('НЕУспешно');}</i>

Из таблицы mdo_message будут удалены все записи у которых значение поля id_message меньше 1000.

Итак на этом шаге мы рассмотрели основные виды SQL запросов. Рассмотрели несколько примеров использования их в Joomla. На следующем шаге мы опишем разработку реакции на нажатие подпункта меню Наша доска->Просмотр и удаление объявлений.

Шаг восьмой. Разработка реакции на нажатие подпункта меню Наша доска->Просмотр и удаление объявлений. Отображение списка существующих объявлений.

При нажатии на Просмотр и удаление объявлений пользователь видит страницу описанную в шаге 5 нашего руководства. Приступим:

Примерный вид нашей страницы:

Сначала инициализируем некоторые глобальные переменные Joomla:

 global $database,  $mosConfig_list_limit; 

$database – для возможности работы с базой данных; $mosConfig_list_limit – переменная хранит количество элементов отображаемых на странице по умолчанию (при использовании постраничной навигации).

Чтобы использовать постраничную навигацию:

нужно определить переменные: $limit, $limitstart, $total. $limit – количество элементов на странице, $limitstart – элемент с которого начинается отображение элементов на текущей странице, $total – количество элементов на всех страницах.

Значения этих переменных будут передаваться скрипту методом POST (так мы указали выше, когда описывали форму).

 
echo '<form name="adminForm" method="POST"  action="index2.php">';
 

Для получения данных, переданных скрипту используется функция mosGetParam. Она берет значения переданных переменных из суперглобального массива $_REQUEST. По умолчанию обрезает лишние пробелы в начале и конце, а также вычищает HTML код из текста. Используем её следующим способом:

 $limit = intval(  mosGetParam( $_REQUEST, 'limit', $mosConfig_list_limit ) );$limitstart = intval(  mosGetParam( $_REQUEST, 'limitstart', 0 ) );$filter_user = intval(  mosGetParam( $_REQUEST, 'filter_user', 0 ) ); 

$_REQUEST — суперглобальный массив переданный в скрипт; второй параметр имя поля значение, которого мы передавали скрипту (Например, <input type=”text” name=”name” value=”0”> ); третий параметр значение, которое должна принять переменная если значение поля передано не было (значение по умолчанию).

Возможен также и четвертый (необязательный параметр). Он указывает, как обрабатывать переданное значение. Возможны следующие значения:

 
1. _MOS_NOTRIM - не обрезать пробелы
2. _MOS_ALLOWHTML - разрешить HTML
3. _MOS_ALLORAW - не обрабатывать (т.е. текст даже с HTML и JavaScript)
 

Значение переменной $total мы можем определить только обратившись к базе данных. Что мы и делаем:

 
$query = "SELECT COUNT(*)"
."\n FROM mdo_message";
$database->setQuery( $query );
$total = $database->loadResult();
 

Когда все переменные инициализированы, нужно создать объект класса mosPageNav. Для этого:

 
require_once($GLOBALS['mosConfig_absolute_path'].
'/administrator/includes/pageNavigation.php' );
$pageNav = new mosPageNav( $total, $limitstart, $limit );
 

т.е. включаем в скрипт файл pageNavigation.php, в котором и находится описание класса mosPageNav. Ну и непосредственно создаем объект с параметрами, которые инициализировали раньше.

Далее нужно получить данные, которые будут отображаться в таблице. Нужно получить $limit строк , начиная с $limitstart строки:

 
$query = "SELECT m.*, u.name,  u.username"
. "\n FROM mdo_message AS m "
. "\n  LEFT JOIN #__users AS u ON u.id = m.id_user";
$database->setQuery(  $query, $pageNav->limitstart, $pageNav->limit );
$rows =  $database->loadObjectList();
 

Теперь объект $rows содержит требуемые данные осталось отобразить их.

Переходим к визульной части. Сначала отобразим заголовок (это лишь декоративный элемент).

 
<table  class="adminheading">
<tr>
<th>
Доска объявлений
</th>
</tr>
</table>
 

Далее должна идти таблица, оформленная в том же стиле, что и все таблицы в админ-панели. Здесь я приведу весь код, который отображает нужную нам таблицу с данными. Далее поясню некоторые моменты:

 <table  class="adminlist"><tr><th  width="20">#</th><th  width="20"><input type="checkbox" name="toggle" value=""  onclick="checkAll(<?php echo count( $rows ); ?>);" /></th><th  align="left" nowrap="nowrap">Сообщение</th><th  width="20%" nowrap="nowrap">Создатель</th><th  width="11%" nowrap="nowrap">Начало показа</th><th  width="11%" nowrap="nowrap">Конец показа</th></tr><?php$k = 0;for ($i=0, $n=count($rows);$i<$n;$i++){$row =  $rows[$i];mosMakeHtmlSafe($row);$row->id = $row->id_message;$checked  = mosCommonHTML::CheckedOutProcessing( $row, $i );?><tr class="<?php echo "row$k"; ?>"><td  align="center"><?php echo $pageNav->rowNumber( $i ); ?></td><td  align="center"><?php echo $checked; ?></td><td><?php echo $row->message; ?></td><td  align="center"><?php echo $row->name.'('.$row->username.')'; ?></td><td><?=date("Y-m-d H:i:s", $row->start_date)?></td><td><?=date("Y-m-d H:i:s", $row->end_date)?></td></tr><?php$k = 1 - $k;}?></table> 

mosMakeHtmlSafe($row); — функция которая проверят нет ли HTML кода, если есть вырежет его.

 
$row->id =  $row->id_message;
$checked = mosCommonHTML::CheckedOutProcessing( $row, $i );
 

— функция создает код для отображения checkbox`а (значение параметра value = $row->id, значение параметра id = “cb”.$i. Например: <input type=»checkbox» id=»cb1″ name=»cid[]» value=»2″ onclick=»isChecked(this.checked);» />)

 
<tr class="<?php echo " row$k"; ?>"> 
 

— используем класс row$k, для того чтобы фон выводимых строк чередовался (темный — светлый — темный). Переменная $k в конце цикла меняет своё значение (если была 0, то станет 1 и наоборот)

 <?=date("Y-m-d H:i:s", $row->start_date)?> 

— так как в нашей таблице даты хранятся в формате timestamp, поэтому для преобразования в удобочитаемы вид применяем функцию date.

И, наконец, выводим панель навигации.

 <?php echo  $pageNav->getListFooter();  ? > 

И определяем скрытое поле

 
<input  type="hidden" name="boxchecked" value="0" />
 

которое требуется для операций с checkbox`ами.

Теперь привожу полный вид файла admin.myboard.php:

Файл admin.myboard.php .

Используя этот файл изменить компонент, и проверьте на работоспособность. Не забудьте добавить данные в таблицу mdo_message. Желательно чтобы данные были верные, т.е. id пользователя указывался не от балды, а такой какой указан в таблице #__users.

На первой картинке в правом верхнем углу вы могли заметить список:

Этот список сделан для фильтрации по автору объявления. Чтобы реализовать фильтрацию добавим некоторые строки в код написанный нами ранее.

 $filter_user =  intval( mosGetParam( $_REQUEST, 'filter_user', 0 ) ); 

-после описания переменных $limit, $limitstart.

За этой предыдущей строчкой вставляем:

 
$filter[0]='';
$filter[1]='';
if  ($filter_user!=0)
{
$filter[0]="\n WHERE u.id=$filter_user";
$filter[1]="\n WHERE id_user=$filter_user";
 

             }

— для того чтобы в зависимости от значения переменной $filter_user можно было отсеивать ненужные записи. Если $filter_user равно 0 (фильтр не определен), то изменений в запросах не будет.

Далее изменяем запросы следующим образом:

 
$query  = "SELECT COUNT(*)"
. "\n FROM mdo_message"
 

Заменяем на:

 
$query = "SELECT COUNT(*)"
.  "\n FROM mdo_message"
.$filter[1];
 
 
$query  = "SELECT m.*, u.name, u.username"
. "\n FROM mdo_message AS m  "
. "\n LEFT JOIN #__users AS u ON  u.id = m.id_user";
 

Заменяем на:

 
$query = "SELECT m.*, u.name, u.username"
. "\n FROM mdo_message AS m "
. "\n LEFT JOIN #__users AS u ON u.id = m.id_user"
.$filter[0];
 

После инициализации объекта $rows:

 $query  = "SELECT u.id, u.name FROM mdo_message AS m "."\n LEFT JOIN #__users AS u ON u.id=m.id_user"."\n GROUP BY u.id";$authors[] =  mosHTML::makeOption( '0', _SEL_AUTHOR, 'id', 'name' );$database->setQuery( $query );$authors = array_merge( $authors, $authors =  $database->loadObjectList());$lists['authorid']= mosHTML::selectList(  $authors, 'filter_user', 'class="inputbox" size="1"  onchange="document.adminForm.submit( );"', 'id', 'name', $filter_user); 

И, наконец, изменяем заголовок (таблицу которая выводит — моя доска объявлений) на:

 
<table  class="adminheading">
<tr>
<th>
Доска объявлений
</th>
<td align="right">
<?php // echo $lists['authorid']; ?>
</td>
</tr>
</table>
 

Все создание списка объявлений закончено. Теперь снова проверяем работоспособность компонента.

В результате получился следующий файл admin.myboard.php

Шаг девятый. Удаление сообщений. Небольшая оптимизация кода.

На этом шаге мы напишем реакцию на нажатие кнопки Удалить.

Для того чтобы удалить какие-то сообщения нужно: 1— отметить соответствующие чекбоксы, 2 – нажать кнопку Удалить.

Заметим, что после удаления сообщений должен снова появиться список сообщений (естественно обновившийся). Чтобы не писать один и тот же код несколько раз мы создадим функцию show_mess(), которая будет отображать нам список сообщений, с возможностью фильтрации и постраничной навигацией (т.е. все сделанное нами в 6 шаге).

Итак в файле admin.myboard.php в конце файла (но перед ?>) пишем следующее:

 
function show_mess()
{
}
 

Далее весь код написанный в предыдущем шаге, т.е. код расположенный в секции default конструкции switch ($task), вырезаем и вставляем в функцию show_mess(). Должно получиться вот так:

 
function show_mess()
{
//Сюда  вставляем наш скопированный код
}
 

Теперь, в каждом месте, где нам надо вывести вышеупомянутый список (таблицу), мы будем вставлять код:

 
show_mess();
 

Так как мы уже, сейчас можем сказать, где должны отображаться сообщения, вставим в нужные места вызов, созданной нами функции.

Привожу фрагмент кода:

 
......................
switch ($act)
{
case "view_mess": 
{
switch  ($task)
{
case "edit":
echo 'Редактирование сообщения';
break;
case "remove":
echo(&lsquo;Удаление сообщений &rsquo;);
show_mess();
break;
case "cancel":
echo 'Отмена редактирования сообщения';
show_mess();
break;
case "save":
echo 'Сохраниение сообщения';
show_mess();
break;
default:
show_mess();
break;
}
}
break;
default:
echo 'Выбран пункт наша доска';
show_mess();
break;
}
......................................
 

Сделав изменения, проверим как работает компонент. Если все нормально, то на нажатие всех кнопок тулбара кроме Изменить, результатом будет отображение соответствующего сообщения и списка объявлений.

После того как вы могли наглядно убедиться, что использование функций более приемлимо, приступим к созданию функции удаляющей выбранные сообщения (в будущем мы проведем еще одну, более крупную оптимизацию – будем создавать классы и т.д.) Для того чтобы реализовать удаление сообщений создадим функцию delete_mess(). Прокомментируем основные моменты.

Функция должна получить список идентификаторов сообщений, которые были выделены пользователем. Для этого в самом начале (после <?php) файла admin.mybord.php поместим следующий код:

 
$cid = josGetArrayInts( 'cid' );
 

Функция josGetArrayInts возвращает в переменную $cid массив переданный скрипту, так как мы использовали при создании списка сообщений стандартные средства Joomla, то все чекбоксы были названы (параметр name) cid[]. Таким образом скрипту был передан массив cid. Также можно использовать и функцию mosGetParam:

$cid = mosGetParam( $_REQUEST, ‘cid’, 0 );

Для удаления сообщений больше не нужно никакой информации поэтому пишем собственно саму функцию:

 function  delete_mess($cid){global $database;$flag = true;for ($i=0;$i<count($cid);$i++){$query = "DELETE FROM  mdo_message"."\n WHERE id_message=".$cid[$i];$database->setQuery($query);if  (!$database->query()){$flag=false;}}if  ($flag) {echo("Удаление успешно");}else {echo("В одном из запросов произошла ошибка");} 

В функции мы просматриваем массив $cid и удаляем из базы те записи, которые удовлетворяют равенству id_message=$cid[$i]( все сообщения идентификаторы которых были переданы в массиве $cid).

Переменная $flag используется для того, чтобы выяснить, все ли запросы на удаление были выполнены. Если хоть один запрос не выполнен, то будет выведено соответствующее сообщение.

Теперь имея на руках функцию нужно вызвать ее в нужном месте:

 
switch ($act)
{
case "view_mess": 
{
switch ($task)
{
case "edit":
echo 'Редактирование сообщения';
break;
case "remove":
delete_mess($cid);
//Не забываем передать функции  параметр &ndash; массив $cid
show_mess();
break;
case "cancel":
echo 'Отмена редактирования  сообщения';
show_mess();
break;
case "save":
echo 'Сохраниение сообщения';
show_mess();
break;
default:
show_mess();
break;
}
}
break;
default:
echo 'Выбран пункт наша доска';
show_mess();
break;
}
 

Снова проверяем работоспособность компонента. Если все нормально, то переходим к следующему шагу. На следующем шаге мы рассмотрим редактирование сообщений и напишем соответствующую функцию.

Вариант файла admin.myboard.php  на данном шаге

Важно: очень важно проводить тщательное тестирование на наличие ошибок, проверяйте все возможные случаи использования пользователем вашего компонента.

Шаг десятый. Редактирование сообщений в панели администратора.

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

Для начала я напомню, что идентификатор сообщения у нас передается в массив $cid. Да, да именно в массив (ведь пользователь может выбрать и несколько сообщений). Так как отредактировать физически мы можем только одно сообщения (ну по крайней мере одновременно 2 и больше я не умею редактировать), то передавать в функцию будем не весь массив а только первый его элемент ($cid[0]).

Сначала напишем пустую функцию и вставим ее вызов (edit_mess($cid[0]);) в место строчки:

 echo 'Редактирование сообщения'; 

Функция:

 
function edit_mess($id_mess){}
 

Начнем:

1.Не забываем описать глобальную переменную $database

 global $database; 

2.Далее нужно запросить данные из базы данных. Нужно взять значение поля message той записи у которой значение поля id_message равно $id_mess. Следующие инструкции выполнят поставленную задачу:

 
//Пишем запрос
$query = "SELECT message FROM mdo_message  WHERE id_message=".$id_mess;
//Устанавливаем значение свойства  query объекта $database
$database->setQuery($query);
//Выполняем запрос и помещаем  результат в переменную
$message =  $database->loadResult();
 

3.Показываем поле <textarea>, с текстом $message:

 Объявление<br><textarea cols="50" rows="6"  name="message" style="width: 500px"><?php echo($message);  ?></textarea> 

4.Для того, чтобы после нажатия на кнопку Сохранить скрипт передал дальше значение $id_mess нужно вставить поле скрытого типа (hidden):

 
<input type="hidden" name="id_mess" value="<?php echo($id_mess);  ?>">}
 

В результате получается:

 function edit_mess($id_mess){global  $database;$query = "SELECT message FROM mdo_message  WHERE id_message=".$id_mess;$database->setQuery($query);$message =  $database->loadResult();?>Объявление<br><textarea cols="50" rows="6"  name="message" style="width: 500px"><?php echo($message);  ?></textarea><input type="hidden" name="id_mess"  value="<?php echo($id_mess); ?>"><?php

После того как пользователь отредактировал объявление нужно его сохранить, для этого напишем соответствующую функцию (save_mess();). Данная функция не будет иметь параметров, потому что единственный параметр который мы передаем это id_mess. Мы его можем с помощью функции mosGetParam взять прямо в теле функции. Хотя конечно на вкус и цвет…. Можно в начале файла получить значение id_mess и использовать функцию с параметром:

 function save_mess(){global  $database;$id_mess = intval( mosGetParam( $_REQUEST,  'id_mess', 0 ) );$message = mosGetParam( $_REQUEST, 'message',  '' );if (($id_mess<>0) and  ($message<>'')){$query = "UPDATE  mdo_message SET message='".$message."' WHERE id_message=".$id_mess;$database->setQuery($query);if  ($database->query()){echo("<br>Обновление записи успешно<br>");}else{echo("<br>Ошибка баз данных!<br>");}}else{echo("<br>Ошибка! Попробуйте еще раз!<br>");}} 

Вызов функции вставляем вместо строчки:

 echo 'Сохраниение сообщения'; 

В итоге мы закончили с панелью администратора, в следующем шаге начнем реализовывать лицевую часть компонента.

Добавление дополнительного поля при регистрации пользователя

Во время создания очередного интернет-проекта ввиду его интернациональности родилась следующая идея — возле вывода автора статьи вывести его страну. После нескольких манипуляций и хаков парочки файлов CMS Joomla! 1.0.x поставленая цель была достигнута.
Итак эта тема поможет вам:
1. Научится добавлять дополнительные поля при регистрации пользователя.
2. Выводить значение этого поля в любом нужном месте.
Для решения данного вопроса я руководствовался статьей «Добавляем в форму регистрации поле Дата рождения»

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

ALTER TABLE `jos_users` ADD `country` VARCHAR(255) NOT NULL default '';

2.После этого расширим набор полей класса mosUser, чтобы данные о стране автоматически попадали в базу при регистрации пользователя: 2.1 Открываем файл /includes/joomla.php
2.2 Находим в нем следующие строчки:

  var $params      = null;

/**
* @param database A database connector object
*/

function mosUser( &$database ) {

2.3 Заменяем их на:

        var $params                = null;
var $country = null;

/**
* @param database A database connector object
*/

function mosUser( &$database ) {

2.4 Для того, чтобы страна пользователя была доступна из глобальной переменной $my необходимо сделать еще одну правку. Находим:

$query = "SELECT id, name, email, block, sendEmail, registerDate, lastvisitDate, activation, params"

2.5 Заменяем на:

$query = "SELECT id, name, email, block, sendEmail, registerDate, lastvisitDate, activation,
params, country"

2.6 Ниже находим строчку:

$user->activation    = $my->activation;

2.7 И после! нее добавляем:

$user->country       = $my->country;

Первая часть подготовки выполнена, теперь необходимо добавить непосредственно поле на форму, и подправить функцию сохранения нового пользователя.
3. Открываем файл /components/com_registration/registration.html.php
3.1 Находим в нем строчки:

<input type="text" name="name" size="40" value="" class="inputbox" maxlength="50"         />
</td>
</tr>

3.2 Вставляем после! них код:

<td>
Ваша страна
</td>
<td>
<select name="country">
<option value="Украина">Украина</option>
<option value="Россия">Россия</option>
<option value="Беларусь">Беларусь</option>
<option value="Молдавия">Молдавия</option>
</select>

</td>

При необходимости можно изменить список или дополнить его. Значение атрибута value будет записыватся в базу данных.

4.Теперь исправляем непосредственно функцию сохранения нового пользователя, добавляя в нее сохранение введенной страны пользователя.
Открываем файл /components/com_registration/registration.php
4.1 Находим в нем строчку:

$row->registerDate   = date( 'Y-m-d H:i:s' );

4.2 Вставляем после! нее следующий код:

$row->country     = mosGetParam($_POST, 'country', '');

Данные введенные пользователем получены и записаны в базу данных. Теперь можно их выводить в любом нужном нам месте. Выведем страну пользователя сразу после его ника, при указании автора статьи. 5. Для этого необходимо открыть файл /components/com_content/content.html.php
5.1 Находим следующие строчки:

/**
* Writes Author name
*/
function Author( &$row, &$params ) {
if ( ( $params->get( 'author' ) ) && ( $row->author != '' ) ) {
?>
<tr>
<td width="70%" align="left" valign="top" colspan="2">
<span class="small">
<?php echo _WRITTEN_BY . ' '.( $row->created_by_alias ? $row->
created_by_alias : $row->author ); ?>
</span>
</td>
</tr>
<?php
}
}

5.2 Меняем их на:

/**  
* Writes Author name
*/
function Author( &$row, &$params ) {
global $my;
if ( ( $params->get( 'author' ) ) && ( $row->author != '' ) ) {
global $database;
$query = "SELECT country"
. "\n FROM #__users"
. "\n WHERE id = " . (int) $row->created_by
;
$database->setQuery( $query );
$row->country = $database->loadResult();
?>
<tr>
<td width="70%" align="left" valign="top" colspan="2">
<span class="small">
<?php echo _WRITTEN_BY . ' '.( $row->created_by_alias? $row->
created_by_alias : $row->author ).', '.$row->country;
?>
</span>

</td>
</tr>
<?php
}
}

P.S.: Хак опробован на CMS Joomla! 1.0.15 и CMS Joomla! 1.0.15 RE
P.P.S.: Если вам лень проделывать эти махинации, Вы можете скачать с файлового архива готовые хакнутые файлы, заменить ими оригинальные (предварительно сделав резервную копию!) и выполнить запрос с п.1 в phpMyAdmin

Добавление дополнительного поля для телефона пользователя

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

  • /includes/joomla.php
  • /components/com_registration/registration.html.php
  • /components/com_registration/registration.php
  • /components/com_user/user.html.php
  • /administrator/components/com_users/admin.users.php
  • /administrator/components/com_users/admin.users.html.php

! Настоятельно рекомендую сделать резервную копию этих файлов перед внесением в них изменений !

1.Делаем запрос в базу данных для создания дополнительного поля telephone в таблице пользователей jos_users. Для этого выполним в phpMyAdmin следующий запрос:

ALTER TABLE `jos_users` ADD `telephone` VARCHAR(255) NOT NULL default '';

2. Далее необходимо расширить набор полей класса mosUser, чтобы данные о телефоне пользователя автоматически попадали в базу при его регистрации.
Открываем файл /includes/joomla.php
Находим в нем следующие строчки:

  var $params      = null; 
/**
* @param database A database connector object
*/
function mosUser( &$database ) {

После!:

var $params= null; 

вставляем строку:

var $telephone = null; 

В этом же файле находим:

$query = "SELECT id, name, email, block, sendEmail, 
registerDate, lastvisitDate, activation, params"

Заменяем! на:

$query = "SELECT id, name, email, block, sendEmail, registerDate, 
lastvisitDate, activation, params, telephone"

Ниже находим строчку:

$user->activation    = $my->activation; 

После! нее добавляем:

$user->telephone    = $my->telephone;

Это необходимо для того, чтобы страна пользователя была доступна из глобальной переменной $my.
Первая часть подготовки выполнена, теперь необходимо добавить непосредственно поле на форму регистрации, и подправить функцию сохранения нового пользователя.


3. Открываем файл /components/com_registration/registration.html.php
Находим в нем строчки:

<tr><td><?php echo _REGISTER_EMAIL; ?> *

Над! ней вставляем:

<tr>
<td width="30%">Номер вашего телефона:</td>
<td><input type="text" name="telephone" size="40"
value="" class="inputbox" maxlength="50" /></td>
</tr>

4.Теперь исправляем непосредственно функцию сохранения нового пользователя, добавляя в нее сохранение введенной страны пользователя.
Открываем файл /components/com_registration/registration.php
Находим в нем строчку:

$row->registerDate   = date( 'Y-m-d H:i:s' ); 

Вставляем после! нее следующий код:

$row->telephone  = mosGetParam($_POST, 'telephone', ''); 

Данные введенные пользователем получены и записаны в базу данных.

5.Выведем поле «Телефон» в настройках пользователей в админке:
Открываем файл /administrator/components/com_users/admin.users.php
Находим строчки (примерно 213-216):

// load the row from the db table
$row->load( (int)$uid );
if ( $uid ) {

Чуть ниже!, после строки:

$row->username = trim( $row->username );

Вставляем следующую строку:

$row->telephone = trim( $row->telephone );

6.Теперь непосредственно выводим новое поле «Телефон» в настройках пользователя в административной части сайта:

Открываем файл /administrator/components/com_users/admin.users.html.php

Ищем примерно 237 строку:

<input class="inputbox" type="text" name="email" 
size="40" value="<?php echo $row->email; ?>" />

Чуть выше будет примерно следующий код (может отличаться в разных версиях Joomla!)

<tr>
<td>E-mail:</td>
<td>

Сразу над! ним вставляем:

<tr>
<td>Номер телефона пользователя:</td>
<td><input type="text" name="telephone" class="inputbox"
size="40" value="<?php echo $row->telephone; ?>" maxlength="25" />
</td>
</tr>

7.Выводим поле телефона в фронтальной части сайта, и добавляем возможность редактирования этого поля пользователем
Открываем файл /components/com_user/user.html.php
Находим примерно 104 строку:

<?php echo _EMAIL; ?>

Чуть выше, сразу над:

<tr><td>

вставляем следующий код:

<tr>
<td>Мой номер телефона:</td>
<td><input class="inputbox" type="text" name="telephone"
value="<?php echo $row->telephone;?>" size="40" />
</td>
</tr>

Жду комменатрии

P.S.: Хак опробован на CMS Joomla! 1.0.15 и CMS Joomla! 1.0.15 RE
P.P.S.: Если вам лень проделывать эти махинации, Вы можете скачать с файлового архива (где-то тут) готовые хакнутые файлы, заменить ими оригинальные (предварительно сделав резервную копию!) и выполнить запрос с п.1 в phpMyAdmin

Распространенные ошибки Joomla! и способы их решения

Эта статья содержит описание и способы избавления от наиболее распространенных ошибок, которые возникают в процессе установки и администрирования сайта на CMS Joomla! 1.5. Типичные ошибки ранних версий Joomla! 1.5.x в статье приводится не будут — для их решения достаточно обновится до последней актуальной версии — Joomla! 1.5.15.

Итак, начнем. Если у Вас версия Joomla! ниже 1.5.15, то вам необходимо обновить ядро:
1. Смотрим, какая версия Joomla! у нас установлена — в правом верхнем углу административной части сайта будут заветные циферки — например «Версия 1.5.12«.
2. Далее идем на joomlacode.org, в списке архивов ищем файл Joomla_1.5.12_to_1.5.15-Stable-Patch_Package.zip
3. Скачиваем и содержимое архива распаковываем в корень сайта на хостинге, подтверждая замену всех файлов.

Теперь приступим непосредственно к описанию различных ошибок и способов их решения.


Fatal error: Maximum execution time of 30 seconds exceeded in ...

Критическая ошибка при загрузке любой страницы
Комментарий: недостаточно времени для выполнения скрипта
Решение: возможны несколько способов решения данной ошибки.
1. Если сайт находится на хостинге, то попросить хостера увеличить время выполнения скриптов
2. Если сайт находится на локальном сервере — то в php.ini (для Denwer, например, php.ini находится по адресу — Z:\usr\local\php5\php.ini) находим параметр max_execution_time и увеличиваем его значение.
3. В .htaccess вставить строку (в любое место):
php_value max_execution_time 1000
4. В index.php (в корне сайта) вставить строку:
<?php ini_set(«max_execution_time», «1000»); ?>
Следует помнить, что, как правило, на хостинге доступ к php.ini отсутствует, и манипуляции из п.3 и п.4 редко помогают. Тогда единственный выход — п.1.


Fatal error: Call to a member function merge() on a non-object in /home/.../public_html/
administrator/components/com_menus/models/item.php on line ...

Критическая ошибка при создании и/или редактировании пунктов меню.
Решение: проверить целостность файла administrator/components/com_menus/models/item.php, при необходимости перезалить из установочного архива. Для гарантии — перезалить всю папку administrator из установочного архива Joomla!


Delete failed: '0a54a1212e802cc1ada1597885f9a59e.php'

Не критическая ошибка при сохранении материалов.
Комментарий: невозможно удалить файл кэша статьи.
Решение: проверить права записи (CHMOD) в папку /tmp (должны стоять 755 или 777). Проверить абсолютный путь к папке /tmp в конфиге сайта (configuration.php)


Database Error: Unable to connect to the database:Could not connect to database

Критическая ошибка соединения с базой данных.
Комментарий: нет подключения к базе данных.
Решение: проверить наличие базы данных сайта (в configuration.php в параметре var $db, имя базы данных должно соответствовать имени базы в phpMyAdmin). Проверить имя пользователя базы данных (var $user) и пароль доступа к базе данных (var $password). Если с этими параметрами все нормально — скорее всего упал MySQL, для устранения ошибки обратится к хостеру.


jtablesession::Store Failed
DB function failed with error number 1146
Table
'database_name.jos_session' doesn't exist SQL=INSERT INTO `jos_session` (
`session_id`,`time`,`username`,`gid`,`guest`,`client_id` ) VALUES (
'eb894feb5ff2dcc5f12cfc43f071fd8d','1270548439','','0','1','0' )

Критическая ошибка доступа к таблице сессий базы данных.
Комментарий: отсутствует таблица _session в базе данных.
Решение: проверить наличие таблицы _session в базе данных сайта. Проверить правильность префикса используемой базы данных (параметр var $dbprefix в configuration.php должен совпадать с префиксом таблиц базы данных, причем следует помнить, что таблицы в базе данных могут быть с разными префиксами, по умолчанию Joomla! использует префикс «jos_«).


JAuthentication::__construct: Could not load authentication libraries.
Имя пользователя и пароль не совпадают

Критическая ошибка авторизации в административной части сайта.
Комментарий: причиной ошибки является отключение (снятие с публикации) плагина Authentication — Joomla и/или плагина User — Joomla!
Решение: необходимо в phpMyAdmin включить два плагина (либо через интерфейс phpMyAdmin, либо выполнить два следующих SQL-запроса):
Активирование плагина Authentication — Joomla

UPDATE `jos_plugins` SET `name` = 'Authentication - Joomla', `element` = 'joomla', `folder` = 
'authentication', `access` = '0', `ordering` = '1', `published` = '1', `iscore` = '1',
`client_id` = '0', `checked_out` = '0', `checked_out_time` = '0000-00-00 00:00:00',
`params` = '' WHERE `id` = '1';

Активирование плагина User — Joomla!

UPDATE `jos_plugins` SET `name` = '', `element` = 'joomla', `folder` = 'user', `access` = '0', 
`ordering` = '0', `published` = '1', `iscore` = '0', `client_id` = '0', `checked_out` = '0',
`checked_out_time` = '0000-00-00 00:00:00', `params` = 'autoregister=1\r\n\r\n'
WHERE `id` = '5';

JAuthentication::__construct: Невозможно загрузить библиотеки аутентификации.
Имя пользователя и пароль не совпадают или учетная запись отсутствует

Критическая ошибка авторизации в фронтальной части сайта.
Комментарий: причиной ошибки является отключение (снятие с публикации) плагина Authentication — Joomla и/или плагина User — Joomla!
Решение: необходимо в phpMyAdmin включить два плагина (либо через интерфейс phpMyAdmin, либо выполнить два следующих SQL-запроса):

UPDATE `jos_plugins` SET `name` = 'Authentication - Joomla', `element` = 'joomla', `folder` = 
'authentication', `access` = '0', `ordering` = '1', `published` = '1', `iscore` = '1',
`client_id` = '0', `checked_out` = '0', `checked_out_time` = '0000-00-00 00:00:00',
`params` = '' WHERE `id` = '1';

Активирование плагина User — Joomla!

UPDATE `jos_plugins` SET `name` = '', `element` = 'joomla', `folder` = 'user', `access` = '0', 
`ordering` = '0', `published` = '1', `iscore` = '0', `client_id` = '0', `checked_out` = '0',
`checked_out_time` = '0000-00-00 00:00:00', `params` = 'autoregister=1\r\n\r\n'
WHERE `id` = '5';

Warning: main(/путь/includes/phpInputFilter/class.inputfilter.php):failed to open stream: 
No such file or directory in /путь/includes/joomla.php on line 81
Fatal error: main():
Failed opening required '/путь/includes/phpInputFilter/class.inputfilter.php'
(include_path='.:/usr/lib/php:/usr/local/lib/php') in /путь/includes/joomla.php on line 81

Критическая ошибка во время установки либо после установки Joomla!
Комментарий: папка /includes/phpInputFilter залилась не полностью либо в неправильном регистре.
Решение: проверить и/или заменить папку /includes/phpInputFilter из оригинального дистрибутива и проверить регистр имени папки — при необходимости переименовать (вместо phpinputfilter в phpInputFilter)


cURL extension is not available on your server

Некритическая ошибка появляется при публикации некоторых модулей на форнте сайта (в местах вывода модулей).
Комментарий: отсутствует расширение php_curl на хостинге.
Решение: Необходимо подключить расширение PHP cURL — либо в php.ini добавить extension=php_curl.dll, либо, если нет доступа к php.ini, обратится к хостеру.


Warning: session_start() [function.session-start]: Cannot send session cache limiter - 
headers already sent (output started at /путь/configuration.php:1) in
/путь/libraries/joomla/session/session.php on line 423

Warning: Cannot modify header information - headers already sent by (output started at
/путь/configuration.php:1) in /путь/libraries/joomla/session/session.php on line 426

Критическая ошибка при загрузке сайта.
Решение: проверить кодировку файла конфигурации (configuration.php). Кодировка файла должна быть в utf-8 без BOM. Содержимое файла configuration.php должно начинаться с <?php. Если впереди имеются какие либо другие символы — удалите их.


ERROR LOADING FEED DATA
Ошибка при загрузке канала данных.
Ошибка: запрашиваемая лента не загружена

Некритическая ошибка, появляется в админке и в лицевой части сайта соответственно.
Комментарий: по какой-то причине не возможно загрузить ленту новостей.
Решение: Необходимо снять с публикации административный модуль mod_feed (либо удалить его).


Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes)...

Критическая ошибка появляется при выполнении определенных операций.
Комментарий: Для выполнения скриптов недостаточно отведенной хостером оперативной памяти.
Решение: Существует несколько способов решить эту ошибку:
1. Пробуем самостоятельно увеличить память для выполнения скрипта
1.1. В файл index.php (в корне сайта) добавляем строку (при необходимости значение 32М можно увеличить, но сильно увеличивать не стоит):
<?php ini_set(«memory_limit», «32M»); ?>
1.2. В файл .htaccess (в корне сайта) добавлем строку:
php_value memory_limit 32M
1.3. В php.ini (если есть к нему доступ) увеличиваем параметр memory_limit:
memory_limit = 32M
1.4. В своем скрипте добавляем:
ini_set(‘memory_limit’, ’32M’)
1.5. Для Joomla! 1.5 существует плагин Memory Limit Plugin, который добавляет память для выполнения скриптов без ручного вмешательства в файлы сайта.
2. Если все вышеперечисленные способы не помогли — обращаемся к хостеру с просьбой об увеличении оперативной памяти для выполнения скриптов.


JFolder::create: Path not in open_basedir paths
Unable to create destination

Критическая ошибка при установке расширений.
Комментарий: ошибка связанная с open_basedir.
Решение: Для начала проверяем правильность пути к папке tmp (в файле сonfiguration.php). Если там все верно, то открываем файл  /libraries/joomla/filesystem/folder.php и находим $obd = ini_get(‘open_basedir’) (примерно 194 стр.) и комментируем её, т.е. ставим впереди этой строки //


JFolder::create : Infinite loop detected

Критическая ошибка при установке расширений.
Решение: В большинстве случаев ошибка появляется тогда, когда для временной папки tmp указан неверный путь (в файле сonfiguration.php).


DB function failed with error number 1030

Критическая ошибка при сохранении и/или редактировании материалов или модулей.
Комментарий: повреждены таблицы базы данных.
Решение: необходимо проверить таблицы базы данных и восстановить их (в phpMyAdmin есть соответствующие функции). Также есть вероятность переполнения временной папки /tmp. Удалите ее содержимое, если не помогло — обратится к хостеру с сообщением об ошибке MySQL — 1030 SQLSTATE: HY000 (ER_GET_ERRNO)


XML Parsing Error at 1:37. Error 108: Unknown

Критическая ошибка при создании и/или установке модулей.
Комментарий: ошибка в xml-файле модуля.
Решение: необходимо проверить xml-файл устанавливаемого или создаваемого модуля. В начале файла должны содержатся следующие строки:


DB function failed with error number 1226
User 'username' has exceeded the 'max_questions' resource ...
Ошибка MySQL 1226: превышено допустимое количество запросов

Критическая при загрузке страниц сайта
Комментарий: на сервере установлено ограничение количества запросов от одного пользователя базы данных.
Решение: в панели управления хостингом создаем двух или трех пользователей вашей базы данных, с правами, идентичными основному пользователю. Далее открываем файл configuration.php и вносим правки:
для Joomla! 1.0 — находим

и заменяем на следующее:

где: main_user_joomla — главный пользователь БД
main_user_joomla2, main_user_joomla3, main_user_joomla4 — созданные копии главного пользователя.

Для Joomla! 1.5 — добвляем после class JConfig {


Call to undefined function: xml_parse() in /.../libraries/joomla/utilities/simplexml.php on line xxx

Критическая ошибка при попытке установки CMS Joomla! ранних версий.
Комментарий: данная ошибка является следствием особенности хостинга.
Решение: необходимо обратится к хостеру с сообщением об ошибке библиотеки XML-парсинга. В некоторых случаях достаточно добавить в файл .htaccess следующие строки:

AddHandler x-httpd-php5all .php .inc .php5 
AddHandler x-httpd-php4 .php4

JInstaller::install: Ошибка SQL DB function failed with error number 2006
MySQL server has gone away SQL= запрос

Критическая ошибка при установке объемных расширений, чаще всего компонентов, содержащих большое количество файлов.
Комментарий: MySQL сервер уходит в оффлайн, так как исчерпывается время ожидания сервера
Решение: необходимо обратится к хостеру с просьбой увеличить время в параметре mysql.connect_timeout. Но хостеры, идущие навстречу клиентам — редкость в наше время. Поэтому пробуем ручную установить расширение (с распаковкой архива расширения на хостинг) либо использовать хак от Martin Brampton: качаем файл JoomlaDBI.zip из файлового архива, делаем резервную копию файлов /libraries/joomla/database/database/mysql.php и /libraries/joomla/database/database/mysqli.php Далее заменяем эти файлы аналогичными модифицированными файлами из архива.


Fatal error: Call to undefined method JLanguage::getBackwardLang() in /...
/administrator/components/com_virtuemart/compat.joomla1.5.php on line 78

Критическая ошибка при установке VirtueMart.
Комментарий: Ошибка является следствием несовместимости устанавливаемой версии VirtueMart и линейки Joomla и возникает в результате установки VirtueMart версии 1.1.x на Joomla! 1.6 или 1.7
Решение: Проверьте соответствие версии компонента магазина VirtueMart и Вашей Joomla!. Линейка VirtueMart 1.1.x (например 1.1.9) предназначена только для Joomla! 1.5


JFolder::files: Path is not a folder

Некритическая ошибка в административной части сайта (в общих настройках и пр.).
Комментарий: Наиболее частой причиной этой ошибки есть удаление некоторых ненужных, как может показаться на первый взляд, папок по FTP, в первую очередь вложенных каталогов в папке images:
images/banners
images/M_images
images/smilies
images/stories
Решение: Проверьте наличие этих папок, если же они отсутствуют (все, или хотя бы одна из них) возьмите отсутствующие папки из установочного архива Joomla либо просто создайте их на хостинге. Если же папки имеются, проверьте также регистр имени папок — папка images/M_images должна называться именно так, а не images/m_images


JInstaller::install: Ошибка SQL DB function failed with error number 1064

Критическая ошибка при установке расширений.
Комментарий: Ошибка происходит при попытке установки расширений для Joomla и связанная с тем, что запрос в БД написан для устаревших версий MySQL и некорректно работает с новыми версиями.Решение: найдите в вашем установочном запросе упоминание Type = MYISAM и замените на ENGINE = MYISAM либо, если это возможно, используйте новые версии расширений.

Обзор клиентов для работы с CMS Joomla! Blogg-X

Это первая статья из цикла статей-обзоров клиентов для удаленной работы с CMS Joomla! Для наполнения сайта клиента новостями иногда необходимо дать доступ к сайту девушке-секретарю. При обилии множества незнакомых надписей и кнопок, девушки, как правило, теряются. И для их обучения работе с сайтом требуется приложить немало усилий и времени. Для упрощения ситуации существуют удобные клиенты для удаленной работы с сайтом на CMS Joomla! Они представляют собой небольшую програмку с редактором, которая устанавливается на ПК, коннектится к сайту и постит в него новости. Задача: не заходя в админку управлять новостями на сайте. Исходные данные: ОС Windows XP SP3 (OS X , Linux) с .NET Framework 3.5, подключение к интернету, сайт на CMS Joomla! (1.5.x или 1.0.x), на сайте зарегистрирован пользователь с правами не ниже Автора.  

Blogg-X

Blogg-X представляет собой кросс-платформенный (OS X, Windows XP, Linux) инструмент управления содержимым для сайтов на CMS Joomla!. Blogg-X работает локально на вашем компьютере как настольное приложение и использует встроенный WYSIWYG и HTML редакторы. Вы можете разместить материал на вашем сайте на Joomla! без использования веб-браузера и административной панели сайта. Разработчик — http://iobinary.comСкачатьBlogg-X 3

Установка Blogg-X

Итак, мы скачали клиент Blogg-X (на текущий момент последняя версия — BloggX3Beta_24Mar2010). Если Вас не удивило расширение установочного файла (.air), то смело к следующему абзацу. Если же вызвало затруднения, то для его установки необходимо сначала установить Adobee AIR. После установки Adobee AIR (AdobeAIRInstaller.exe)  устанавливаем непосредственно клиент Blogg-X (BloggX3Beta_24Mar2010.air) Далее на сайте устанавливаем плагин Blogg-X (скачать) (или мамбот, если сайт на CMS Joomla! 1.0.x) После стандартной установки плагина нужно зайти в менеджер плагинов и включить (опубликовать) его.  

Настройка Blogg-X

После запуска клиента, принимаем лицензионное соглашение и видим начальное окошко Blogg-X – менеджер сайтов.

Blogg-X Менеджер Сайтов   Для начала нам нужно добавить и настроить сайты, которые в дальнейшем будут набиваться контентом (нажимаем Add Site и вводим необходимые данные):

Blogg-X Новый сайт — Имя сайта (Name) – произвольное название сайта — Сайт (Site) – адрес сайта на CMS Joomla! (например – www.site.ru – http:// прописывать не нужно) — Имя пользователя (Username) – логин для входа на сайт, права пользователя должны быть не ниже Автора. — Пароль (Password) – пароль пользователя — Версия CMS Joomla!Joomla! 1.0.x или Joomla! 1.5.x   Итак, мы добавили несколько сайтов в Менеджер Сайтов (Manage Sites)

Blogg-X список сайтов   В Настройках плагинов (Plugin Setting) можем включить поддержку Attachments, JoomFish и AllVideos. Соответствующие компоненты и плагины должны быть установлены на сайте.

Blogg-X Настройки плагинов   В Настройках приложения (Application Settings) можно выбирать язык приложения (доступен английский, хорватский, немецкий и шведский – русский ожидается в следующей версии Blogg-X). Также можно отключить Менеджер Архивов (Manage Archives), Менеджер Корзины (Manage Trash), Менеджер Разделов (Manage Sections) и Менеджер Категорий (Manage Categories). Настройки Blogg-X Authentification не изменяем. Также можно выбрать цветовую гамму приложения (синий, оранжевый, зеленый, красный и темно-зеленый).

Blogg-X Настройки приложения   На главной странице Blogg-X для удобства появятся кнопки быстрого доступа к сайтам:

Blogg-X быстрый доступ  

Подключение и работа

Подключаемся к нужному сайту через Blogg-X – два щелчка по сайту в Менеджере СайтовBlogg-X. После успешного соединения мы должны увидеть следующую картинку:

Blogg-X соединение с сайтом Предлагается добавить новый материал (New Article), перейти в Менеджер Материалов (Article Manager) или в Медиа Менеджер (Media Manager)   При добавлении материала (New Article) появится удобный визуальный редактор (FCKeditor). Интерфейс добавления статьи максимально приближен к стандартному добавлении материала через админку CMS Joomla! Единственное неудобство – отсутствует возможность добавить статью без раздела и категории. Эта опция не предусмотрена сознательно — поскольку такой материал нигде не будет отображаться.

Blogg-X Редактор статьи   Также в статью можно вставить медиа-объекты: картинки (Images), аудио (Audio), видео (Video) и прикрепить файл (Documents). При условии что на сайте установлены компоненты и плагины от Attachments и AllVideos.

Blogg-X Вставка медиа   Менеджер Материалов (Article Manager) представляет собой список всех материалов сайта и позволяет редактировать, копировать, публиковать и снимать с публикации, отправлять в архив и удалять материалы.

Blogg-X Менеджер материалов   Медиа Менеджер (Media Manager) содержит структуру папки /images/stories и предпросмотр изображений, аудио и видео.

Blogg-X Менеджер материалов   Также позволяет загружать несколько изображений сразу.

Blogg-X загрузка объектов   Возможные предупреждения и ошибки: 1. Site URL incorrect in settings – некорректно введен адрес сайта. 2. Cannot reach internet – нет подключения к интернету. 3. Plugin/Mambot not installed – плагин или мамбот на сайте не установлен.   Если все настроено правильно, но приложение не работает – проверьте права доступа к файлам плагина – CHMOD папки /plugins/xmlrpc/flashservices/services/bloggx должен быть 755, на файл /plugins/xmlrpc/bloggx_server.php — 644   Если отсутствует подключение к инету — к локальному серверу (Denwer и пр.) приложение подключится не сможет.  

Что хотелось бы видеть в следующей версии (они же — недостатки):

  • Возможность создавать папки в Медиа Менеджере.
  • Более внятный механизм вставки изображений в статьи.
  • Обновление материалов после их сохранений.
  • Русифицированную версию приложения.
  • Добавление описания и ключевых слов материалов.

 Миграция с Joomla! 1.5 на Joomla! 1.6

Вот и вышла долгожданная «революционная» Joomla! 1.6. На волне всеобщего восхищения новым движком многие тут же задались вопросом:

«Как перенести сайт с Joomla! 1.5 на Joomla! 1.6»

Этот материал представляет собой как пошаговую инструкцию по миграции сайта с Joomla! 1.5 на Joomla! 1.6, так и небольшой анализ целесообразности этого переноса. Скажу сразу, прежде чем решаться на этот непростой шаг, дочитайте до конца этот материал.
Почему-то бытует мнение, что перенести сайт с Joomla! 1.5 на Joomla! 1.6 достаточно просто. Не обольщайтесь, если вы решились на миграцию, то впереди вас ждет большая работа с множеством неведомых подводных камней. В Joomla! 1.6 определенная часть кода взята с Joomla! 1.5, но большая часть написана с нуля, поэтому разница между этими версиями более чем существенна. Собственно потому мы и вынуждены говорить не об обновлении, а об миграции, переносе. Разработчики обещают, что переход с Joomla! 1.6 на новые линейки будет более простой, но это вопрос хоть и не далекого, но будущего.

На сегодня существует всего лишь один мигратор, который даже можно назвать официальным, поскольку в его разработке на добровольных основах принимают участие разработчики самого ядра Joomla! 1.6 — это компонент jUpgrade Матиаса Агирре (Matias Aguirre).

Нужно ли мигрировать?

Прежде чем решиться на перевод сайта на Joomla! 1.6 нужно определить целесообразность миграции. Согласно проведенному опросу на joomlaforum.ru, большинство пользователей готово перенести сайт на новую систему, при условии, что используется только стандартный фунционал 1.5 версии Joomla! (за это проголосовало примерно треть участников голосования — 32,4%). Против миграции высказалось 22% пользователей. Стоит заметить, что против перехода по большей части проголосовали продвинутые пользователи, за миграцию — новички. Это также должно дать пищу для размышлений.
Две основные особенности Joomla 1.6, которые дают ей преимущества над Joomla 1.5 это ACL и вложенность категорий. Это существенные преимущества, однако, для многих пользователей 1.5 в этом нет необходимости.
Собственно, прежде чем приступить к миграции, необходимо убедиться в том, что ваш сервер сможет работать с CMS Joomla! 1.6. Для этого ознакомимся с требованиями, которые предъявляет нам Joomla! 1.6:

  • Apache: v2.x
  • PHP: v5.2.4 +
  • MySQL: v5.0.4+

Следует отметить, что требования существенно изменились, по сравнению с требованиям Joomla! 1.5. Хотя эти требования сейчас не являются чем то заоблачным для большинства хостингов.
Также для корректной работы мигратора jUpgrade необходимо соблюдение следующих условий:

  • PHP 5.x
  • Включенный модуль PHP Curl
  • Joomla 1.5
  • Браузер с поддержкой Javascript/jQuery

До того, как приступить к миграции, обязательно примите к сведению следующую информацию:

 1 Версия Joomla! 1.5: должна использоваться последняя версия Joomla! 1.5 — на текущий момент это Joomla! 1.5.22. Если вы используете версию ниже 1.5.22, то прежде чем мигрировать, вам необходимо обновиться до последней версии.

 2 Аналоги расширений для Joomla! 1.6: скорее всего вы используете на вашем сайте сторонние расширения. Необходимо убедиться, если ли аналогичные расширения для новой Joomla! 1.6? Мигратор на данным момент не поддерживает миграцию сторонних расширений.

 3 Хаки Joomla! 1.5: если вы применяли хаки ядра сайта на Joomla! 1.5 то эти изменения при миграции будут утеряны.

 4 Аналог шаблона для Joomla! 1.6: проверьте, есть ли аналогичная версия вашего шаблона для Joomla! 1.6? На данный момент мигратор не поддерживает полную миграцию шаблонов1.

 5 Локализация для Joomla! 1.6: проверьте, если ли нужная вам локализация2 Joomla! 1.6?

 6 Права на папки: на все ли необходимые папки и файлы выставлены нужные права?

 7 Необходимость миграции: вы точно уверены что миграция с Joomla! 1.5 на Joomla! 1.6 необходима? Помните: в большинстве случаев миграция нецелесообразна.

Перед выполнением каких либо работ, а в особенности миграции, необходимо сделать полную резервную копию сайта (папки с файлами и база данных) и убедиться в том, что сделанный бекап работоспособен. Это поможет вам избежать неприятностей, в случае «если что-то пойдет не так», а при миграции вероятность наступления таких случаев очень высока.

Миграция с Joomla! 1.5 на Joomla! 1.6

Если в двух словах — то принцип работы jUpgrade следующий: скачивается свежий дистирибутив Joomla! 1.6, затем происходит извлечение из архива и переконвертирование базы данных. Обновленный сайт доступен по адресу site.ru/jupgrade (если прежнаяя версия сайта была установлена в корень а не в подкаталог). Таким образом даже в случае когда по каким-то причинам миграция сорвется, прежний сайт пострадать не должен.

 1  Скачиваем последнюю версию компонента jUpgrade на данный момент это версия 0.5.3 (качаем либо с файлового архива либо с сайта разработчика — matware.com.ar

 2 Устанавливаем компонент com_jupgrade на сайт Joomla! 1.5 стандартным способом.

 3 Далее переходим в Компоненты -> jUpgrade (Components->jUpgrade).

 4 Параметры пока не трогаем — оставляем то, что стоит по умолчанию.

 5 Нажимаем кнопку Start jUpgrade

 6 Далее происходит проверка конфигурации (1), скачивание установочного дистрибутива Joomla! 1.6 (2), разархивирование архива (3). На четвертом шаге (4) начинается непосредственно установка CMS Joomla! 1.6. На пятом шаге (5) происходит миграция встроенных расширений сайта. Далее следует обновление шаблонов (6) и на восьмом шаге (8) миграция заканчивается. Седьмой шаг в текущей версии пока упущен — в нем предусмотрена миграция сторонних расширений, что, пока еще, не реализовано.

 7 Если на предыдущем шаге у вас возникли проблемы с загрузкой дистрибутива Joomla! 1.6 (недостаточный тайм-аут, проблемы с java и пр.) либо с распаковкой установочного архива, вы можете осуществить это вручную):

  • Скачиваем дистрибутив Joomla! 1.6 с SVN — http://anonymous:@joomlacode.org/svn/joomla/development/branches/jupgrade/pack/joomla16.zip
  • Помещаем архив в папку /tmp в корне сайта
  • Идем в настройки компонента jUpgrade и выставляем параметр Skip download — ДА
  • Если по какой то причине возникли сложности с распаковкой — выставяем параметр Skip decompress — ДА
  • При этом разпаковать скачанный архив нужно вручную в папку /jupgrade в корне вашего сайта.

 8 Если миграция прошла успешно (вас устроило то, что вы увидели по адресу site.ru/jupgrade и site.ru/jupgrade/administrator) то стоит перенести содержимое старого сайта в резервных подкаталог, а новый сайт перенести из папки /jupgrade в корень сайта, дабы избежать путаницы в файлах нового и старого сайта. На данный момент поддерживаются следующие составляющие сайта:

  • Баннеры (com_banners) -100%
  • Категории — 90%
  • Контакты (com_contact) — 100%
  • Контент (com_content) — 90%
  • Меню — 50%
  • Модули — 50%
  • Новостные ленты (com_newsfeeds) — 100%
  • Пользователи (com_users) — 95%
  • Ссылки (com_weblinks) — 100%
  • Шаблоны — 20%
  • Сторонние расширения — 0 %

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

Вывод

Итак, подведем итоги.
Процесс миграции сайта с Joomla! 1.5 на Joomla! 1.6 довольно не простой и требует определенных навыков. Почему? Потому что, одним использованием компонента jUpgrade здесь не обойтись — это всего лишь вспомогательный инструмент, полумера. Даже когда разработчики jUprade начнуть поддерживать миграцию сторонних (хотя бы самых популярных) расширений, этого будет недостаточно для безболезненного мигрирования сайта. Главная преграда — значительные различия между структурами баз данных версий 1.5 и 1.6.


Поэтому достаточно очевидно — если вы имеете успешный, посещаемый сайт, целесообразности в миграции нет. Если вы имеете добротный, популярный развивающийся сайт — здесь вам необходимо для себя решить, стоит ли игра свеч? Поддержка Joomla! 1.5 будет осуществлятся еще год, как минимум (по заверениям разработчиков), и если вы осознаете, какие подводные камни миграции вас могут ожидать, и то, какие выгоды вам принесет перевод сайта на новую систему — мигрируйте.


1— Эти ссылки помогут вам переделать ваш шаблон сайта на Joomla! 1.5 на шаблон для нового сайта на Joomla! 1.6:

  1. Chad Windnagle’s Joomla Community blog — http://community.joomla.org/blogs/community/1257-16-templates.html
  2. Chris Davenport’s «Template Changes for Joomla 1.6» presentation — http://www.slideshare.net/chrisdavenport/template-changes-for-joomla-16
  3. Joomla’s Docs Template Tutorial — http://docs.joomla.org/Tutorial:Upgrade_Joomla_1.5_Template_to_Joomla_1.6

2 — Проверить наличие локализации можно на странице: http://community.joomla.org/translations/joomla-16-translations.html