1

私が取り組んでいたこのクラスがあり、次のようなアセットの配列を作成できます。

array(
    'css' => array(
        array('name' => 'bla'),
        array('name' => 'bla2')
    ),
    'js' => array(
        array('name' => 'bla.js'),
        array('name' => 'bla2.js')
    )    
);

次に、このクラスはこれらを解析してレンダリングします。次のようにします。

$assets = new AssetLoader(array(
    'css' => array(
        array('name' => 'bla'),
        array('name' => 'bla2')
    ),
    'js' => array(
        array('name' => 'bla.js'),
        array('name' => 'bla2.js')
    )    
));

$assets->renderAssets();

アプリケーションの header.php でこれを行うと仮定すると、2 つの css ファイルと 2 つの js ファイルが作成されます。

新しいアセットを作成する場合は、次のようにします。

$assets->createAssets('css', array('name' => 'bla3'));

createAssets の問題は次のとおりです。

  1. bla3実際には、新しい css アセットを作成するように指示しているときに、js アセットと css アセットの両方としてアセット を作成します。
  2. これは問題であるABOVE しか実行できませんrenderAssets();。アプリケーションのどこでも実行できるはずなので、名前は次のとおりです。createAssets()

これは私のクラスです:

<?php
class AssetLoader {

    private $assets;

    private $cssAssets;

    private $jsAssets;

    public function __construct(array $assets){
        $this->assets = $assets;
        $this->seperateAssets($this->assets);
    }

    public function renderAssets(){
        $this->renderCss();
        $this->renderJs();
    }

    public function createAssets($type, array $assets){
        if(isset($this->assets[$type])){
            array_push($this->assets[$type], $assets);
            $this->seperateAssets($this->assets);

        }
    }

    protected function renderCss(){
       foreach($this->processCss() as $css){
           echo $css;
       }
    }

    protected function renderJs(){
        foreach($this->processJs() as $js){
            echo $js;
        }
    } 

    protected function processCss(){
        $html = array();
        foreach($this->cssAssets as $assetName){
            foreach($assetName as $name=>$location){
                $html[] = '<link rel="stylesheet" type="text/css" name="'.$name.'" href="'.$location.'" />';
            }
        }

        return $html;
    }

    protected function processJs(){
        $html = array();
        foreach($this->cssAssets as $assetName){
            foreach($assetName as $name=>$location){
                $html[] = '<script type="text/javascript" name="'.$name.'" src="'.$location.'"></script>';
            }
        }

        return $html;
    }

    private function seperateAssets(array $assets){
        $this->seperateCss($assets);
        $this->seperateJs($assets);
    } 

    private function seperateCss($assets){
        foreach($assets as $key=>$value){
            if($key == 'css'){
                $this->cssAssets = $value; 
            }
        } 
    }

    private function seperateJs($assets){
        foreach($assets as $key=>$value){
            if($key == 'js'){
                $this->jsAssets = $value;
            }
        }
    }
}

A)ヘッダーで呼び出されるcreateAsset()への呼び出しの前ではなく、アプリケーションの任意の場所にアセットを作成するには、どのような変更を加える必要がありますか。renderAssets()B) 作成したアセットを定義したタイプに追加する場合、上の例では、css 用の新しいアセットを作成していることがわかります。このアセットが css と js の両方にどのように追加されるか。

4

1 に答える 1

2

processJs()メソッドで、これを変更します。

foreach($this->cssAssets as $assetName){

これに:

foreach($this->jsAssets as $assetName){
于 2013-09-26T16:30:50.307 に答える