0 Пользователей и 1 Гость просматривают эту тему.
  • 36 Ответов
  • 3316 Просмотров
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Доброго) Проблема заключается в следующем. Опишу на реальном примере.

Есть компонент All Video Share, там создана категория (например, Видеоролики), в нее добавлены видеоматериалы со своими названиями.
Данный компонент я привязываю к пункту меню (также называется Видеоролики), тип пункта меню - All Video Share/Category Layout/категория Видеоролики.

В хлебных крошках такая картина: Главная -> Видеоролики (пункт меню) -> Видеоролики (категория All Video Share) -> Название видеоматериала

Есть ли возможность убрать один из пунктов Видеоролики (желательно второй)? ^-^

*

Shustry

  • Moderator
  • 6434
  • 745 / 3
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Shustry, у меня в шаблоне уже есть файл, отвечающий за вывод "хлебокрошек" ^-^:

Код
?php
/**
 * @version $Id: default.php 20196 2011-01-09 02:40:25Z ian $
 * @package Joomla.Site
 * @subpackage mod_breadcrumbs
 * @copyright Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
 * @license GNU General Public License version 2 or later; see LICENSE.txt
 */

// no direct access
defined('_JEXEC') or die;

// Load template framework
if (!defined('JSN_PATH_TPLFRAMEWORK')) {
require_once JPATH_ROOT . '/plugins/system/jsntplframework/jsntplframework.defines.php';
require_once JPATH_ROOT . '/plugins/system/jsntplframework/libraries/joomlashine/loader.php';
}

$app = JFactory::getApplication();
$template = $app->getTemplate();
$jsnUtils   = JSNTplUtils::getInstance();
?>
<div id="jsn-pos-breadcrumbs" class="<?php echo $moduleclass_sfx; ?>">
<?php if ($jsnUtils->isJoomla3()): ?>
<?php JHtml::_('bootstrap.tooltip'); ?>
<ul class="breadcrumb <?php echo $moduleclass_sfx; ?>">
<?php if ($params->get('showHere', 1))
{
echo '<li class="active"><span class="divider"><i class="icon-location" class="hasTooltip" title="' .JText::_('MOD_BREADCRUMBS_HERE').'"></i></span></li>';
}
?>
<?php for ($i = 0; $i < $count; $i ++) :
// Workaround for duplicate Home when using multilanguage
if ($i == 1 && !empty($list[$i]->link) && !empty($list[$i - 1]->link) && $list[$i]->link == $list[$i - 1]->link)
{
continue;
}
// If not the last item in the breadcrumbs add the separator
echo '<li>';
if ($i < $count - 1)
{
if (!empty($list[$i]->link)) {
echo '<a href="'.$list[$i]->link.'" class="pathway">'.$list[$i]->name.'</a>';
} else {
echo '<span>';
echo $list[$i]->name;
echo '</span>';
}
if ($i < $count - 2)
{
echo '<span class="divider"></span>';
}
}  elseif ($params->get('showLast', 1)) { // when $i == $count -1 and 'showLast' is true
if($i > 0){
echo '<span class="divider"></span>';
}
echo '<span>';
echo $list[$i]->name;
echo '</span>';
}
echo '</li>';
endfor; ?>
</ul>
<?php else: ?>
<span class="breadcrumbs pathway clearafter">
<?php if ($params->get('showHere', 1))
{
echo '<span class="showHere">' .JText::_('MOD_BREADCRUMBS_HERE').'</span>';
}
?>
<?php for ($i = 0; $i < $count; $i ++) :
// If not the last item in the breadcrumbs add the separator
if ($i < $count-1) {
if(!empty($list[$i]->link)) {
echo '<a href="'.$list[$i]->link.'"'.($i==0?' class="first">':'>').$list[$i]->name.'</a>';
} else {
echo '<span>'.$list[$i]->name.'</span>';
}
}  else if ($params->get('showLast', 1)) { // when $i == $count -1 and 'showLast' is true
    echo '<span class="current">'.$list[$i]->name.'</span>';
}
endfor; ?>
</span>
<?php endif; ?>
</div>

Какие изменения необходимо внести в него, чтобы иметь возможность убирать категории?
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Shustry, подскажите, пожалуйста, куда в моем шаблоне вывода breadcrumbs необходимо прописать условие, позволяющее убирать категории... ^-^
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
После строк:
Код: php
// no direct access
defined('_JEXEC') or die;
Вставляем:
Код: php
$app = JFactory::getApplication('site');
$router = $app->getRouter();
foreach ($list as $item) {
$item->vars = $router->parse(JURI::getInstance($item->link));
}
После строки:
Код: php
<?php for ($i = 0; $i < $count; $i ++) :
Вставляем:
Код: php
if ($list[$i]->vars[view] !== 'category') {
На 64-й строке есть:
Код: php
endfor; ?>
Вставляем ПЕРЕД этим:
Код: php
}

Всё. В теории должно работать. На практике не могу проверить, т.к. у вас специфичный шаблон, с использованием фреймворка, бутстрапа и т.д.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Цитировать
Всё. В теории должно работать. На практике не могу проверить, т.к. у вас специфичный шаблон, с использованием фреймворка, бутстрапа и т.д.

Работает! Спасибо огромное!

Еще один момент: можете на примере написать, как запретить показ всех ссылок на определённый компонент?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Пожалуйста. Нужно дописать ещё одно условие:
Вместо…

Код: php
if ($list[$i]->vars[view] !== 'category') {

Нужно:

Код: php
if (($list[$i]->vars[view] != 'category') || ($list[$i]->vars[option] != 'com_search')) {

, где search — компонент поиска для примера. Корректно, кстати так !=, а не так !==. Это не совсем одно и то же.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Блин, здорово! Работает!

Но это оказалось не совсем то, что я себе представлял)

Shustry, подскажите, как правильно прописать "убирание" отдельной категории? Это как-то по Id делается?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Вставьте там где-нибудь перед первым циклом:

Код: php
var_dump ($list);

Получится много «страшного» кода, вот мне он нужен. Скопируйте сюда. Я не помню наизусть структуру массива.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Цитировать
Получится много «страшного» кода

Код
array(4) { [0]=> object(stdClass)#404 (2) { ["name"]=> string(14) "Главная" ["link"]=> string(1) "/" }
[1]=> object(stdClass)#401 (2) { ["name"]=> string(22) "Видеоролики" ["link"]=> string(17) "/videoroliki.html" }
[2]=> object(stdClass)#335 (2) { ["name"]=> string(40) "Песни Афганской войны" ["link"]=> string(39) "/videoroliki/pesni-afganskoj-vojny.html" }
[3]=> object(stdClass)#400 (2) { ["name"]=> string(40) "Песни Афганской войны" ["link"]=> string(77)
"/videoroliki/pesni-afganskoj-vojny/category/latest/pesni-afganskoj-vojny.html" } }
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Поправка. Сразу ПОСЛЕ этих строк:

Код: php
$app = JFactory::getApplication('site');
$router = $app->getRouter();
foreach ($list as $item) {
$item->vars = $router->parse(JURI::getInstance($item->link));
}

нужно вставить.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Код
array(5) { [0]=> object(stdClass)#324 (3) { ["name"]=> string(14) "Главная" ["link"]=> string(1) "/" ["vars"]=> array(5)
{ ["Itemid"]=> string(3) "435" ["option"]=> string(11) "com_content" ["view"]=> string(8) "featured" ["orderby"]=> string(6)
"latest" ["slg"]=> string(34) "valerij:petryaev-po-dorogam-krutym" } } [1]=> object(stdClass)#362 (3) { ["name"]=> string(22)
"Видеоролики" ["link"]=> string(17) "/videoroliki.html" ["vars"]=> array(6) { ["format"]=> string(4) "html" ["Itemid"]=> string(4)
"1289" ["option"]=> string(17) "com_allvideoshare" ["view"]=> string(5) "video" ["orderby"]=> string(6) "latest" ["slg"]=> string(1)
"0" } } [2]=> object(stdClass)#424 (3) { ["name"]=> string(40) "Песни Афганской войны" ["link"]=> string(39)
"/videoroliki/pesni-afganskoj-vojny.html" ["vars"]=> array(6) { ["format"]=> string(4) "html" ["Itemid"]=> string(4)
"1331" ["option"]=> string(17) "com_allvideoshare" ["view"]=> string(8) "category" ["orderby"]=> string(6) "latest" ["slg"]=> string(21)
"pesni-afganskoj-vojny" } } [3]=> object(stdClass)#363 (3) { ["name"]=> string(40) "Песни Афганской войны" ["link"]=> string(77)
"/videoroliki/pesni-afganskoj-vojny/category/latest/pesni-afganskoj-vojny.html" ["vars"]=> array(6) { ["format"]=> string(4)
"html" ["Itemid"]=> string(4) "1331" ["option"]=> string(17) "com_allvideoshare" ["view"]=> string(8) "category" ["orderby"]=> string(6)
"latest" ["slg"]=> string(21) "pesni:afganskoj-vojny" } } [4]=> object(stdClass)#359 (3) { ["name"]=> string(64)
"Валерий Петряев - По дорогам крутым" ["link"]=> string(87) "/videoroliki/pesni-afganskoj-vojny/video/latest/valerij-petryaev-po-dorogam-krutym.html" ["vars"]=> array(6)
{ ["format"]=> string(4) "html" ["Itemid"]=> string(4) "1331" ["option"]=> string(17) "com_allvideoshare" ["view"]=> string(5)
"video" ["orderby"]=> string(6) "latest" ["slg"]=> string(34) "valerij:petryaev-po-dorogam-krutym" } } }
*

Shustry

  • Moderator
  • 6434
  • 745 / 3


Здесь Itemid вероятно id категории. Точно ручаться не могу, т.к. с этим компонентом не работал, а он может тупо не юзать в формирование угла id категории. Смущает число 1331. Что, реально более 1300 категорий на сайте? В любом случае, запретить показ этой ссылки в том же условии так:

Код: php
if ($list[$i]->vars[Itemid] != '1331') {
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Цитировать
Смущает число 1331. Что, реально более 1300 категорий на сайте?

Нет, конечно не столько) Но условие срабатывает. Правда, результат такой же, как если бы я задавал "убирание" всего компонента.

Не получается оставить только одну категорию "Песни Афганской войны" (в конкретном примере). Наверное, что-то не так делаю.
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Ну в массиве vars есть всё для составления различных условий. Дальше думаю методом научного тыка справитесь.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Цитировать
Ну в массиве vars есть всё для составления различных условий.

Это точно. Но я в этом практически не разбираюсь.

В моем примере не понятно, почему ссылки [2],[3] и [4] имеют один Itemid (возможно, так и надо). Соответственно, при этом условии

Код
if ($list[$i]->vars[Itemid] != '1331') {

убираются все 3 ссылки. Какими параметрами они отличаются?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Параметр [slg] у всех разный.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Цитировать
Параметр [slg] у всех разный.

Здорово. Если задаю такое условие,

Код: php
if ($list[$i]->vars[slg] != 'pesni-afganskoj-vojny') {

то все отрабатывает так, как мне и надо!

А вот если для двух ссылок сразу,

Код: php
if (($list[$i]->vars[slg] != 'pesni-afganskoj-vojny') || ($list[$i]->vars[slg] != 'pesni-chechenskoj-vojny')) {

то ни для одной не срабатывает. В чем ошибка?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Хз даже. Визуально оба условия верны. Не знаю даже чем помочь. Попробуйте длину переменных померить, возможно тупо опечатка.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Код: php
if (($list[$i]->vars[slg] != 'pesni-vov')) {
if (($list[$i]->vars[slg] != 'pesni-afganskoj-vojny')) {
}
}

Работает вот такой код. Насколько его можно использовать?)
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Да можно использовать в принципе. Я то не программер, изящества кода не могу заценить. Грубых ошибок точно нет. А так не работает? :

Код: php
if (($list[$i]->vars[slg] != 'pesni-vov') or ($list[$i]->vars[slg] != 'pesni-afganskoj-vojny')) {
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Цитировать
А так не работает? :

Код

if (($list[$i]->vars[slg] != 'pesni-vov') or ($list[$i]->vars[slg] != 'pesni-afganskoj-vojny')) {

Неа, не работает! Но так всё равно огромное спасибо за оказанную помощь!
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Пожалуйста. Больше практикуйте и всё получится. Удачи вам.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Shustry, доброго времени суток! 1,5 года назад Вы мне с этим вопросом помогли, может и сейчас получится)

В общем, после обновления Joomla до версии 3.4.1 все вышеописанные изменения, которые я вносил, перестали работать.

Для наглядности выкладываю файл templates/jsn_neon_free/html/mod_breadcrumbs/default.php, который переопределял вывод хлебных крошек:

Код
<?php
/**
 * @version $Id: default.php 20196 2011-01-09 02:40:25Z ian $
 * @package Joomla.Site
 * @subpackage mod_breadcrumbs
 * @copyright Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
 * @license GNU General Public License version 2 or later; see LICENSE.txt
 */

// no direct access
defined('_JEXEC') or die;

$app = JFactory::getApplication('site');
$router = $app->getRouter();
foreach ($list as $item) {
$item->vars = $router->parse(JURI::getInstance($item->link));
}

// Load template framework
if (!defined('JSN_PATH_TPLFRAMEWORK')) {
require_once JPATH_ROOT . '/plugins/system/jsntplframework/jsntplframework.defines.php';
require_once JPATH_ROOT . '/plugins/system/jsntplframework/libraries/joomlashine/loader.php';
}

$app = JFactory::getApplication();
$template = $app->getTemplate();
$jsnUtils   = JSNTplUtils::getInstance();
?>
<div id="jsn-pos-breadcrumbs" class="<?php echo $moduleclass_sfx; ?>">
<?php if ($jsnUtils->isJoomla3()): ?>
<?php JHtml::_('bootstrap.tooltip'); ?>
<ul class="breadcrumb <?php echo $moduleclass_sfx; ?>">
<?php if ($params->get('showHere', 1))
{
echo '<li class="active"><span class="divider"><i class="icon-location" class="hasTooltip" title="' .JText::_('MOD_BREADCRUMBS_HERE').'">'.JText::_('MOD_BREADCRUMBS_HERE').'</i></span></li>';
}
?>
<?php for ($i = 0; $i < $count; $i ++) :
if (($list[$i]->vars[slg] != 'pesni-velikoj-otechestvennoj-vojny')) {
if (($list[$i]->vars[slg] != 'pesni-afganskoj-vojny')) {
if (($list[$i]->vars[slg] != 'pesni-chechenskoj-vojny')) {
if (($list[$i]->vars[slg] != 'pesni-pro-vdv')) {
if (($list[$i]->vars[slg] != 'pesni-pro-voenno-morskoj-flot')) {
if (($list[$i]->vars[slg] != 'pesni-pro-vv-i-spetsnaz')) {
if (($list[$i]->vars[slg] != 'pesni-pro-pogranichnye-vojska')) {
if (($list[$i]->vars[slg] != 'pesni-pro-morskuyu-pekhotu')) {
if (($list[$i]->vars[slg] != 'kursantskie-pesni')) {
if (($list[$i]->vars[slg] != 'dembelskie-pesni')) {
if (($list[$i]->vars[slg] != 'armejskie-pesni-pod-gitaru')) {


// Workaround for duplicate Home when using multilanguage
if ($i == 1 && !empty($list[$i]->link) && !empty($list[$i - 1]->link) && $list[$i]->link == $list[$i - 1]->link)
{
continue;
}
// If not the last item in the breadcrumbs add the separator
echo '<li>';
if ($i < $count - 1)
{
if (!empty($list[$i]->link)) {
echo '<a href="'.$list[$i]->link.'" class="pathway">'.$list[$i]->name.'</a>';
} else {
echo '<span>';
echo $list[$i]->name;
echo '</span>';
}
if ($i < $count - 2)
{
echo '<span class="divider"></span>';
}
}  elseif ($params->get('showLast', 1)) { // when $i == $count -1 and 'showLast' is true
if($i > 0){
echo '<span class="divider"></span>';
}
echo '<span>';
echo $list[$i]->name;
echo '</span>';
}
echo '</li>';
}
}
}
}
}
}
}
}
}
}
}
endfor; ?>
</ul>
<?php else: ?>
<span class="breadcrumbs pathway clearafter">
<?php if ($params->get('showHere', 1))
{
echo '<span class="showHere">' .JText::_('MOD_BREADCRUMBS_HERE').'</span>';
}
?>
<?php for ($i = 0; $i < $count; $i ++) :
// If not the last item in the breadcrumbs add the separator
if ($i < $count-1) {
if(!empty($list[$i]->link)) {
echo '<a href="'.$list[$i]->link.'"'.($i==0?' class="first">':'>').$list[$i]->name.'</a>';
} else {
echo '<span>'.$list[$i]->name.'</span>';
}
}  else if ($params->get('showLast', 1)) { // when $i == $count -1 and 'showLast' is true
    echo '<span class="current">'.$list[$i]->name.'</span>';
}
endfor; ?>
</span>
<?php endif; ?>
</div>


После обновления Joomla до версии 3.4.1 стандартный файл default.php выглядит так (заметно изменился, на мой взгляд):

Код
<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_breadcrumbs
 *
 * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('bootstrap.tooltip');

?>

<ul class="breadcrumb<?php echo $moduleclass_sfx; ?>">
<?php
if ($params->get('showHere', 1))
{
echo '<li class="active">' . JText::_('MOD_BREADCRUMBS_HERE'). '&#160;</li>';
}
else
{
echo '<li class="active"><span class="divider icon-location"></span></li>';
}

// Get rid of duplicated entries on trail including home page when using multilanguage
for ($i = 0; $i < $count; $i++)
{
if ($i == 1 && !empty($list[$i]->link) && !empty($list[$i - 1]->link) && $list[$i]->link == $list[$i - 1]->link)
{
unset($list[$i]);
}
}

// Find last and penultimate items in breadcrumbs list
end($list);
$last_item_key = key($list);
prev($list);
$penult_item_key = key($list);

// Make a link if not the last item in the breadcrumbs
$show_last = $params->get('showLast', 1);

// Generate the trail
foreach ($list as $key => $item) :
if ($key != $last_item_key)
{
// Render all but last item - along with separator
echo '<li>';
if (!empty($item->link))
{
echo '<a href="' . $item->link . '" class="pathway">' . $item->name . '</a>';
}
else
{
echo '<span>' . $item->name . '</span>';
}

if (($key != $penult_item_key) || $show_last)
{
echo '<span class="divider">' . $separator . '</span>';
}

echo '</li>';
}
elseif ($show_last)
{
// Render last item if reqd.
echo '<li class="active">';
echo '<span>' . $item->name . '</span>';
echo '</li>';
}
endforeach; ?>
</ul>

Как и куда мне здесь надо вставить условия "убирания" категорий, чтобы все работало, как и раньше  ^-^
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Здесь ненужные элементы убираются этим блоком:
Код: php
if ($i == 1 && !empty($list[$i]->link) && !empty($list[$i - 1]->link) && $list[$i]->link == $list[$i - 1]->link)
{
unset($list[$i]);
}
Сделовательно вам нужно точно так же, до или после этого условия, запилить своё:
Код: php
if (($list[$i]->vars[slg] != 'pesni-vov') or ($list[$i]->vars[slg] != 'pesni-afganskoj-vojny')) {
unset($list[$i]);
}
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Shustry, если я правильно понял, то вот так?

Код
// Get rid of duplicated entries on trail including home page when using multilanguage
for ($i = 0; $i < $count; $i++)
{
if ($i == 1 && !empty($list[$i]->link) && !empty($list[$i - 1]->link) && $list[$i]->link == $list[$i - 1]->link)
{
unset($list[$i]);
}
if (($list[$i]->vars[slg] != 'pesni-afganskoj-vojny'))
{
unset($list[$i]);
}
}

Не работает, вообще хлебные крошки пропали, осталась надпись Вы здесь:...
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Вместо

Код: php
		if (($list[$i]->vars[slg] != 'pesni-afganskoj-vojny')) 
{
unset($list[$i]);
}

надо

Код: php
		if (($list[$i]->vars[slg] == 'pesni-afganskoj-vojny')) 
{
unset($list[$i]);
}

Мы же теперь наоборот, убираем лишние элементы, а не выводим остальные.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Такой вариант хлебные крошки сохраняет, но ненужную категорию не убирает. Как-то можно еще попробовать запилить это условие?

И как в нынешнем варианте модуля использовать var_dump ($list), чтобы посмотреть структуру массива?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
var_dump ($list) используете так же точно. Посмотрите, там должны быть id категорий. Тогда их можно использовать в условии.
*

Андрей Нестеров

  • Захожу иногда
  • 207
  • 6 / 0
Shustry, пробовал вставлять в разные места, но "страшного кода" не выдает...куда правильно его вставить?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как на списке тегов отобразить другие теги материалов?

Автор Karyuudo

Ответов: 3
Просмотров: 1023
Последний ответ 29.12.2016, 11:33:07
от maxis
Поле перекрывает другие элементы

Автор Solc

Ответов: 1
Просмотров: 847
Последний ответ 01.12.2016, 11:18:05
от darkghost
Микроразметка breadcrumbs для Joomla 3

Автор Bozhkov2

Ответов: 8
Просмотров: 7650
Последний ответ 08.09.2014, 20:12:07
от Bozhkov2