1

私の管理モジュールはブートストラップを使用しています:

'admin'=>array(
        'preload'=>array('bootstrap'),
        'components'=>array(
            'bootstrap'=>array(
                'class'=>'ext.bootstrap.components.Bootstrap',
            ),
        )
    ),

ただし、メイン サイトのエラー ハンドラも使用しています。

public function init() {
    $this->setImport(array(
        'admin.models.*',
        'admin.components.*',
    ));

    Yii::app()->setComponents(array(
       'errorHandler'=>array('errorAction'=>'site/error'),
    ));

    $this->layout = 'admin';
}

問題は、エラーが生成されると、ブートストラップ css がロードされてレイアウトが崩れることです。エラーアクションでブートストラップをアンロードするにはどうすればよいですか?

4

1 に答える 1

2

一般に、コンポーネントをアンロードするには、を使用setComponentして、2番目のパラメーターをとして渡しますnull。例:

Yii::app()->getModule('admin')->setComponent('bootstrap', null);

ただし、あなたの場合、使用しているbootstrap-extensionのバージョンは、コンポーネントがロードされるとすぐにcss/jsをすでに登録しています1。したがって、コンポーネントをアンロードしても、ブートストラップcssは引き続き含まれ、もちろんスタイルが適用されます。

ただし、ブートストラップによって登録されたcss / jsを削除して、ブートストラップコンポーネントの影響を削除することはできます。これを行う最も簡単な方法はclientScript、コメントですでに説明したようにをリセットすることです。最適な場所resetは次clientScriptactionError()ようになります。

public function actionError() {
    if($error=Yii::app()->errorHandler->error) {
        Yii::app()->clientScript->reset();
        // ... more code ...
    }
} 

これが機能する理由register*は、 css / jsを登録する関数のほとんどがビューレイアウトで検出されるため、そこに登録されているcss / jsはロードされますが、ブートストラップは省略されるためです。さらに、使用している可能性のあるウィジェットは、が検出された場合にのみcss/jsを登録しrenderます。


1extensions / bootstrap / components/Bootstrap.phpを参照してくださいinit()

if ($this->coreCss !== false)
    $this->registerCoreCss();

if ($this->responsiveCss !== false)
    $this->registerResponsiveCss();

if ($this->yiiCss !== false)
    $this->registerYiiCss();

if ($this->enableJS !== false)
    $this->registerCoreScripts();

拡張機能の新しいバージョン(1.0.1以降)では、css/jsを明示的に登録する必要があります。

于 2013-02-02T04:24:30.677 に答える