yakovjik

Как убрать пустой h1 в шаблоне битрикса?

6 сообщений в этой теме

когда у страницы нет заголовка, h1 пустой, поисковики этого не любят, а как его убрать, ведь он задается уже позже чем в шаблоне выводится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для того есть отложенные функции: http://dev.1c-bitrix.ru/api_help/main/general/technology/suspended_functions.php

Вот только беда в том, что эти функции ничего не возвращают, а только выводят в поток.

Мне в своё время удалось такую задачу решить только при помощи глобальной переменной.

Либо, как вариант, можно буферизацию использовать.

Иных способов вывести значение раньше, чем оно задано, не вижу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ради интереса попробовал повозюкаться с шаблоном битрикса на эту тему, получилось фифти\фифти:


<div id="workarea">
<?
if($APPLICATION->ShowTitle(false)) {
echo '<h1 id="pagetitle">
$APPLICATION->ShowTitle(false)
$APPLICATION->ShowProperty("ADDITIONAL_TITLE", "")
</h1>'; }
?>
#WORK_AREA#<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
IncludeTemplateLangFile(__FILE__);
?>
</div>

h1 зараза теперь вообще не выводит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

rus, а потому что неправильно.

У этого метода несколько неожиданное поведение: он не возвращает никакого результата.

И потому if($APPLICATION->ShowTitle(false)) не имеет никакого смысла. С таким же успехом можно написать if(false).

Тут суть вот в чём:

заголовок выводится в начале страницы, но определён он может быть при этом где-нибудь в середине, то есть позже.

Как вывести раньше то, что определено позже? Правильно, буферизация в помощь.

Метод SetTitle() устанавливает заголовок. Затем обрабатывается буфер, и в то место, где встречается вызов ShowTitle(), подставляется значение, установленное SetTitle(). То есть, проверять установленность заголовка этой функциоей нельзя. Она не для того.

Есть ещё GetTitle() — с его помощью можно проверять. Но в данном случае тоже неприемлемо, ибо заголовок ещё не задан.

Вообще, не до конца понимаю, почему отложенные функции работают именно так, а не иначе. В этом определённое неудобство есть для разработки.

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


<?
global $my_title;
$my_title = false;

function myShowTitle($t="title"){
global $APPLICATION;
echo $APPLICATION->AddBufferContent("myGetTitle");
}

function mySetTitle($t){
global $my_title;
if(strlen(trim($t))>0) {
$my_title = "<h1>".$t."</h1>";
} else {
$my_title = $t;
}
}

function myGetTitle(){
global $my_title;
if($my_title === false) {
global $APPLICATION;
$my_title = "<h1>".$APPLICATION->GetTitle()."</h1>";
}
return $my_title;
}


$this->IncludeComponentTemplate();
?>

Чую, что криво. Но работает исправно.

Если кто обругает мой вариант и предложит более правильный — заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Простите чайника ;) а как это работает? Где что писать нужно, чтобы заголовок выводился правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

И мне понадобилось убрать пустые теги, если не задан заголовок.
Вот нашёл тему - https://dev.1c-bitrix.ru/support/forum/forum6/topic72981/
Т.е. вставляем код в \bitrix\php_interface\init.php :

// функция убирает пустые теги H1, если заголовок пустой
function custom_page_filter(&$content) {
$content = str_replace('<h1></h1>', '', $content); 
} 
AddEventHandler('main', 'OnEndBufferContent', 'custom_page_filter'); 

Всё, больше ничего не требуется, всё работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас