0

私が開発中の ZF2 プロジェクトでecho $this->content;は、メイン コンテンツ領域の条件付き書式設定を許可する、layout.phtml のステートメントの周囲にシェルを作成したいと考えています。具体的には、コンテンツを 75% 幅の列に配置し、ほとんどのページで 25% 幅の列に「装飾」要素をいくつか含めたいと考えています。ただし、より多くのスペースが必要なページは 1 列に変更したいと考えています。私のプロジェクトは CMS で、各ページには属性があり、ビューまたはコントローラーにページが通常か幅かを伝えることができます。私は自分が求めているものを達成するための多くの方法を検討しました。

私の「レイアウト ビューでの条件付き書式」は次のようになります。

// module/Application/view/layout/layout.phtml:
//...

  if ($templateNormal) {
     echo "<div class='col-md-9'>";
  } else {
     echo "<div class='col-md-12'>";
  }

   echo $this->content;

  if ($templateNormal) {
     echo "</div>";
     echo "<div class='col-md-3'>";
       //... ornamentation
     echo "</div>";
  } else {
     echo "</div>";
  }

//...

上記の方法は機能する可能性がありますが、純粋な MVC の場合、レイアウト ビューで意思決定を行う必要はないと思います。

私の「部分ビューでの条件付き書式」は次のようになります。

// module/Application/view/layout/layout.phtml:
//...

  echo $this->partial('partial/open-shell.phtml');

   echo $this->content;

  echo $this->partial('partial/close-shell.phtml');

//...


// module/Application/view/partial/open-shell.phtml:
  if ($templateNormal) {
     echo "<div class='col-md-9'>";
  } else {
     echo "<div class='col-md-12'>";
  }


// module/Application/view/partial/close-shell.phtml:
  if ($templateNormal) {
     echo "</div>";
     echo "<div class='col-md-3'>";
       //... ornamentation
     echo "</div>";
  } else {
     echo "</div>";
  }

ここでは、意思決定はレイアウト ビューから取り出されますが、単純に他のビューに配置されるため、まだビュー パッケージにあり、純粋な MVC ではありません。

私の「コントローラーでの条件付き書式設定」ソリューションでは、一対の html スクリプト文字列がコントローラー関数で作成され、ビューに渡されます。次のようになります。

// module/Application/view/layout/layout.phtml:
//...

  echo $this->open-shell-script';

   echo $this->content;

  echo $this->close-shell-script';

//...


// some controller function:
  //...
  if ($templateNormal) {
     $open-shell-script = "<div class='col-md-9'>";
     $close-shell-script = "</div>";
     $close-shell-script = "<div class='col-md-3'>";
     $close-shell-script .= //... ornamentation
     $close-shell-script .= "</div>";
  } else {
     $open-shell-script = "<div class='col-md-12'>";
     $close-shell-script = "</div>";
  }
  //...

このメソッドでは、意思決定はコントローラーで行われるべきだと思いますが、そこにhtmlを書いているのは奇妙に思えます。

コメントや提案はありますか?

4

3 に答える 3

0

2 つのレイアウトを作成し、Module.php の init() メソッドで、どちらのレイアウトを使用するかを決定します。

    public function init(ModuleManager $moduleManager) {
        $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
// This event will only be fired when an ActionController under the MyModule namespace is dispatched.
            $controller = $e->getTarget(); 
                        $controller->layout(" your chose layout ");
                }
        }
于 2014-03-18T19:01:20.987 に答える
0

異なるテンプレートを設定する代わりに、必要なクラスをレイアウト変数に依存させることで、Bootstrap Twitter クラスを調整できます。次のように、コントローラー アクションのロジックを使用して、変数を (ビューではなく) レイアウトに直接渡すことができます。

$this->layout()->setVariables
        (
            array
            (
                'layoutVar1'     => 75,
                'someColClass'   => ($someSwitch ? 'col-md-9':'col-md-12' ),
                'layoutVar1'     => 75,
            )
         );

次に、ビューに変数を送信する場合と同様に、レイアウトでこれらの変数にアクセスします。「レイアウト」を前に付ける必要さえありません。衝突することはありません。

于 2014-03-18T19:34:50.960 に答える