Заказать услугу
  • +38 099 227-70-70
  • +38 097 770-63-63

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

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','<strong>Ceramoteka</strong>','<strong>Ceramoteka</strong>','<strong>Ceramoteka</strong>','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 изменяем наследующий.

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

<?php
	defined('_JEXEC') or die('Ни, ни, ни, Дэвид Блэйн! Ниии...');

	function quickiconButton($link,$image,$text,$current = false,$access = array('core.manage','com_config','core.admin','com_config'))
	{
		for ($i=0,$n=count($access);$i<$n;$i+=2)
		{
			if (!JFactory::getUser()->authorise($access[$i],$access[$i+1])) return false;
		}
		$current = (!$current) ?NULL :' class="current"';
		echo '<div class="icon-wrapper">
					<div class="icon">
						<a',$current,' href="',$link,'">
							',JHTML::_('image.site',$image,NULL,NULL,NULL,$text),'
							<span>',$text,'</span>
						</a>
					</div>
				</div>';
	}
	echo '<div id="cpanel">';
				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 '</div>';
?>

При этом предполагается, что в папке 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.

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

<?php
	global $mainframe;
	$mainframe->redirect('index.php');
?>

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

<?php
	$app->redirect('index.php');
?>

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

  • Отсутствие готовой руссифицированной joom.ru-шной сборки, и необходимость вручную руссифицировать Joomla 1.6.
  • Придёться заново править стили для нового шаблона админки bluestork.
  • Отсутствие версии установленной Joomla в футере сайта, в новом шаблоне bluestork, которую нужно выводить правя шаблон.
Посты этой рубрики посвящены инструментам и стратегиям интернет-маркетинга, призванным увеличить конверсию сайта. Статьи будут интересны и полезны нынешним и будущим владельцам онлайн-бизнеса.
Интересуют последние веяния в дизайне сайтов и айдентики? Хотите правильно сочетать цвета и шрифты? Тогда вам сюда.
В рубрике «Разбор заплывов» специалисты студии Webakula делятся не только своими опытом, наблюдениями, выводами, но и практическими советами.
Рубрика поможет разобраться с базовыми терминами интернет-маркетинга, веб-разработки и дизайна. Статьи пригодятся любознательным индивидуумам, которым не безразлична тема сайтостроения.
Мы рады познакомиться и поделиться информацией о насыщенных буднях и ярких выходных компании Webakula с нашими клиентами, читателями и случайными «прохожими». Заходите, располагайтесь, чувствуйте себя, как дома :)