5

Zend Framework 2 を使用しています。

私のレイアウトファイルでは、次のようないくつかのjavascriptファイルを挿入します:

$this->InlineScript()
            ->appendFile($this->basePath() . '/js/myfile.js');


echo $this->InlineScript();

ここで、ビューから JavaScript を挿入して、InlineScript コレクションの末尾に追加したいと考えています。

だから私は私のアクションビューでこれを書きました:

<?php $this->InlineScript()->offsetSetFile(100,$this->basePath() . '/js/xyz.js'); ?>

しかし、その結果、ファイル xyz がレンダリングされたビューで最初に読み込まれます。

Zend Framework 2.0.5 を使用しています

これを管理する方法を教えてくれる人はいますか?

4

4 に答える 4

14

この古い質問を補足するために:

内部ビュー:ページの上部にファイルを追加します。

$this->headScript()->appendFile('/js/filename.js');

ページの上部にスクリプトを追加する

$this->headScript()->appendScript('alert(1)');

ページの下部にファイルを追加します。

$this->inlineScript()->appendFile('/js/filename.js');

ページの下部にスクリプトを追加します

$this->inlineScript()->appendScript('alert(1)');

コントローラー/アクションの内部

serviceLocator を使用して Headscript を取得すると、残りは同じです

$this->getServiceLocator()
    ->get('viewhelpermanager')
    ->get('HeadScript')->appendScript('alert(1)'); //or ->appendFile('/js/filename.js');

アクション内で inlineScrip を取得する方法を知っている場合は、お知らせください。

于 2013-09-24T20:00:21.247 に答える
2

これはappendFile、レイアウト内で使用することが原因のようです。ビュー スクリプトが最初に実行され、スクリプトがスタックに追加されます。次に、レイアウトが実行されるときに再度追加して、レイアウトのスクリプトを最後のスクリプトにします。prependScriptレイアウトのスクリプトが既に追加されているスクリプトに追加されないように、レイアウト ファイルで使用してみてください。

于 2013-02-08T12:36:55.070 に答える
0

私は質問を回避していました:「アクション内でinlineScripを取得する方法を知っている場合はお知らせください。」、かなりの解決策を得て、ここに投稿することにしました:

  1. すべてのインライン スクリプトをグループ化するために他の場所で呼び出される小さなクラスを作成し、layout.phtml テンプレートによってレンダリングされるように適切にフォーマットします。
  2. 条件付き挿入ポイントを定義して、最終ページに完全なスクリプトを挿入します

(オリジナルのタイプミスのため、コード 04-05-2016 を差し替えます)

    <?php
        // Filename: /module/MyTools/src/MyTools/Library/Js2ls.php
        namespace MyTools\Library;    
        abstract class Js2l
{
    protected static $inLineJs;
    protected static $inLineVars;

    public static function addSetting($settingkey, $settingvalue)
    {
        if(!self::isSettingThere($settingkey)){
            self::$inLineVars[$settingkey] = $settingvalue;
        }
    }

    public static function addScript($script, $scriptkey=NULL)
    {
        if(!$scriptkey){
            if(!self::$inLineJs){
                self::$inLineJs = array();
                self::$inLineJs[] = $script;
            }elseif(!(in_array($script, self::$inLineJs))){
                self::$inLineJs[] = $script;
            }
        }elseif(!isset(self::$inLineJs[$scriptkey])){
            self::$inLineJs[$scriptkey] = $script;
        }
    }

    protected static function appendItemToSetting($current, $item)
    {
        if($item == $current){ return $current; }
        if(is_array($current)){
            if(!in_array($item, $current)){                
                $current[] = $item;
            }
            return $current;
        }else{
            return [$current, $item];
        }
    }

    public static function extendSetting($settingkey, $settingvalue)
    {
        $current = self::getSetting($settingkey);
        if($current){
            $new = self::appendItemToSetting($current, $settingvalue);
            if( $new !== $current){
                self::$inLineVars[$settingkey] = $new;            
            }
        }else{
            self::addSetting($settingkey, $settingvalue);
        }
    }
    public static function getSetting($settingkey){
        if(self::$inLineVars){
          $sale = isset(self::$inLineVars[$settingkey]) ? self::$inLineVars[$settingkey] : NULL;
          return $sale; 
        }else{
          return NULL;
        }
    }

    public static function getScripts(){
      return self::$inLineJs;
    }

    public static function getSettings(){
      return self::$inLineVars;
    }

    public static function iskeyedArray($array)
    {
        $out = FALSE;
        $keys = array_keys($array);
        foreach ($keys as $key) {
            if(!is_numeric($key)){
                $out = TRUE;
                break;
            }
        }
        return $out;
    }

    protected static function renderInLineJs()
    {
        return (self::$inLineJs) ? implode("\n", self::$inLineJs) : '';
    }

    protected static function renderInLineVars($js)
    {
        $out = '';
        if(is_array($js)){
            $items = [];
            foreach ($js as $key => $value) {
                $items[] = '"'.$key .'": '.self::renderJsItem($value);
            }
            $out .= implode(', ', $items);
        }        
        return $out;
    }

    protected static function renderJsItem($item)
    {
        if(is_scalar($item)){
            return (is_numeric($item)) ? ''.$item : '"'.$item.'"';
        }elseif(is_array($item)){
            if(self::iskeyedArray($item)){
                return '{'. self::renderInLineVars($item).'}';
            }else{
                return (count($item)>0) ? '["'.implode('", "', $item).'"]' : '[ ]';
            }
        }else{
            return '[ ]';
        }
    }

    protected static function isSettingThere($settingkey)
    {
        return ( isset(self::$inLineVars[$settingkey]) ) ? TRUE : FALSE;
    }

    public static function ToString()
    {
        $prefix = "\n".'jQuery.extend(MyTools.settings, {';
        $suffix = '});'."\n";
        $settings = self::renderInLineVars(self::$inLineVars);
        $jsSettings = ($settings) ? $prefix.$settings.$suffix: '';
        $jsMethods = self::renderInLineJs();
        return ($jsMethods) ? $jsSettings."\n".$jsMethods : $jsSettings;
    }
}
    ?>

</code>

Whit this class defined you can add, elsewhere,  global variables to be used by your scripts to a global variable using the code:

<code>

    <?php
    // you are elsewhere in your php code. Write
    use MyTools\Library\Js2l
    Js2l::addSetting($settingkey, $settingvalue);
    // or
    Js2l::extendSetting($variablename, $value);
    // $settingvalue and $value can be scalar o array values
    Js2l::addScript($yourJavaScript, $akeyToAvoidDuplicates);
    ?>

</code>

The class knows how to format the code so you can call it to be injected in the template

<code>
    <?php
    // Filename: /module/Application/view/application/layout/layout.phtml
    ?>

    <?php
    // place this call before the scripts block
    use MyTools\Library\Js2l
    $mysript = Js2l::ToString();
    if ($mysript){
      echo $this->inlineScript()->appendScript($myscript);
    }

</code>

これで、インライン スクリプトをオンデマンドで挿入するための便利なクラスができました。

于 2016-05-04T05:19:34.097 に答える