我有一个问题, 我通过以下代码添加title和meta:
$this->pageTitle = 'testTitle';
Yii::app()->clientScript->registerMetaTag('testKeyWords','keywords');
我得到的结果如下:
但是我想要关键字上方的标题,该怎么办?
感谢您的帮助!
答案 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,请记得重新检查您的实现,这样就不会有任何更改会破坏您的代码。