Генерация мета-заголовка страницы точно так же, как на теге h1

Сайт основан на Joomla. У меня есть много страниц, где заголовок h1 упоминается как информация о продукте и отображается на основе информации о продукте через PHP. Есть 2 файла: default.php и view.html.php.

default.php:

<h1>Used <?php echo $this->CatName; ?> <?php echo $this->prodDet->prod_name;?> Toy for Sale </h1>

Это правильно отображает тег h1. Я хочу сгенерировать мета-заголовок страницы и использовать этот вывод h1, сгенерированный в view.html.php. Эта строка определяет заголовок страницы:

$this->document->setTitle($title);

И эта строка определяет заголовок h1:

"{$this->item->heading}";

Полный код:

protected function _prepareDocument()
{
  $app = JFactory::getApplication();
  $menus = $app->getMenu();
  $title = null;

  // Because the application sets a default page title,
  // We need to get it from the menu item itself
  $menu = $menus->getActive();

  if ($menu)
  {
    $this->params->def('page_heading', $this->params->get('page_title', $menu->title));
  }
  else
  {
    $this->params->def('page_heading', JText::_('COM_USEDCAR_DEFAULT_PAGE_TITLE'));
  }

  $title = $this->params->get('page_title', '');

  if (empty($title))
  {
    $title = $app->get('sitename');
  }
  elseif ($app->get('sitename_pagetitles', 0) == 1)
  {
    $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title);
  }
    elseif ($app->get('sitename_pagetitles', 0) == 2)
  {
    $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename'));
  }

  $title = "{$this->item->heading}";
  $this->document->setTitle($title);

  if ($this->params->get('menu-meta_description'))
  {
    $this->document->setDescription($this->params->get('menu-meta_description'));
  }

  if ($this->params->get('menu-meta_keywords'))
  {
    $this->document->setMetadata('keywords', $this->params->get('menu-meta_keywords'));
  }

  if ($this->params->get('robots'))
  {
     $this->document->setMetadata('robots', $this->params->get('robots'));
  }
}

Вывод в заголовке тега - heading. Как поместить этот вывод тега h1 вместо $title?

Ответ 1

Почему вы просто не отправляете свой h1 контент в ваш php-документ как GET, а затем просто выводите его с помощью echo внутри тега title? Если вы не избежите динамического эха, это может быть прекрасным решением для вывода текста как title.

Ответ 2

Я бы абстрагировал логику построения заголовка/заголовка для некоторой функции, а затем использовал эту функцию для создания заголовка в обоих местах.

function constructTitle($catName, $prodName) {
    return "Used {$catName} {$prodName} Toy for Sale";
}

...

[in default.php]
<h1><?php echo constructTitle($this->CatName, $this->prodDet->prod_name); ?></h1>

[in view.html.php]
$this->document->setTitle(constructTitle(..., ...));

Это позволяет вам иметь одну точку для форматирования заголовка, используя его в нескольких местах.

Функция должна, очевидно, находиться в таком положении, чтобы к ней можно было получить доступ в обоих местах, и вам нужно каким-то образом получить название категории и имя продукта в view.html.php. Я не достаточно хорошо знаком с Joomla, чтобы знать эти вещи.

Изменить: Чтобы уточнить, нет реального способа "извлечь" заголовок из файла default.php, поскольку он является динамическим. Вам нужно будет обработать файл php, возможно, вы можете сделать некоторую магию регулярных выражений, но это никоим образом не является правильным решением проблемы.

Ответ 3

Вот что делает заглавная часть вашего кода:

// getting title from params
  $title = $this->params->get('page_title', '');

// trying to get it right
  if (empty($title))
  {
    $title = $app->get('sitename');
  }
  elseif ($app->get('sitename_pagetitles', 0) == 1)
  {
    $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title);
  }
    elseif ($app->get('sitename_pagetitles', 0) == 2)
  {
    $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename'));
  }

// overwrite everything above with some value, making above code useless
  $title = "{$this->item->heading}";
  $this->document->setTitle($title);

Я могу ошибаться, но если я правильно вспомню, если значение не существует, оно вернет имя переменной при преобразовании в строку. Здесь заголовок может быть пустым.

Возможно, вы захотите изменить свой код на что-то вроде этого:

[...]

if(!title){
  if(property_exists($this, 'item') && property_exists($this->item, 'heading') && $this->item->heading){
    $title = $this->item->heading;
  } else {
    $title = sprintf('Used %s %s Toy for Sale' , $this->CatName, $this->prodDet->prod_name);
  }
}
$this->document->setTitle($title);

Вы также можете сохранить заголовок в сеансе и использовать его везде:

[...]
$this->document->setTitle($title);

// save title to session
$_SESSION['page_title'] = $title;

и обновите предыдущий цикл:

// getting title from params
  $title = (isset($_SESSION['page_title']) && $_SESSION['page_title'])? $_SESSION['page_title'] : $this->params->get('page_title', '');

if (empty($title)){
[...]

Полный код будет выглядеть примерно так:

[...]
session_id() || session_start();

$title = (isset($_SESSION['page_title']) && $_SESSION['page_title'])? $_SESSION['page_title'] : $this->params->get('page_title', '');

if(!title){
  if(property_exists($this, 'item') && property_exists($this->item, 'heading') && $this->item->heading){
    $title = $this->item->heading;
  } else {
    $title = sprintf('Used %s %s Toy for Sale' , $this->CatName, $this->prodDet->prod_name);
  }
}

if (empty($title))
{
  $title = $app->get('sitename');
}
elseif ($app->get('sitename_pagetitles', 0) == 1)
{
  $title = JText::sprintf('JPAGETITLE', $app->get('sitename'), $title);
}
  elseif ($app->get('sitename_pagetitles', 0) == 2)
{
  $title = JText::sprintf('JPAGETITLE', $title, $app->get('sitename'));
}

$_SESSION['page_title'] = $title;
$this->document->setTitle($title);
[...]

Вы можете просто бросить все и пойти так, если хотите:

[...]
$title = $this->params->get('page_title', '');

if(!title){
  if(property_exists($this, 'item') && property_exists($this->item, 'heading') && $this->item->heading) {
    $title = $this->item->heading;
  } elseif(
        property_exists($this, 'CatName') && 
        property_exists($this, 'prodDet') && 
        property_exists($$this->prodDet, 'prod_name') && 
        $this->CatName && 
        $this->prodDet->prod_name
      ){
    $title = sprintf('Used %s %s Toy for Sale' , $this->CatName, $this->prodDet->prod_name);
  } else {
    $title = $app->get('sitename');
  }
}

$this->document->setTitle($title);
[...]

Код не проверен, но он должен поставить вас на правильный путь :)

Ответ 4

Вы можете просто отправить содержимое h1 в свой php-документ как параметр GET, а затем вывести его, используя echo в теге title? Если вы не избежите динамического эха, это будет работать.