Помогите, такая проблема: Я хочу выводить хлебные крошки только в компоненте каталог, тоесть в шаблоне catalog/bitrix/.default/catalog.element/.default/template.php я пишу
Но вместо того чтобы выводить крошки в нужном месте они выводятся сразу под панелью администрирования. В чем может быть проблема?? ТОчнее я подозреваю что тут что то связано с отложенными функциями, но как решить такой вопрос????
Мне кажется все дело в кешировании. Попробуйте добавить код вызова компонента bitrix:breadcrumb не в шаблон элемента каталога, а в шаблон комплексного компонента catalog/element.php
Такая же беда, но только в карточке товара ... причем если вставить крошки просто как html то все в порядке, и на других страницах крошки работают вполне исправно
При попытке так сделать битрикс насмерть падает с сообщением
Код
[ErrorException] E_STRICT
Non-static method CAgent::CheckAgents() should not be called statically (0)
/home/bitrix/www/bitrix/modules/main/include.php:1
#0: CAgent::CheckAgents()
/home/bitrix/www/bitrix/modules/main/include.php:1
#1: require_once("/home/bitrix/ww...ain/include.php" (48))
/home/bitrix/www/bitrix/modules/main/include/prolog_before.php:14
#2: require_once("/home/bitrix/ww...olog_before.php" (62))
/home/bitrix/www/bitrix/modules/main/include/prolog.php:11
#3: require_once("/home/bitrix/ww...lude/prolog.php" (55))
/home/bitrix/www/bitrix/header.php:1
#4: require("/home/bitrix/ww...trix/header.php" (34))
/home/bitrix/www/catalog/index.php:2
Fatal error: Exception thrown without a stack frame in Unknown on line 0
UPD: рученки были кривоваты, перемудрил с настройками ядра.
Но суть от этого не меняется крошки все-равно выводятся в панели...
Более точная формулировка: если поместить вызов bitrix:breadcrumb в кешируемой области, то при включенном кешировании он будет показываться неправильно. Тут уже было предложение поместить вызов в некешируемый файл catalog/element.php, а не в кешируемый template.php
Для реализации задачи потребуется создать класс, например ComponentHelper. В папке /bitrix/php_interface/ создадим папку /class/ в ней нужно создать файл ComponentHelper.php со следующим содержимым:
Содержимое ComponentHelper.php
Код
<?php
#/bitrix/php_interface/classes/ComponentHelper.php
namespace PHPInterface;
/**
* ComponentHelper
*
* Создает плейсхолдеры в шаблоне
* При помощи статической функции handle обрабатывает их
* Класс необходим для вызова некешируемых функций
*/
class ComponentHelper
{
private $component = null;
private $lastPlIndex = 0;
private $pull = array();
public function __construct(\CBitrixComponent $component)
{
$this->component = $component;
$this->component->SetResultCacheKeys(array('CACHED_TPL', 'CACHED_TPL_PULL'));
ob_start();
}
public function deferredCall($callback, $args = array())
{
$plName = $this->getNextPlaceholder();
echo $plName;
$this->pull[$plName] = array('callback' => $callback, 'args' => $args);
}
public function saveCache()
{
$this->component->arResult['CACHED_TPL'] = @ob_get_contents();
$this->component->arResult['CACHED_TPL_PULL'] = $this->pull;
ob_get_clean();
$this->component = null;
}
private function getNextPlaceholder()
{
return '##PLACEHOLDER_'.(++$this->lastPlIndex).'##';
}
public static function handle(\CBitrixComponent $component)
{
$buf = &$component->arResult['CACHED_TPL'];
foreach ($component->arResult['CACHED_TPL_PULL'] as $plName => $params) {
list($prevPart, $nextPart) = explode($plName, $buf);
echo $prevPart;
call_user_func_array($params['callback'], $params['args']);
$buf = &$nextPart;
}
echo $buf;
}
}
Чтобы вывести хлебные крошки, понадобится создать функцию, например ShowNavChain в файле init.php
Строки необходимые добавить в файл init.php ( располагается в /bitrix/php_interface/ )
Код
//Подключаем созданный класс ComponentHelper.php
require_once(dirname(__FILE__).'/classes/ComponentHelper.php');
//Функция отвечающая за вывод "хлебных-крошек" bitrix:breadcrumb
function ShowNavChain($template = '.default')
{
global $APPLICATION;
$APPLICATION->IncludeComponent("bitrix:breadcrumb","",Array(
"START_FROM" => "0",
"PATH" => "",
"SITE_ID" => "s1"
));
}
В шаблоне в котором необходим вывод "хлебных-крошек" необходимо разместить следующий код:
Код
//В необходимом месте вставки "хлебных-крошек"
$helper = new PHPInterface\ComponentHelper($component);
$helper->deferredCall('ShowNavChain', array('.default'));
//... код шаблона ...
// И в конце шаблона обязательно вызвать
$helper->saveCache();
В папке шаблона создаём файл component_epilog.php с содержимым:
Код
PHPInterface\ComponentHelper::handle($this);
Если всё сделано правильно, теперь "хлебные-крошки" будут отображаться корректно внутри вашего шаблона.