Yii2 如何在"layout"中将自定义元标记从"view"替换为默认元标记



我想将默认的元数据描述标签用于主模板布局。

在许多情况下,我需要在视图中使用自定义数据来替换默认的元标记,例如描述和关键字。

我尝试过:

$this->registerMetaTag

在我需要自定义元标签的视图中,我也在主布局中使用了此标签。

我以为如果我使用其ID或名称的元标记将被替换,但是结果显示了重复的元标记,例如e.g。

<meta id="main_index" name="Description" content="my default content added by layout.">

<meta id="main_index" name="Description" content="my customized content added by the view"></head>

提供默认描述标签的最佳方法是什么,但是每当我致电$this->registerMetaTag

时,可以通过视图自定义

这是我的解决方案,它在没有冗余控制器的情况下要简单得多。您需要的只是在应用程序参数中定义默认标签并在视图中覆盖它们。

config/params.php

<?php
return [
    'adminEmail' => 'admin@example.com',
    'og_title' => ['property' => 'og:title', 'content' => 'title'],
    'og_description' => ['property' => 'og:description', 'content' => 'description'],
    'og_url' => ['property' => 'og:url', 'content' => '/'],
    'og_image' => ['property' => 'og:image', 'content' => 'image']
];

views/layouts/main.php

<?php
    $this->registerMetaTag(Yii::$app->params['og_title'], 'og_title');
    $this->registerMetaTag(Yii::$app->params['og_description'], 'og_description');
    $this->registerMetaTag(Yii::$app->params['og_url'], 'og_url');
    $this->registerMetaTag(Yii::$app->params['og_image'], 'og_image');
?>

现在,如果我需要设置自定义标签,我在视图中覆盖param

views/site/index.php

<?php
    Yii::$app->params['og_title']['content'] = 'custom title';
    Yii::$app->params['og_description']['content'] = 'custom desc';
    Yii::$app->params['og_url']['content'] = '/new/url';
    Yii::$app->params['og_image']['content'] = 'image.jpg';
?>

我使自己成为自己的自我,因为我的目标不是在每个操作上重复一个默认关键字或其他元标记,而是我想替换的地方,我会在操作中使用registermetatag。

  • 首先创建自己的扩展版本的控制器,如下

    class MyController extends Controller
    {    
        public function beforeAction($event){
        $this->view->title = Yii::$app->params['pageTitle'];
        Yii::$app->view->registerMetaTag(Yii::$app->params['pageDefaultDescription'],"default_description");
        Yii::$app->view->registerMetaTag(Yii::$app->params['pageDefaultKeywords'],"default_keywords");
        Yii::$app->view->registerMetaTag(Yii::$app->params['pageDefaultAuthor'],"default_author");
        // Open Graph Tags
        Yii::$app->view->registerMetaTag(Yii::$app->params['pageDefaultOG_Description'],"default_og_description");
        Yii::$app->view->registerMetaTag(Yii::$app->params['pageDefaultOG_SiteName'],"default_og_sitename");
        Yii::$app->view->registerMetaTag(Yii::$app->params['pageDefaultOG_Title'],"default_og_title");
        Yii::$app->view->registerMetaTag(Yii::$app->params['pageDefaultOG_Type'],"default_og_type");
    
        return parent::beforeAction($event);
        }
    } 
    
  • 现在,所有自定义的关键字作者等都可以从param的配置文件中添加为默认文件。

  • 现在,您创建的任何新控制器都只需使用myController扩展它,因此默认情况下所有上述元标记都将被附加。

  • 如果您需要替换元标记或在某些操作中自定义,则喜欢下面。

     public function actionIndex()
    {
    
        Yii::$app->view->registerMetaTag([
            'name' => 'description',
            'content' => 'my customize description for the index.',
            'id'=>"main_index"
        ],"main_index"); //this will now replace the default one.
    
        return $this->render('index');
    }
    

您可以使用类似的ID来管理注册的元标记。确保使用YII生成元标记。从您的问题中,您已经生成了一个仪表标签,因为YII无法管理它。

public function actionTest1{
    $this->registerMetaTag('your example', 'description', null, array(), 'metaDescription');
    $this->render('myView');
}
public function actionTest2{
    $this->registerMetaTag('your example2', 'description', null, array(), 'metaDescription');
    $this->render('myView2');
}

最新更新