Похожие статьи

[Hack] Сортировка материалов по их рейтингу в Joomla 2.5

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

Проблема Opera с Joomla и файла mootools-more.js

После последних обновлений Opera 12 возникли проблемы с работой сайтов на движке Joomla, а если быть более точным, то перестала работать библиотека mootools и все что с ней связано соответственно. Проблема связана с сжатием файла mootools-more.js из-за содержания в нем локальных символов. Соответственно...

RokBox масштабирование изображений под размер экрана Joomla 1.5 и выше

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

Последние обновления

Монтируем EXT2, EXT3, EXT4 в Mac OS

Mac OS самостоятельно работать с файловой системой Linux, таких как EXT2, EXT3, EXT4, не может. Для решения этой проблемы есть платное решение extFS от Paragon, но есть и бесплатный вариант для тех кто не боится командной строки. Для этого нам понадобиться приложение fuse-ext2.

Установка Windows 11 без интернета или без учетной записи Microsoft

Windows 11 при первичном запуске требует подключения интернета и учётной записи Microsoft, но на практике бывают ситуации когда нет интернета или нет желания использовать учетную запись Microsoft. Например, в моём случае при подключении WiFi выдавало сообщение "oops you've lost internet connection".

Автоматизация получения бесплатных SSL сертификатов на хостинге RUCENTER

Можно долго ругаться на RUCENTER за нежелание дать клиентам виртуального хостинга бесплатные SSL сертификаты, но воз и ныне  там. В связи с этим пользователям остается либо уходить на другой хостинг, либо оставаться без HTTPS протокола и наблюдать неприятные пометки о небезопасности...

[Hack] Один материал в нескольких категориях для Joomla 2.5 (мультикатегории)

Обратились ко мне в очередной раз помощью на тему мультикатегорий для Joomla 2.5, также как и в случае с мультикатегориями для Joomla 1.5, только заказчик залег на дно, но наброски у меня уже были сделаны. Поэтому чтобы не пропадать труду даром, решил поделиться наработкой с людьми, тем более что до сих пор никто этого так и не сделал почему то... Данная реализация не имеет никаких проблем с SEO или SEF. Как обычно описываю пример на 3 категории, если нужно больше/меньше делаем по аналогии.

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

Хак требует изменения как базы данных так и нескольких файлов самой Joomla, так что перед тем как редактировать файлы, сделайте их копии.

Шаг 1 - Выполнить скрипт для БД, где # - префикс таблиц в вашей БД. Лучше всего это делать через phpMyAdmin.

ALTER TABLE `#_content` ADD `catid2` INT ( 11 ) NOT NULL DEFAULT '0' AFTER `catid` ;
ALTER TABLE `#_content` ADD `catid3` INT ( 11 ) NOT NULL DEFAULT '0' AFTER `catid2` ;
ALTER TABLE `#_content` ADD INDEX ( `catid2` );
ALTER TABLE `#_content` ADD INDEX ( `catid3` );

Шаг 2 - Добавляем в админке возможность при создании/редактировании материала указывать несколько категорий
Редактируем файл administrator\components\com_content\views\article\tmpl\edit.php
Ищем

<?php echo $this->form->getInput('catid'); ?>

Добавляем после

<?php echo $this->form->getInput('catid2'); ?><?php echo $this->form->getInput('catid3'); ?>

Редактируем файл administrator\components\com_content\models\forms\article.xml
Ищем

		<field name="catid" type="categoryedit"
label="JCATEGORY" description="JFIELD_CATEGORY_DESC"
class="inputbox" required="true"
>
</field>

Добавляем после

		<field name="catid2" type="categoryedit"
label="JCATEGORY" description="JFIELD_CATEGORY_DESC"
class="inputbox" required="false" default="0"
><option value="0">
Select Category</option>
</field>
<field name="catid3" type="categoryedit"
label="JCATEGORY" description="JFIELD_CATEGORY_DESC"
class="inputbox" required="false" default="0"
><option value="0">
Select Category</option>
</field>

Шаг 3 - делаем возможность в админке для материалов привязанных к нескольким категориям в столбце Категория показывать все категории, к которым привязан материал
Редактируем файл administrator\components\com_content\views\articles\tmpl\default.php
Ищем

					<?php echo $this->escape($item->category_title); ?>

и заменяем на      

					<?php echo $this->escape($item->category_title);
if ($item->category_title2) echo '<hr />'.$this->escape($item->category_title2);
if ($item->category_title3) echo '<hr />'.$this->escape($item->category_title3);
?>

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

Редактируем файл administrator\components\com_content\models\articles.php
Ищем

		// Join over the categories.
$query->select('c.title AS category_title');
$query->join('LEFT', '#__categories AS c ON c.id = a.catid');

и добавляем после :         

		// Join over the categories to get other category titles
$query->select('sister2.title AS category_title2');
$query->join('LEFT', '#__categories AS sister2 ON sister2.id = a.catid2');
$query->select('sister3.title AS category_title3');
$query->join('LEFT', '#__categories AS sister3 ON sister3.id = a.catid3');

Ищем

			$query->where('c.lft >= '.(int) $lft);
$query->where('c.rgt <= '.(int) $rgt);

и заменяем на

			$query->where('(c.lft >= '.(int) $lft.' AND c.rgt <= '.(int) $rgt.') OR (sister2.lft >= '.(int) $lft.' AND sister2.rgt <= '.(int) $rgt.') OR (sister3.lft >= '.(int) $lft.' AND sister3.rgt <= '.(int) $rgt.')');

Шаг 4 - Учим Joomla показывать при просмотре материала все категории, за которыми закреплен данный материал.
Редактируем файл components\com_content\models\article.php
Ищем

				$query->select($this->getState(
'item.select', 'a.id, a.asset_id, a.title, a.alias, a.title_alias, a.introtext, a.fulltext, ' .
// If badcats is not null, this means that the article is inside an unpublished category
// In this case, the state is set to 0 to indicate Unpublished (even if the article state is Published)
'CASE WHEN badcats.id is null THEN a.state ELSE 0 END AS state, ' .
'a.mask, a.catid, a.created, a.created_by, a.created_by_alias, ' .
// use created if modified is 0

Заменяем на

				$query->select($this->getState(
'item.select', 'a.id, a.asset_id, a.title, a.alias, a.title_alias, a.introtext, a.fulltext, ' .
// If badcats is not null, this means that the article is inside an unpublished category
// In this case, the state is set to 0 to indicate Unpublished (even if the article state is Published)
'CASE WHEN badcats.id is null THEN a.state ELSE 0 END AS state, ' .
'a.mask, a.catid, a.catid2, a.catid3, a.created, a.created_by, a.created_by_alias, ' .
// use created if modified is 0

Ищем

				// Join on category table.
$query->select('c.title AS category_title, c.alias AS category_alias, c.access AS category_access');
$query->join('LEFT', '#__categories AS c on c.id = a.catid');

Добавляем после

				// Join over the categories to get other category titles
$query->select('sister2.title as category_title2');
$query->join('LEFT', '#__categories as sister2 ON sister2.id = a.catid2');
$query->select('sister3.title as category_title3');
$query->join('LEFT', '#__categories as sister3 ON sister3.id = a.catid3');

Редактируем файл components\com_content\views\article\tmpl\default.php
Ищем

	$url = '<a href="'.JRoute::_(ContentHelperRoute::getCategoryRoute($this->item->catslug)).'">'.$title.'</a>';?>
<?php if ($params->get('link_category') and $this->item->catslug) : ?>
<?php echo JText::sprintf('COM_CONTENT_CATEGORY', $url); ?>
<?php else : ?>
<?php echo JText::sprintf('COM_CONTENT_CATEGORY', $title); ?>

Заменяем на

				$title2 = $this->escape($this->item->category_title2);
$title3 = $this->escape($this->item->category_title3);
$url = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($this->item->catid)) . '">' . $title . '</a>';
$url2 = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($this->item->catid2)) . '">' . $title2 . '</a>';
$url3 = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($this->item->catid3)) . '">' . $title3 . '</a>';
?>
<?php if ($params->get('link_category')) : ?>
<?php echo JText::sprintf('COM_CONTENT_CATEGORY', $url);
if ($this->item->category_title2) echo ', '.$url2;
if ($this->item->category_title3) echo ', '.$url3;
?>
<?php else : ?>
<?php echo JText::sprintf('COM_CONTENT_CATEGORY', $title);
if ($this->item->category_title2) echo ', '.$title2;
if ($this->item->category_title3) echo ', '.$title3;

?>

Примечание: эту же операцию с файлом  default.php необходимо проделать и с используемыми вами шаблонами, если в них есть этот файл. Например его содержит шаблон beez5\html\com_content\article\default.php

Шаг 5 - Учим Joomla показывать при просмотре категории все категории, за которыми закреплены материалы.
Редактируем файл components\com_content\models\articles.php
найти

		// Select the required fields from the table.
$query->select(
$this->getState(
'list.select',
'a.id, a.title, a.alias, a.title_alias, a.introtext, ' .
'a.checked_out, a.checked_out_time, ' .
'a.catid, a.created, a.created_by, a.created_by_alias, ' .

Заменяем на

		// Select the required fields from the table.
$query->select(
$this->getState(
'list.select',
'a.id, a.title, a.alias, a.title_alias, a.introtext, ' .
'a.checked_out, a.checked_out_time, ' .
'a.catid, a.catid2, a.catid3, a.created, a.created_by, a.created_by_alias, ' .

ищем

		// Join over the categories to get parent category titles
$query->select('parent.title as parent_title, parent.id as parent_id, parent.path as parent_route, parent.alias as parent_alias');
$query->join('LEFT', '#__categories as parent ON parent.id = c.parent_id');

Добавляем после

		// Join over the categories to get other category titles
$query->select('sister2.title as category_title2');
$query->join('LEFT', '#__categories as sister2 ON sister2.id = a.catid2');
$query->select('sister3.title as category_title3');
$query->join('LEFT', '#__categories as sister3 ON sister3.id = a.catid3');

ищем

			$categoryEquals = 'a.catid '.$type.(int) $categoryId;

Заменяем на

			$categoryEquals = 'a.catid '.$type.(int) $categoryId.' OR a.catid2 '.$type.(int) $categoryId.' OR a.catid3 '.$type.(int) $categoryId;

Следующзее изменение добавлено 20.03.2015

ищем

$query->where('a.catid '.$type.' ('.$categoryId.')');

заменяем на

$query->where('a.catid '.$type.' ('.$categoryId.') OR a.catid2 '.$type.' ('.$categoryId.') OR a.catid3 '.$type.' ('.$categoryId.')');
Редактируем файл components\com_content\views\category\tmpl\blog_item.php
найти
					$url = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($this->item->catid)) . '">' . $title . '</a>'; ?>
<?php if ($params->get('link_category')) : ?>
<?php echo JText::sprintf('COM_CONTENT_CATEGORY', $url); ?>
<?php else : ?>
<?php echo JText::sprintf('COM_CONTENT_CATEGORY', $title); ?>

Заменить на

				$title2 = $this->escape($this->item->category_title2);
$title3 = $this->escape($this->item->category_title3);
$url = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($this->item->catid)) . '">' . $title . '</a>';
$url2 = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($this->item->catid2)) . '">' . $title2 . '</a>';
$url3 = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($this->item->catid3)) . '">' . $title3 . '</a>';
?>
<?php if ($params->get('link_category')) : ?>
<?php echo JText::sprintf('COM_CONTENT_CATEGORY', $url);
if ($this->item->category_title2) echo JText::sprintf('COM_CONTENT_CATEGORY', $url2);
if ($this->item->category_title3) echo JText::sprintf('COM_CONTENT_CATEGORY', $url3);
?>
<?php else : ?>
<?php echo JText::sprintf('COM_CONTENT_CATEGORY', $title);
if ($this->item->category_title2) echo JText::sprintf('COM_CONTENT_CATEGORY', $title2);
if ($this->item->category_title3) echo JText::sprintf('COM_CONTENT_CATEGORY', $title3);

?>

Примечание: эту же операцию с файлами blog_item.php необходимо проделать и с используемыми вами шаблонами, если в них есть этот файл. Например его содержит шаблон beez5\html\com_content\category\blog_item.php

Шаг 6 - добавляем возможность указания нескольких категорий в fronted редакторе (если нужно)
Редактируем файл components\com_content\models\forms\article.xml
Ищем

		<field
id="catid"
name="catid"
type="categoryedit"
extension="com_content"
label="JCATEGORY"
description="JFIELD_CATEGORY_DESC"
class="inputbox"
required="true">
</field>

Добавляем после 

		<field
id="catid2"
name="catid2"
type="categoryedit"
extension="com_content"
label="JCATEGORY"
description="JFIELD_CATEGORY_DESC"
class="inputbox"
default="0"
required="false">
<option value="0">Select Category</option>
</field>
<field
id="catid3"
name="catid3"
type="categoryedit"
extension="com_content"
label="JCATEGORY"
description="JFIELD_CATEGORY_DESC"
class="inputbox"
default="0"
required="false">
<option value="0">Select Category</option>
</field>

Редактируем файл components\com_content\views\form\tmpl\edit.php
найти

			<?php   echo $this->form->getInput('catid'); ?>

заменить на

			<?php   echo $this->form->getInput('catid'); ?><?php   echo $this->form->getInput('catid2'); ?><?php   echo $this->form->getInput('catid3'); ?>
Всё, теперь можно работать.