Вопрос по активной ссылке в меню

8 года 7 мес. назад #6932 от Андрей Нестеров
Доброго времени суток! Такая ситуация с активными ссылками в меню - сайт armymusic.ru ;
на главной странице ссылки в меню выглядят следующим образом:



Т.е. пункт меню "Главная" находится в активном состоянии - подсвечен.

К примеру, перейдем в раздел "Биографии". Меню становится таким:



Т.е. в активное состояние переходит пункт меню "Биографии".

Дальше, к примеру, в данном разделе перейдем в какой-нибудь материал.
В результате, казалось бы, в активном состоянии должен был остаться
пункт меню "Биографии", НО у меня это не так - активным вновь становится
пункт меню "Главная".

Посмотрел на других сайтах - такого нигде не наблюдается.

В чем может быть проблема?

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 7 мес. назад #6934 от Wedal
Андрей, дело в том, что ваш пункт меню "Биографии" должен иметь тип "блог категории". Активный пункт меню привязан по параметру ItemID в URL. ID этого пункта меню должно добавляться ко всем страницам категории. Это возможно только так, как я описал выше.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 7 мес. назад #6935 от Андрей Нестеров
Виталий, добрый день!

Пункт меню "Биографии" и так имеет тип "Блок категории".

Отключил ЧПУ, посмотрел на ссылки:

- обычной ссылке armymusic.ru/biografii.html соответствует armymusic.ru/index.php?option=com_content&view=category&layout=blog&id=121&Itemid=1389

- обычной ссылке armymusic.ru/biografii/136-petryaev-valerij.html соответствует armymusic.ru/index.php?option=com_content&view=article&id=136:petryaev-valerij&catid=121&Itemid=1389

Я, конечно, не спец, но вроде как ID пункта меню добавляется ко всем страницам категории.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 7 мес. назад #6938 от Wedal
Андрей, значит здесь все настроено правильно. Тогда остается вариант, что разработчики шаблона переделали код вывода меню. Нужно в шаблоне открыть файл, отвечающий за вывод меню и посмотреть, как же реально добавляется класс активного пункта. Так вот, не видя кода, не сказать. Но очевидно, что это баг или особенность шаблона.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 7 мес. назад #6942 от Андрей Нестеров
Выкладываю код модуля меню, который изначально переопределен (при установке шаблона) в папке HTML шаблона:
<?php
/**
 * @version		$Id: default.php 20196 2011-01-09 02:40:25Z ian $
 * @package		Joomla.Site
 * @subpackage	mod_menu
 * @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();
$jsn_utils   = JSNTplUtils::getInstance();
 
// Note. It is important to remove spaces between elements.
?>
 
<ul class="<?php echo $class_sfx;?>"<?php
	$tag = '';
	if ($params->get('tag_id')!=NULL) {
		$tag = $params->get('tag_id').'';
		echo ' id="'.$tag.'"';
	}
?>>
<?php 
$count 			= 1;
$menuCount 		= count($list);
$varLastItem 	= 0;
$flag 			= false;
$flag_last 		= false;
 
foreach ($list as $i => &$item) :
	$class = '';
	if ($item->id == $active_id) {
		$class .= 'current ';
	}
 
	if (in_array($item->id, $path)) {
		$class .= 'active ';
	}
 
	if ($item->deeper) {
		$class .= 'parent ';
	}
 
	if( ($count == 1) || ($flag == true) ) {
		$class .= 'first ';		
	}
 
	if($count == $menuCount || $item->shallower || $jsn_utils->isLastMenu($item)) {
		$class .= 'last ';	
	}
 
	// Icon menu	
	if ($item->anchor_css) {
		$class .= $item->anchor_css.' ';
	}
 
	if (!empty($class)) {
		$class = ' class="'.trim($class).'"';
	}
 
	echo '<li '.$class.'>';
	$flag = false;
	$item->title = html_entity_decode($item->title);
	// Render the menu item.
	switch ($item->type) {
		case 'separator':
		case 'component':
			require JModuleHelper::getLayoutPath('mod_menu', 'default_'.$item->type);
			break;
 
		default:
			require JModuleHelper::getLayoutPath('mod_menu', 'default_url');
			break;
	}
 
	// The next item is deeper.
	if ($item->deeper) {
		$flag_last = true;		
		if ($item->level==1) {
			echo '<ul>';
			$level_1_id = $item->id;
		}
		else echo '<ul>';
		$flag = true;
	}
	// The next item is shallower.
	else if ($item->shallower) {
		echo '</li>';
		echo str_repeat('</ul></li>', $item->level_diff);
	}
	// The next item is on the same level.
	else {		
		echo '</li>';
	}
	$count ++;
endforeach;
?></ul>

И вот ссылка на демо шаблона http://demo.joomlashine.com/joomla-templates/jsn_neon/pro/index.php ,
там вроде такой проблемы не наблюдается.

Где я мог накосячить?

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 7 мес. назад #6947 от Wedal
Андрей, по вашему коду могу сказать вот что:
1) Пункт меню подсвечивает класс active
2) Он формируется в этом файле в следующем кусочке кода:
	if (in_array($item->id, $path)) {
		$class .= 'active ';
	}
3) Этот код скорее всего проверяет есть ли ID текущего пункта меню в массиве $path.
4) Массив $path выводится откуда-то из фреймворка:
	require_once JPATH_ROOT . '/plugins/system/jsntplframework/jsntplframework.defines.php';
	require_once JPATH_ROOT . '/plugins/system/jsntplframework/libraries/joomlashine/loader.php';

Больше ничего не скажу, не хватает данных.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 7 мес. назад #6955 от Андрей Нестеров
Файл jsntplframework.defines.php
<?php
/**
 * @version     $Id$
 * @package     JSNExtension
 * @subpackage  TPLFramework
 * @author      JoomlaShine Team <support@joomlashine.com>
 * @copyright   Copyright (C) 2012 JoomlaShine.com. All Rights Reserved.
 * @license     GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
 *
 * Websites: http://www.joomlashine.com
 * Technical Support:  Feedback - http://www.joomlashine.com/contact-us/get-support.html
 */
 
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// Define base constants for the framework
define('JSN_PATH_TPLFRAMEWORK', dirname(__FILE__));
define('JSN_PATH_TPLFRAMEWORK_LIBRARIES', JSN_PATH_TPLFRAMEWORK . '/libraries/joomlashine');
 
define('JSN_TPLFRAMEWORK_ID', 'tpl_framework');
define('JSN_TPLFRAMEWORK_VERSION', '2.1.4');
 
define('JSN_TPLFRAMEWORK_CHECK_UPDATE_PERIOD', 86400);
 
// Define remote URL for communicating with JoomlaShine server
define('JSN_TPLFRAMEWORK_LIGHTCART_URL', 'http://www.joomlashine.com/index.php?option=com_lightcart');
define('JSN_TPLFRAMEWORK_VERSIONING_URL', 'http://www.joomlashine.com/versioning/product_version.php');
define('JSN_TPLFRAMEWORK_UPGRADE_DETAILS', 'http://www.joomlashine.com/versioning/product_upgrade.php');

Файл loader.php
<?php
/**
 * @version     $Id$
 * @package     JSNExtension
 * @subpackage  TPLFramework
 * @author      JoomlaShine Team <support@joomlashine.com>
 * @copyright   Copyright (C) 2012 JoomlaShine.com. All Rights Reserved.
 * @license     GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
 *
 * Websites: http://www.joomlashine.com
 * Technical Support:  Feedback - http://www.joomlashine.com/contact-us/get-support.html
 */
 
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
/**
 * Autoload class file of JSN Template Framework.
 *
 * @param   string  $className  Name of class needs to be loaded.
 *
 * @return  boolean
 */
function jsn_template_framework_class_loader($className)
{
	if (strpos($className, 'JSNTpl') === 0)
	{
		$path  = strtolower(preg_replace('/([A-Z])/', '/\\1', substr($className, 6)));
		$fullPath = JSN_PATH_TPLFRAMEWORK_LIBRARIES . '/' . $path;
 
		// Load alternative class for backward compatible with old template version
		$app = JFactory::getApplication();
		$tpl = $app->getTemplate();
 
		if ($app->isSite() AND substr($tpl, 0, 4) == 'jsn_' AND ! JSNTplVersion::isCompatible($tpl, JSNTplHelper::getTemplateVersion($tpl)))
		{
			if (is_file("{$fullPath}_v1.php") AND is_readable("{$fullPath}_v1.php"))
			{
				$fullPath .= '_v1';
			}
		}
 
		if (is_file("{$fullPath}.php") AND is_readable("{$fullPath}.php"))
		{
			return include_once "{$fullPath}.php";
		}
 
		return false;
	}
}
 
// Register jsn_template_framework_class_loader for autoloading
spl_autoload_register('jsn_template_framework_class_loader');
 
// Preload some required classes
require_once JSN_PATH_TPLFRAMEWORK_LIBRARIES . '/helper.php';
require_once JSN_PATH_TPLFRAMEWORK_LIBRARIES . '/version.php';

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 7 мес. назад #6958 от Wedal
Андрей, имеем:
$path  = strtolower(preg_replace('/([A-Z])/', '/\\1', substr($className, 6)));
Теперь нужно найти, где определяется $className

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 7 мес. назад #6960 от Андрей Нестеров
Наличие $className я смог обнаружить в следующих файлах:

- plugins\system\jsntplframework\libraries\joomlashine\form\field.php

https://yadi.sk/d/ZMMJpgJqcEuAR

- plugins\system\jsntplframework\libraries\joomlashine\template\helper.php

https://yadi.sk/d/Mg0JfwcRcEuFY

- plugins\system\jsntplframework\libraries\joomlashine\template\helper_v1.php

https://yadi.sk/d/VtGW-xuxcEuJT

Параллельно я создал тему на этом форуме http://joomlaforum.ru/index.php/topic,302728.0.html .
Пока советы с него мне не помогли, может Вас на что-то натолкнут.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 6 мес. назад #7031 от Андрей Нестеров
Виталий, добрый день!

Если я Вам предоставлю доступ к тестовому сайту, Вы можете посмотреть решение моей проблемы?

Заранее спасибо!

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 6 мес. назад #7033 от Wedal
Андрей, за деньги.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 6 мес. назад #7035 от Андрей Нестеров
Виталий, цена вопроса?

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

8 года 6 мес. назад #7038 от Wedal
Андрей, пишите на email.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.