ZOO - удалить из ссылки item и category, SEF URL

Роутер для компонента ZOO.

Попробуем обойтись без хаков и специальных расширений.

Данные способы ни коем образом не претендуют на правильность, делалось всё по аналогии из разных источников и МЕТОДОМ ТЫКА. Так что у кого-то, вероятно, может не заработать, почему - я не знаю! У меня работает!!! )))

Joomla 3.4, Zoo 3.3

Переопределить весь стандартный роутер.

Для переопределения роутера используем плагин routersoverrider.

Закидываем копию роутера в свой шаблон из component/com_zoo по инструкции с форума, и там извращаемся, при обновлениях роутер не затрется.

Если посмотреть на код, видно что роутер, по сути состоит из двух методов ZooBuildRoute() и ZooParseRoute() В первом создается строка запроса, во втором происходит ее разбор.

Для item-ов

Нам нужно избавиться от параметров item и category в ссылке, для этого в методе ZooBuildRoute() находим место где формируется ссылка на материал, она (ссылка) состоит из «сегментов»:

$task = 'item';

	if (@$query['task'] == $task || @$query['view'] == $task) {
		if (@$query['task'] == $task && @$query['item_id']) {
			$segments[] = $task;
			$segments[] = $app->alias->item->translateIDToAlias((int) $query['item_id']);
		}
		unset($query['task'], $query['view'], $query['layout'], $query['item_id']);
	}

И меняем как-то вот так:

 $task = 'item';

	if (@$query['task'] == $task || @$query['view'] == $task) {
		if (@$query['task'] == $task && @$query['item_id']) {
			//$segments[] = $task; // Закомментируем первый сегмент - там где item
			$segments[] = $app->alias->item->translateIDToAlias((int) $query['item_id']);
		}
		unset($query['task'], $query['view'], $query['layout'], $query['item_id'], $query['category_id']); // Удалили ещё и category_id в конце ссылки
	}

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

Теперь в методе ZooParseRoute() Находим вот такой кусок:

$task = 'item';

	if ($count == 2 && $segments[0] == $task) {
		$vars['task']    = $task;
		$vars['item_id'] = (int) $app->alias->item->translateAliasToID($segments[1]);
	}

И меняем вот на такой:

// item
$task = 'item';

	if ($count == 1 && (int) $app->alias->item->translateAliasToID($segments[0]) )  {
		// Первый сегмент мы удалили раньше, по этому перемещаемся на один вверх, вторую проверку я скопировал откуда-то по аналогии, работает и без неё, но на всякий случай поставил...
		$vars['task']    = $task;
		$vars['item_id'] = (int) $app->alias->item->translateAliasToID($segments[0]); // так же перемещаемся на сегмент выше.
	}

 Всё. Теперь категории.

Удалить category из ссылки категорий Zoo.

В общем - точно так же. В методе ZooBuildRoute() находим место где формируется ссылка на категорию: 

$task = 'category';

	if (@$query['task'] == $task || @$query['view'] == $task) {
		if (@$query['task'] == $task) {
			$segments[] = $task;
		}
		if (@$query['category_id']) {
			$segments[] = $app->alias->category->translateIDToAlias((int) $query['category_id']);
		}
		unset($query['task'], $query['view'], $query['layout'], $query['category_id']);

		// pagination
		if (isset($query['page'])) {
			$segments[] = $query['page'];
			unset($query['page']);
		}
	}

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

if (@$query['task'] == $task) {
	//$segments[] = $task;
}

Далее в методе ZooParseRoute() считываем без него как у материала, находим:

$task = 'category';

	if ($count == 2 && $segments[0] == $task) {
		$vars['task']        = $task;
		$vars['category_id'] = (int) $app->alias->category->translateAliasToID($segments[1]);
	}

	if ($count == 3 && $segments[0] == $task) {
		$vars['task']        = $task;
		$vars['category_id'] = (int) $app->alias->category->translateAliasToID($segments[1]);
		$vars['page']        = (int) $segments[2];
	}

И меняем на:

$task = 'category';

		if ($count == 1 && (int) $app->alias->category->translateAliasToID($segments[0])) {
			$vars['task']        = $task;
			$vars['category_id'] = (int) $app->alias->category->translateAliasToID($segments[0]);
		}

		if ($count == 2 && (int) $app->alias->category->translateAliasToID($segments[0])) {
			$vars['task']        = $task;
			$vars['category_id'] = (int) $app->alias->category->translateAliasToID($segments[0]);
			$vars['page']        = (int) $segments[1];
		}

 

Для примера использовался вот такой роутер скачанный с JoomlaForum:

 

<?php
/**
* @package   com_zoo
* @author    YOOtheme http://www.yootheme.com
* @copyright Copyright (C) YOOtheme GmbH
* @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
*/
 
// load config
require_once(JPATH_ADMINISTRATOR.'/components/com_zoo/config.php');
 
function ZooBuildRoute(&$query) {
 
	$app = App::getInstance('zoo');
 
	// init vars
	$segments = array();
 
	// frontpage
	$task = 'frontpage';
 
		if (@$query['task'] == $task || @$query['view'] == $task) {
			if (@$query['task'] == $task) {
				$segments[] = $task;
			}
			unset($query['task']);
			unset($query['view']);
			unset($query['layout']);
 
			// pagination
			if (isset($query['page'])) {
				$segments[] = $query['page'];
				unset($query['page']);
			}
		}
 
	// category
	$task = 'category';
 
		if (@$query['task'] == $task || @$query['view'] == $task) {
			if (@$query['task'] == $task) {
				$segments[] = $task;
			}
			if (@$query['category_id']) {
				$segments[] = $app->alias->category->translateIDToAlias((int) $query['category_id']);
			}
			unset($query['task']);
			unset($query['view']);
			unset($query['layout']);
			unset($query['category_id']);
 
			// pagination
			if (isset($query['page'])) {
				$segments[] = $query['page'];
				unset($query['page']);
			}
		}
 
	// alpha index
	$task = 'alphaindex';
 
		if ((@$query['task'] == $task || @$query['view'] == $task) && isset($query['alpha_char']) && isset($query['app_id'])) {
			$segments[] = $task;
			$segments[] = $app->alias->application->translateIDToAlias((int) $query['app_id']);
			$segments[] = $query['alpha_char'];
			unset($query['task']);
			unset($query['view']);
			unset($query['alpha_char']);
			unset($query['app_id']);
 
			// pagination
			if (isset($query['page'])) {
				$segments[] = $query['page'];
				unset($query['page']);
			}
		}
 
	// tag
	$task = 'tag';
 
		if ((@$query['task'] == $task || @$query['view'] == $task) && isset($query['tag']) && isset($query['app_id'])) {
			$segments[] = $task;
			$segments[] = $app->alias->application->translateIDToAlias((int) $query['app_id']);
			$segments[] = $query['tag'];
			unset($query['task']);
			unset($query['view']);
			unset($query['tag']);
			unset($query['app_id']);
 
			// pagination
			if (isset($query['page'])) {
				$segments[] = $query['page'];
				unset($query['page']);
			}
		}
 
	// item
	$task = 'item';
 
		if (@$query['task'] == $task || @$query['view'] == $task) {
			if (@$query['task'] == $task && @$query['item_id']) {
				$segments[] = $app->alias->item->translateIDToAlias((int) $query['item_id']);
			}
			unset($query['task']);
			unset($query['view']);
			unset($query['layout']);
			unset($query['item_id']);
			unset($query['category_id']);
		}
 
	// feed
	$task = 'feed';
 
		if ((@$query['task'] == $task || @$query['view'] == $task) && isset($query['type']) && isset($query['app_id']) && isset($query['category_id'])) {
			$segments[] = $task;
			$segments[] = $query['type'];
			$segments[] = $app->alias->application->translateIDToAlias((int) $query['app_id']);
			if ($query['category_id']) {
				$segments[] = $app->alias->category->translateIDToAlias((int) $query['category_id']);
			}
			unset($query['task']);
			unset($query['view']);
			unset($query['type']);
			unset($query['app_id']);
			unset($query['category_id']);
		}
 
	// submission
	$task = 'submission';
 
		if (((@$query['task'] == $task || @$query['view'] == $task) && @$query['layout'] == 'submission')) {
			$segments[] = $task;
			$segments[] = @$query['layout'];
			$segments[] = $app->alias->submission->translateIDToAlias((int) $query['submission_id']);
			$segments[] = $query['type_id'];
			$segments[] = $query['submission_hash'];
			$segments[] = $app->alias->item->translateIDToAlias((int) @$query['item_id']);
			unset($query['task']);
			unset($query['view']);
			unset($query['layout']);
			unset($query['submission_id']);
            unset($query['type_id']);
            unset($query['submission_hash']);
            unset($query['item_id']);
		}
 
	// submission mysubmissions
	$task = 'submission';
 
		if (((@$query['task'] == $task || @$query['view'] == $task) && @$query['layout'] == 'mysubmissions')) {
			$segments[] = $task;
			$segments[] = @$query['layout'];
			$segments[] = $app->alias->submission->translateIDToAlias((int) $query['submission_id']);
			unset($query['task']);
			unset($query['view']);
			unset($query['layout']);
			unset($query['submission_id']);
		}
 
	return $segments;
}
 
function ZooParseRoute($segments) {
 
	$app = App::getInstance('zoo');
 
	// init vars
	$vars  = array();
	$count = count($segments);
 
	// fix segments (see JRouter::_decodeSegments)
	foreach (array_keys($segments) as $key) {
		$segments[$key] = str_replace(':', '-', $segments[$key]);
	}
 
	// frontpage (with optional pagination)
	$task = 'frontpage';
 
		if ($count == 1 && $segments[0] == $task) {
			$vars['task'] = $task;
		}
 
		if ($count == 2 && $segments[0] == $task) {
			$vars['task'] = $task;
			$vars['page'] = (int) $segments[1];
		}
 
	// category (with optional pagination)
	$task = 'category';
 
		if ($count == 2 && $segments[0] == $task) {
			$vars['task']        = $task;
			$vars['category_id'] = (int) $app->alias->category->translateAliasToID($segments[1]);
		}
 
		if ($count == 3 && $segments[0] == $task) {
			$vars['task']        = $task;
			$vars['category_id'] = (int) $app->alias->category->translateAliasToID($segments[1]);
			$vars['page']        = (int) $segments[2];
		}
 
	// alpha index (with optional pagination)
	$task = 'alphaindex';
 
		if ($count == 3 && $segments[0] == $task) {
			$vars['task']       = $task;
			$vars['app_id']		= (int) $app->alias->application->translateAliasToID($segments[1]);
			$vars['alpha_char'] = (string) $segments[2];
		}
 
		if ($count == 4 && $segments[0] == $task) {
			$vars['task']       = $task;
			$vars['app_id']		= (int) $app->alias->application->translateAliasToID($segments[1]);
			$vars['alpha_char'] = (string) $segments[2];
			$vars['page']       = (int) $segments[3];
		}
 
	// tag (with optional pagination)
	$task = 'tag';
 
		if ($count == 3 && $segments[0] == $task) {
			$vars['task']   = $task;
			$vars['app_id']	= (int) $app->alias->application->translateAliasToID($segments[1]);
			$vars['tag']    = (string) $segments[2];
		}
 
		if ($count == 4 && $segments[0] == $task) {
			$vars['task']   = $task;
			$vars['app_id']	= (int) $app->alias->application->translateAliasToID($segments[1]);
			$vars['tag']    = (string) $segments[2];
			$vars['page']   = (int) $segments[3];
		}
 
	// item
	$task = 'item';
 
		if ($count == 1 && (int) $app->alias->item->translateAliasToID($segments[0]))
		{
			$vars['task']    = $task;
			$vars['item_id'] = (int) $app->alias->item->translateAliasToID($segments[0]);
		}
 
	// feed
	$task = 'feed';
 
		if ($count == 3 && $segments[0] == $task) {
			$vars['task'] = $task;
			$vars['type'] = (string) $segments[1];
			$vars['app_id'] = (int) $app->alias->application->translateAliasToID($segments[2]);
		}
 
		if ($count == 4 && $segments[0] == $task) {
			$vars['task']        = $task;
			$vars['type']        = (string) $segments[1];
			$vars['app_id']		 = (int) $app->alias->application->translateAliasToID($segments[2]);
			$vars['category_id'] = (int) $app->alias->category->translateAliasToID($segments[3]);
		}
 
	// submission
	$task = 'submission';
    $layout = 'submission';
 
		if ($count == 2 && $segments[0] == $task && $segments[1] == $layout) {
			$vars['task']   = $task;
			$vars['layout'] = (string) $segments[1];
		}
 
		if ($count == 5 && $segments[0] == $task && $segments[1] == $layout) {
			$vars['task']            = $task;
			$vars['layout']          = (string) $segments[1];
			$vars['submission_id']   = (int) $app->alias->submission->translateAliasToID($segments[2]);
            $vars['type_id']         = (string) $segments[3];
            $vars['submission_hash'] = (string) $segments[4];
		}
 
		if ($count == 6 && $segments[0] == $task && $segments[1] == $layout) {
			$vars['task']            = $task;
			$vars['layout']          = (string) $segments[1];
			$vars['submission_id']   = (int) $app->alias->submission->translateAliasToID($segments[2]);
            $vars['type_id']         = (string) $segments[3];
            $vars['submission_hash'] = (string) $segments[4];
            $vars['item_id']         = (int) $app->alias->item->translateAliasToID($segments[5]);
		}
 
	// submission mysubmissions
	$task = 'submission';
    $layout = 'mysubmissions';
 
		if ($count == 2 && $segments[0] == $task && $segments[1] == $layout) {
			$vars['task']   = $task;
			$vars['layout'] = (string) $segments[1];
		}
 
		if ($count == 3 && $segments[0] == $task && $segments[1] == $layout) {
			$vars['task']          = $task;
			$vars['layout']        = (string) $segments[1];
			$vars['submission_id'] = (int) $app->alias->submission->translateAliasToID($segments[2]);
		}
 
	// try to retrieve vars from menu item
	if (empty($vars)) {
		if ($menu_item = $app->object->create('JSite')->getMenu()->getActive()) {
			$vars['task'] = @$menu_item->query['view'];
 
			switch ($vars['task']) {
				case 'frontpage':
					if ($count == 1) {
						$vars['page'] = (int) $segments[0];
					}
 
					break;
				case 'category':
					if ($count == 1) {
						$vars['page'] = (int) $segments[0];
						$vars['category_id'] = @$menu_item->query['category_id'];
					}
					break;
			}
		}
	}
 
	return $vars;
}

 

Для JBZoo (потом вошёл в платную сборку)

Ещё есть вот такой вариант для бесплатной версии JBZoo c joomla-support.ru, который роутера вообще не касается, а переопределятся всё в своём фреймворке: Переделать урлы (убрать категории и т.д.)

Ссылки и благодарности

Пример смотрел на JoomlaForum, вот Топик по теме

Позже на JBZoo форуме

Так же существуют специальные компоненты для SEF Zoo: