0

複数のjsファイルをレイアウトに追加しようとしています。これをヘルパーで行いたい。
私のヘルパーのコードは次のとおりです。

// class Zend_View_Helper_LoadJs extends Zend_View_Helper_Abstract


public function loadJs()
{
    $dir = '../public/js';      
    $dir = scandir($dir);

    $jsFiles = array();

    foreach($dir as $key => $value)
    {
        if($value != '.' && $value != '..')
            $jsFiles[] = $value;
    }


    if(is_array($jsFiles)){
        foreach($jsFiles as $key => $val)
        {
            $this->view->headScript()->appendFile($this->view->baseUrl('js/'.$val));
        }
    }

}

そして、私のレイアウトには次のものがあります。

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

問題は、js ファイルを追加しないことです。
エコーを前に置くと:

echo $this->view->headScript()->appendFile($this->view->baseUrl('js/'.$val));

また

<?php echo $this->loadJs(); ?>

次に、スクリプトは同じファイルを数回追加します。
誰かが私が間違っていることを教えてくれますか?

4

1 に答える 1

0

これを試してみてください(コメントは変更を示しています):
[編集]
わかりました、私はそれを手に入れたと思います。このヘルパーを使用してheadscript()スタックを埋めるには、結果をビューレンダラーに登録する必要があります。

public function loadJs() {
        $dir =  '../public/js';
        $dir = scandir($dir);
        //get bootstrap
        $bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
        //get current view renderer
        $view = $bootstrap->getResource('view');
        $jsFiles = array();

        foreach ($dir as $key => $value) {
            if (!is_dir($value))
                $jsFiles[] = $value;
        }
        if (is_array($jsFiles)) {
            foreach ($jsFiles as $key => $val) {
                if (strpos($val, '.js') != FALSE) {
                    //assign file to headscript stack in the cuurent view renderer
                   $view->headScript()->appendFile($this->view->baseUrl('js/' . $val)). "\n";
                }
            }
        }
    }

これで、レイアウトにエコーするheadscript()と、これらのファイルが1回レンダリングされます。

情報のためだけに、init()私はブートストラップで自分の見解を示します

 //truncated because it's too long...
 protected function _initView()
    {
        //Initialize view
        $view = new Zend_View();        
        //set doctype for default layout
        $view->doctype(Zend_Registry::get('config')->resources->view->doctype);
        //set css includes
        $view->headLink()->setStylesheet('/css/normalize.css');  
        //add javascript files
        $view->headScript()->setFile('/javascript/modernizr.js'); 
        //add it to the view renderer
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
                'ViewRenderer');
        $viewRenderer->setView($view);
        //Return it, so that it can be stored by the bootstrap
        return $view;
    }

次に、次のようなレイアウトでヘルパーを使用しました。

<?php echo $this->doctype() . "\n" ?>
<?php $this->LoadJs()  ?>
<html>
    <head>
        <?php echo $this->headTitle() . "\n"; ?>
        <?php echo $this->headMeta() . "\n"; ?>
        <?php echo $this->headLink() . "\n" ?>
        <?php echo $this->headscript() . "\n" ?>

        <!--[if IE]><script type="text/javascript" src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
    </head>

このようにLoadJs()すると、直接何もレンダリングされません。代わりに、メソッドはファイルをheadscript()プレースホルダーにダンプするだけです。

私の結果:

<script type="text/javascript" src="/javascript/modernizr.js"></script> <!--added by bootstrap -->
<script type="text/javascript" src="/javascript/mediaelement/build/jquery.js"></script> <!-- added by bootstrap -->
<script type="text/javascript" src="http://schoenwolf.local/javascript/modernizr.js"> </script><!-- added by LoadJs -->

それがあなたにも役立つことを願っています。

于 2012-09-14T07:39:08.010 に答える