首页 文章

yii2如何使用“layout”中的默认元标记替换“view”中的自定义元标记

提问于
浏览
4

我想为主模板布局放置默认的元数据描述标签 .

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

我试过了:

$this->registerMetaTag

在我需要自定义元标记的视图中,我也在主布局中使用了它 .

我想如果我将使用带有ID或名称的元标记,它将被替换,但结果会显示重复的元标记,例如

<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 就可以按视图自定义

3 回答

  • 5

    这是我的解决方案,它更简单,没有冗余控制器 . 您只需要在app params中定义默认标记并在视图中覆盖它们 .

    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');
    ?>
    

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

    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';
    ?>
    
  • 1

    我自己做了,因为我的目标不是在每个动作上重复一个默认关键字或其他元标记,但是我想要替换的地方我会使用registerMetaTag .

    • 首先创建自己的Controller扩展版,如下所示
    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的配置文件中添加所有自定义关键字author等元标记作为默认值 .

    • 现在,您创建的任何新控制器都只是使用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');
    }
    
  • 8

    您可以使用类似的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');
    }
    

相关问题