生成元页面标题与页面的h1标题标签完全相同

时间:2017-07-29 05:08:35

标签: php html joomla

基于Joomla的网站

我有很多页面,其中h1 - header被提及为产品详细信息,并根据产品详细信息通过php显示

有2个文件

default.php
view.html.php

cdefault.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}";

从页面标题中提取h1

这是完整的代码

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

4 个答案:

答案 0 :(得分:0)

为什么不将h1内容作为GET参数发送到您的php文档,然后使用echo内的title输出它标签?除非你避免使用dinamic echoing,否则这可能是将文本输出为title的一个很好的解决方案。

答案 1 :(得分:0)

我会将构造title / header的逻辑抽象为某个函数,然后使用此函数在两个地方构造标题。

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(..., ...));

这使您可以在一些地方使用单点来格式化标题。

显然,该功能需要放置在这样的位置,以便可以在两个地方访问它,并且您需要有一些方法来获取类别名称产品名称 in view.html.php。我对joomla不太熟悉,不知道这些事情。

编辑: 为了澄清,没有真正的方法来提取&#34; default.php中的标题,因为它是动态的。你需要处理php文件,然后你可能会做一些正则表达式魔法,但这绝不是问题的正确解决方案。

答案 2 :(得分:0)

这是代码标题部分的作用:

// 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);
[...]

代码未经测试,但可以让您走上正确的路:)

答案 3 :(得分:0)

您可以只将h1内容作为GET参数发送到您的php文档,然后在标题标签中使用echo将其输出?除非您避免动态回显,否则它将起作用。