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

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

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

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

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

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

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

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

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

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

Исправление JA Comment для совеместимости с PHP 8 и Joomla 4

Обновление на PHP 8 ( поддержка PHP7 уже завершена) и Joomla 4 (та же причина) приперли к стене многих, но многие сталкиваются с проблемой несовместимости старых расширений для Joomla с новой версией, а многие и вовсе уже не поддерживаются и не обновляются. К таким и относится JA Comment - расширение...

Конвертируем загрузочный диск Windows из Legacy в UEFI

В режиме UEFI загрузка с дисков возможна только если они отформатированы в режиме GPT, в Legacy режиме же наоборот - возможна загрузка только с MBR разделов, поэтому для перехода со старого загрузчика на новый необходима конвертация загрузочного диска.

[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'); ?>
Всё, теперь можно работать.