Переход с Joomla 1.5 на Joomla 1.6 для программистов

08.07.2011

Joomla

В этой статье я расскажу про трудности при переходе с Joomla 1.5.23 на Joomla 1.6.4, которые у меня возникли и о том как я с ними справился.

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

Компоненты

Больше не существуют таблицы компонентов `jos_components`, теперь компоненты, как и любые другие расширения, включая локализацию, шаблоны и модули, регистрируются в таблице `jos_extensions`.

Пример регистрации главного компонента сайта.

INSERT INTO `jos_extensions`
	(`extension_id`,`name`,`type`,`element`,`client_id`,`protected`,`manifest_cache`)
VALUES
	(40,'Ceramoteka','component','com_ceramoteka',1,1,`{"legacy":false,"name":"Ceramoteka","type":"component","creationDate":"07.07.2011","author":"Ilya Indigo","version":"1.6.4","description":"Ceramoteka"}`);

Затем что бы зарегистрировать подкомпоненты нашего компонента, а точнее компоненты нашего сайта, их нужно прописывать не в таблице `jos_menu`.

Пример регистрации компонентов сайта в таблице меню.

INSERT INTO `jos_menu`
	(`id`,`menutype`,`title`,`alias`,`path`,`link`,`type`,`parent_id`,`level`,`component_id`,`ordering`,`img`,`home`,`language`,`client_id`)
VALUES
	(40,'main','Ceramoteka','Ceramoteka','Ceramoteka','index.php?option=com_ceramoteka','component',1,1,40,0,'../images/icons/icon-16.png',0,'*',1),
	(41,'main','Текстовые страницы','Текстовые страницы','Текстовые страницы','index.php?option=com_ceramoteka&tab=text','component',40,2,40,1,'../images/icons/icon-16.png',1,'*',1),
	(42,'main','Каталог','Каталог','Каталог','index.php?option=com_ceramoteka&tab=catalog','component',40,2,40,2,'../images/icons/icon-16.png',0,'*',1),
	(43,'main','Наши проекты','Наши проекты','Наши проекты','index.php?option=com_ceramoteka&tab=portfolio','component',40,2,40,3,'../images/icons/icon-16.png',0,'*',1),
	(44,'main','Новости','Новости','Новости','index.php?option=com_ceramoteka&tab=news','component',40,2,40,4,'../images/icons/icon-16.png',0,'*',1),
	(45,'main','Партнёры','Партнёры','Партнёры','index.php?option=com_ceramoteka&tab=partner','component',40,2,40,5,'../images/icons/icon-16.png',0,'*',1),
	(46,'main','Конфигурация','Конфигурация','Конфигурация','index.php?option=com_ceramoteka&tab=config','component',40,2,40,6,'../images/icons/config-16.png',0,'*',1);

А так же в связи с введением уровней доступа код модуля быстрых иконок, для автоматического создания удобного меню в админке сайта, находящигося в папке administrator/modules/mod_quickicon/mod_quickicon.php изменяем наследующий.

Пример кода меню быстрых иконок.

authorise($access[$i],$access[$i+1])) return false;
		}
		$current = (!$current) ?NULL :' class="current"';
		echo '
',JHTML::_('image.site',$image,NULL,NULL,NULL,$text),' ',$text,'
'; } echo '
'; JFactory::getDBO()->setQuery('SELECT `link`,`img`,`title` FROM jos_menu WHERE `parent_id`=40 ORDER BY `ordering`'); $res = &JFactory::getDBO()->loadObjectList(); if (isset($res[0])) { foreach ($res as $menu) { if (!isset($_REQUEST['tab'])) $_REQUEST['tab'] = NULL; $img = (is_file($img = strtr($menu->img,array('-16'=>NULL)))) ?$img :'../images/icons/icon.png'; $current = ($_REQUEST['tab'] != substr($menu->link,strpos($menu->link,'tab='.$_REQUEST['tab'])+4)) ?false :true; $access = array('core.manage','com_users'); quickiconButton(htmlspecialchars($menu->link),htmlspecialchars($img),htmlspecialchars($menu->title),$current,$access); } } $current = ($_REQUEST['option'] != 'com_users') ?false :true; quickiconButton('index.php?option=com_users','templates/'.$app->getTemplate().'/images/header/icon-48-user.png',JText::_('MOD_QUICKICON_USER_MANAGER'),$current,array('core.manage','com_users')); $current = ($_REQUEST['option'] != 'com_config') ?false :true; quickiconButton('index.php?option=com_config','templates/'.$app->getTemplate().'/images/header/icon-48-config.png',JText::_('MOD_QUICKICON_GLOBAL_CONFIGURATION'),$current,array('core.manage','com_config','core.admin','com_config')); echo '
'; ?>

При этом предполагается, что в папке images/icons лежат иконки нашего меню, в таком формате 16*16 - иконка, путь которой прописывается в таблице `jos_menu` для соответствующего компонента сайта имеет вид icon-16.png, а иконка 48*48 нужная для отображения именно в этом меню имеет вид icon.png.

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

Шаблоны

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

Регистрация шаблона в таблице расширений

INSERT INTO `jos_extensions`
	(`extension_id`,`name`,`type`,`element`,`client_id`,`protected`,`manifest_cache`)
VALUES
	(506,'Основной','template','main',0,1,`{"legacy":false,"name":"Основной","type":"template","creationDate":"07,07,2011","author":"Ilya Indigo","version":"1.6.4","description":"Основной"}`);

А затем ещё и зарегистрировать, как миниум 1, стиль этого шаблона в таблице стилей шаблонов.

Регистрация стиля шаблона в таблице стилей шаблонов

INSERT INTO `jos_template_styles`
	(`template`,`title`)
VALUES
	('main','Основной');

 

Меню клиентской части сайта.

 

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

Сначала регистрируются необходимые модули меню в таблице модулей.

Регистрация модулей меню в таблице модулей

INSERT INTO `jos_modules`
	(`id`,`title`,`position`,`published`,`module`,`access`,`showtitle`,`language`)
VALUES
	(19,'Главное меню','menu',1,'mod_menu',1,0,'*'),
	(20,'Скрытое меню','hidden',0,'mod_menu',1,0,'*');

А затем они ещё прописываются в таблице `jos_modules_menu`, где 19,20 - id соответствующих модулей меню в таблице `jos_modules`.

Регистрация модуля в таблице модулей

INSERT INTO `jos_modules_menu`
	(`moduleid`)
VALUES
	(19),
	(20);

После регистрации модулей меню, ручная привязка пунктов меню к компонентам осуществляется в таблице `jos_menu`.

Привязка пунктов меню к компонентам в таблице меню

INSERT INTO `jos_menu`
	(`id`,`menutype`,`title`,`alias`,`path`,`link`,`type`,`parent_id`,`level`,`component_id`,`ordering`,`img`,`home`,`language`,`client_id`)
VALUES
	(51,'mainmenu','Главная','index','index','index.php?option=com_ceramoteka&view=index','component',1,1,40,1,'',1,'*',0),
	(52,'mainmenu','Каталог','catalog','catalog','index.php?option=com_ceramoteka&view=catalog','component',1,1,40,2,'',0,'*',0),
	(53,'mainmenu','Наши проекты','portfolio','portfolio','index.php?option=com_ceramoteka&view=portfolio','component',1,1,40,3,'',0,'*',0),
	(54,'mainmenu','Новости','news','news','index.php?option=com_ceramoteka&view=news','component',1,1,40,4,'',0,'*',0),
	(55,'mainmenu','О компании','about','about','index.php?option=com_ceramoteka&view=about','component',1,1,40,5,'',0,'*',0),
	(56,'mainmenu','Партнёры','partner','partner','index.php?option=com_ceramoteka&view=partner','component',1,1,40,6,'',0,'*',0),
	(57,'mainmenu','Вакансии','vacancy','vacancy','index.php?option=com_ceramoteka&view=vacancy','component',1,1,40,7,'',0,'*',0),
	(58,'mainmenu','Контакты','contact','contact','index.php?option=com_ceramoteka&view=contact','component',1,1,40,8,'',0,'*',0);

 

Модули

 

Что бы менеджер модулей определил наш модуль, уже просто недостаточно его скопировать в папку modules, а потом вызвать диалог "Создать". Теперь его так же нужно явно прописать в таблице модулей.

Регистрация модуля в таблице модулей

INSERT INTO `jos_modules`
	(`id`,`title`,`position`,`published`,`module`,`access`,`showtitle`,`language`)
VALUES
	(21,'Каталог','catalog',1,'mod_catalog',1,0,'*');

А затем ещё прописать его в таблице `jos_modules_menu`, где 21 - id соответствующего модуля в таблице `jos_modules`.

Регистрация модуля в таблице модулей

INSERT INTO `jos_modules_menu`
	(`moduleid`)
VALUES
	(21);

 

Так же вместо объекта $mainframe, используется глобальный объект $app.

 

Непример если мы раньше вызывали функцию перенаправления таким кодом.

redirect('index.php');
?>

То в Joomla 1.6 она будет выполнятся таким кодом.

redirect('index.php');
?>

 

Ну а так же есть более мелкие проблемы не связанные с изменением структуры БД,такие как:

 

  • Отсутствие готовой руссифицированной joom.ru-шной сборки, и необходимость вручную руссифицировать Joomla 1.6.
  • Придёться заново править стили для нового шаблона админки bluestork.
  • Отсутствие версии установленной Joomla в футере сайта, в новом шаблоне bluestork, которую нужно выводить правя шаблон.

Последнее в нашем блоге