2016-09-27 83 views
1

在開發一個可以有多個前端主題的網站時,我正在尋找一種方法來允許後端用戶手動將代碼注入到頭部和主體中。兩個使用情況如下:Yii2添加到頭()和endBody()

案例1 - 樣式

  1. 在後端,用戶選擇一個主題。
  2. 用戶喜歡這個主題,但想鏈接一個不同的顏色。
  3. 而不是複製和修改主題,用戶可以設置自定義代碼在<head>標記末尾執行。

案例2 - 腳本

  1. 用戶要添加自定義JavaScript結束的文檔,但需要額外的JavaScript庫爲好。
  2. 而不是複製和修改主題,用戶可以設置自定義代碼在<body>標籤處執行。

據我所知,這兩種特殊情況下,可以實現(部分)配合使用的registerCssregisterJs但這些自動換行無論是傳遞給他們<style><script>標籤。我希望有一種方法可以直接將任何指示直接注入head()endBody()方法中。這背後的原因是我不想限制用戶可以注入的東西(可能頭部需要腳本標籤)。

目前,我只是存儲在PARAMS碼到要添加的然後手動包括他們在每個主題如下:

<?php $this->endBody() ?> 
<?= $this->params['theme_include_body_end'] ?> 

這在創建主題時,是不可取的,因爲它可以很容易被遺忘。我想找到一種方法來自動追加我的參數值到endBody()調用,所以無論何時endBody()被調用,我的代碼都包含在內(head()調用相同)。

回答

1

您可以使用覆蓋方法renderHeadHtml()renderBodyEndHtml()自己的視圖組件。

namespace common/components; 

class View extends \yii\web\View { 

    /** 
    * @var string Content that should be injected to end of `<head>` tag 
    */ 
    public $injectToHead = ''; 

    /** 
    * @var string Content that should be injected to end of `<body>` tag 
    */ 
    public $injectToBodyEnd = ''; 

    /** 
    * @inheritdoc 
    */ 
    protected function renderHeadHtml() 
    { 
     return parent::renderHeadHtml() . $this->injectToHead; 
    } 

    /** 
    * @inheritdoc 
    */ 
    protected function renderBodyEndHtml($ajaxMode) 
    { 
     return parent::renderBodyEndHtml(ajaxMode) . $this->injectToBodyEnd; 
    } 

} 

在配置文件中:

// ... 
'components' => [ 
    // ... 
    'view' => [ 
     'class' => '\common\components\View', 
    ] 
] 

某處在控制器代碼:

\Yii::$app->view->injectToHead = '...'; 
\Yii::$app->view->injectToBodyEnd = '...'; 
+0

這是一個很好的開始,但是當我嘗試用我的模塊來實現它時,它會崩潰。由於存在後端和前端模塊,因此我無法在組件級別設置視圖,否則它將應用於這兩個模塊。我需要在模塊中設置視圖類。如果我這樣做,我不能從控制器設置injectToHeadEnd屬性。任何想法調整這與多個模塊工作? – justinvoelker

+0

我不能解決你的問題:你爲什麼不能設置? )你的控制器不在模塊中? – IStranger

+0

控制器位於模塊內,但配置文件適用於整個應用程序。我想我得到了這個工作。我必須在我的模塊init()中設置視圖類如下:'Yii :: $ app-> components = ['view'=> ['class'=>'\ common \ components \ View']];'然後,我可以按照您的指示設置注入的代碼,但是,因爲我正在重寫模塊中的視圖,所以我的IDE抱怨它是一個未定義的字段。雖然IDE認爲它是未定義的,但仍然有效。 – justinvoelker

0

Yii2已經查看提供此功能在這些方法中可以根據需要注入必要的代碼類使用Block Widget

需要2個簡單的步驟:

1-(在需要查看文件):在任何給定的視圖

<?php $this->beginBlock('block1'); ?> 

...content of block1... 

<?php $this->endBlock(); ?> 

... 

<?php $this->beginBlock('block3'); ?> 

...content of block3... 

<?php $this->endBlock(); ?> 

2-(佈局):定義塊的名稱和其在該地方頁面佈局

... 

<?php if (isset($this->blocks['block1'])): ?> 
    <?= $this->blocks['block1'] ?> 
<?php else: ?> 
    ... default content for block1 ... 
<?php endif; ?> 

... 

<?php if (isset($this->blocks['block2'])): ?> 
    <?= $this->blocks['block2'] ?> 
<?php else: ?> 
    ... default content for block2 ... 
<?php endif; ?> 

... 

<?php if (isset($this->blocks['block3'])): ?> 
    <?= $this->blocks['block3'] ?> 
<?php else: ?> 
    ... default content for block3 ... 
<?php endif; ?> 
... 

全球化志願服務青年:Yii2指南

http://www.yiiframework.com/doc-2.0/guide-structure-views.html#using-blocks

我希望這會幫助別人。謝謝。

+0

非常好,謝謝! –