3

私はしばらくこれを行う方法を理解しようとしてきましたが、困惑しています。なんらかの理由で、YII はベスト プラクティスに反し、この JS をすべて HEAD タグと本文全体に挿入しようとします。body タグの直前にすべての JS が表示されるようにします。

私は独自の jQuery (v.1.9.0)、Bootstrap などを使用しており、scriptMap 設定を false に設定しています。しかし、yiiactiveform は引き続き HEAD タグに挿入され、ビューで enableClientValidation を使用して使用される JS と、ビューの下部に記述された JS が引き続き BODY に表示されます。

これはどのように変更できますか?

4

1 に答える 1

14

jquery.yiiactiveform.jsはcoreScriptとして登録されているため、その位置を変更するには、その位置をオーバーライドする必要があります。デフォルトでは<HEAD>。です。位置をオーバーライドするには、(特定のビューで)次のようcoreScriptPositionにCClientScriptのプロパティを使用できます。

Yii::app()->clientScript->coreScriptPosition=CClientScript::POS_END;

ボディタグの最後の位置に変更しました。

ただし、これはすべてのビュー、つまりアプリ全体に対して実行する必要があるため、アプリの構成中に位置を上書きできます。そのためには、アプリによってロードされる構成配列を変更する必要があります。通常、この配列はファイルprotected / config/main.phpで指定されます。clientScript次のように、アプリのコンポーネント構成を変更する必要があります。

return array(
    // other properties
    'components'=>array(
        // other components' configurations

        'clientScript'=>array(
            'coreScriptPosition'=>CClientScript::POS_END
        )
    )
);

同様に、プロパティregisterScriptFile()を使用して、スクリプトファイルとして登録されたスクリプトに変更を加えることができます。defaultScriptFilePosition

次に、で登録されたスクリプトの場合は、プロパティregisterScript()を使用します。defaultScriptPosition

これらのプロパティは、CActiveFormなどのウィジェットによって登録されたスクリプトの位置を指定する場合、およびもちろん、独自のスクリプト(registerScript*関数の1つに登録されている場合)の位置を指定する場合に特に便利です。

(関数の1つを使用して)ファイル/スクリプトを自分で指定した場合は、registerScript*関数の呼び出し中に位置を設定することもできます。

ウィジェットの位置を変更するときは、必ず徹底的にテストしてください。たとえば、CActiveFormにはjQuery.ready関数に登録されている小さなスクリプトがいくつかあります。またjQuery(function($) { ...、defaultScriptPositionをPOS_ENDに指定すると、これらのスクリプトはready()関数から移動されます。

ビューごとにこれらのプロパティを再度変更できます。

Yii::app()->clientScript->defaultScriptPosition=CClientScript::POS_END;
Yii::app()->clientScript->defaultScriptFilePosition=CClientScript::POS_END;

またはシステム全体:

return array(
    // other properties
    'components'=>array(
        // other components' configurations

        'clientScript'=>array(
            'coreScriptPosition'=>CClientScript::POS_END,
            'defaultScriptPosition'=>CClientScript::POS_END,
            'defaultScriptFilePosition'=>CClientScript::POS_END
        )
    )
);

ビューにタグ付きのスクリプトを含めた場合<script></script>、その位置を簡単に制御することはできないと思います。これらのスクリプトを(可能であれば)レイアウトファイルに移動する必要があります(常に機能するとは限りません)。 -多くの異なるケース)。最良のオプションは、を使用する代わりにregisterScriptFile、または関数に切り替えることです。registerScript<script>

于 2013-01-31T03:19:41.010 に答える