在Yii 1.1

时间:2017-06-01 09:29:38

标签: php yii

我有一个问题, 我通过以下代码添加title和meta:

$this->pageTitle = 'testTitle';
Yii::app()->clientScript->registerMetaTag('testKeyWords','keywords');

我得到的结果如下:

Example code

但是我想要关键字上方的标题,该怎么办?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在我们的网络开发公司HeavyDots,我们也考虑到了这一要求,特别是因为我们希望首先使用SEO相关标签,以便Google能够在开始时找到它们。

基本上这就是你需要的:

1)在framework \ web \ CClientScript.php

扩展核心ClientScript组件

创建文件protected\components\CustomClientScript.php并输入以下内容:

<?php

/**
 * This class extends framework\web\CClientScript.php 
 * and overrides some of its methods.
 */
class CustomClientScript extends CClientScript {

  /**
   * Inserts the scripts in the head section.
   * @param string $output the output to be inserted with scripts.
   */
  public function renderHead(&$output) {
    $html = '';
    foreach ($this->metaTags as $meta)
      $html .= CHtml::metaTag($meta['content'], null, null, $meta) . "\n";
    foreach ($this->linkTags as $link)
      $html .= CHtml::linkTag(null, null, null, null, $link) . "\n";
    foreach ($this->cssFiles as $url => $media)
      $html .= CHtml::cssFile($url, $media) . "\n";
    foreach ($this->css as $css)
      $html .= CHtml::css($css[0], $css[1]) . "\n";
    if ($this->enableJavaScript) {
      if (isset($this->scriptFiles[self::POS_HEAD])) {
        foreach ($this->scriptFiles[self::POS_HEAD] as $scriptFile)
          $html .= CHtml::scriptFile($scriptFile) . "\n";
      }

      if (isset($this->scripts[self::POS_HEAD]))
        $html .= CHtml::script(implode("\n", $this->scripts[self::POS_HEAD])) . "\n";
    }

    if ($html !== '') {
      $count = 0;
//      $output = preg_replace('/(<title\b[^>]*>|<\\/head\s*>)/is', '<###head###>$1', $output, 1, $count);
      $output = preg_replace('/(<\\/title\s*>)/is', "$1\n<###head###>", $output, 1, $count);
      if ($count)
        $output = str_replace('<###head###>', $html, $output);
      else
        $output = $html . $output;
    }
  }

}

2)更改配置,以便应用程序开始使用它:

在配置文件protected\config\main.php中添加新组件:

...
// application components
'components' => array(
    ...
    'clientScript' => array(
      'class' => 'application.components.CustomClientScript',
    ),
    ...

附加说明

扩展应用程序组件

我们刚刚完成的是一种非常常见的自定义Yii的方法,无需编辑核心文件,因为您认为它很容易实现。

对于您希望扩展的每个应用程序组件,只需在核心文件中查找原始文件,然后自行创建。

我们已将此项目放在protected\components中,但您可以将它放在任何您想要的地方,如果您的应用程序很大并且您希望拥有更好的组织结构。

正如您在此组件中看到的那样,我们已经覆盖了renderHead方法,并且只更改了一行来指示插入与头部相关的代码的位置。

我们已经在</title>之后保存它以获得您要求的确切要求,但正如您可以猜测的那样,如果您想要不同的行为,您可以播放和更改内容。

如果您已有自定义客户端脚本

,该怎么办?

在我们的许多项目中,我们已经在使用自定义客户端脚本,例如minScript extension

在这种情况下,为了保持两者,我们这样做了:

1)将minScript组件保留在配置中而不是我们的自定义组件

'clientScript' => array(
  'class' => 'ext.minScript.components.ExtMinScript',
),
//    'clientScript' => array(
//      'class' => 'application.components.CustomClientScript',
//    ),

2)使minScript组件从我们的

扩展
//class ExtMinScript extends CClientScript {
class ExtMinScript extends CustomClientScript {

或者,如果您不想更改minScript代码:

1)通过将minScript组件类添加到配置的import部分来自动加载:

'ext.minScript.components.*',

2)从minScript组件而不是核心组件

扩展组件

重要说明:由于minScript也有自己的renderHead方法实现,因此必须将minScript代码块带到组件中。

<?php

/**
 * This class extends framework\web\CClientScript.php 
 * and overrides some of its methods.
 */
class CustomClientScript extends ExtMinScript {

  /**
   * Inserts the scripts in the head section.
   * @param string $output the output to be inserted with scripts.
   */
  public function renderHead(&$output) {

    // minScript block
    $this -> _minScriptProcessor('scripts', self::POS_HEAD);
    $this -> _minScriptProcessor('css');
    // end minScript block

    $html = '';
    foreach ($this->metaTags as $meta)
      $html .= CHtml::metaTag($meta['content'], null, null, $meta) . "\n";
    foreach ($this->linkTags as $link)
      $html .= CHtml::linkTag(null, null, null, null, $link) . "\n";
    foreach ($this->cssFiles as $url => $media)
      $html .= CHtml::cssFile($url, $media) . "\n";
    foreach ($this->css as $css)
      $html .= CHtml::css($css[0], $css[1]) . "\n";
    if ($this->enableJavaScript) {
      if (isset($this->scriptFiles[self::POS_HEAD])) {
        foreach ($this->scriptFiles[self::POS_HEAD] as $scriptFile)
          $html .= CHtml::scriptFile($scriptFile) . "\n";
      }

      if (isset($this->scripts[self::POS_HEAD]))
        $html .= CHtml::script(implode("\n", $this->scripts[self::POS_HEAD])) . "\n";
    }

    if ($html !== '') {
      $count = 0;
//      $output = preg_replace('/(<title\b[^>]*>|<\\/head\s*>)/is', '<###head###>$1', $output, 1, $count);
      $output = preg_replace('/(<\\/title\s*>)/is', "$1\n<###head###>", $output, 1, $count);
      if ($count)
        $output = str_replace('<###head###>', $html, $output);
      else
        $output = $html . $output;
    }
  }

}

最后的注释

如果您将来更新Yii或minScript,请记得重新检查您的实现,这样就不会有任何更改会破坏您的代码。