3

私はPHPでWebサイトを開発していますが、PHPフレームワークの経験を積みたいので、mvcフレームワークを使用してこれを実行したいと思います。

Zend、CakePHP、CodeIgniterを見てきましたが、これを実現するための直感的な方法を見つけることができませんでした。

私がする必要があるのは、たとえば次のようなレイアウトを作成することです。

<html>
<head>
<!--scripts go here-->
</head>
<body>
<div id='banner'></div>
<div id='menu'><?php $this->layout()->menu ?></div>
<div id='container'><?php $this->layout()->content ?></div>
<div id='ads'><?php $this->layout()->ads ?>
<div id='footer'>blah</div>
</body>
</html>

私の観点からすると、これは簡単に実行できるはずなので、多くのハックなしでこれを簡単に実行できるフレームワークを探しています。

これにより、メニュー、コンテンツ、および広告が別々のコントローラーとビューから取得され、もちろん動的コンテンツになります。メニューコードをすべてのビューに配置したくありません...

たぶんこれは単純で、私はそれを間違った方法で行っているのでしょうか?

どんな助けでも大歓迎です。

ありがとう、-
ベン

4

10 に答える 10

2

symfony は、さまざまな概念を組み合わせて、あなたが探していることを実行できます。

  • レイアウト - これは、ページを装飾するために使用される主要な構造です。
  • テンプレート - これは、コントローラーによって URL にアタッチされたメイン ビューです。
  • Fragments - 軽量で、渡されたデータを使用します。
  • コンポーネント - モデルへのアクセスが必要な場合に使用されます。コードはプレゼンテーションとロジックに分割されています。
  • スロット - レイアウトの定義されたセクションを置き換えるために使用されます。

あなたの場合、レイアウトには、ビューレイヤーのコアであるテンプレートロジックを使用してメインコンテンツが含まれ、他のアイテムは、アクセスする必要があるモデルの量に応じてフラグメントまたはコンポーネントになります。

Symfonyのドキュメントには、これに関する完全な説明があります。

于 2009-07-25T09:43:47.360 に答える
2

実際、ここで達成したいことは、Zend Framework を使用して、既に持っているものからほとんど逸脱することなく実行できます。

メニューには を使用できますZend_Navigation。これにより、サイトのナビゲーションのツリーを定義し、簡単なメニューを作成できます。Front Controller プラグインにZend_Navigationコンテナを設定すると、オブジェクトを簡単にキャッシュできるので、サイト ツリーをトラバースすることによるパフォーマンスの心配はほとんどありません。

広告については、プレースホルダー ビュー ヘルパーを使用するだけで、フロント コントローラー プラグインを使用してこれを設定できます。プラグインを使用すると、インプレッションのカウントと広告のローテーションのロジックがアクションから分離され、すべてのアクションでそのタスクを簡単に実行できるという利点があります。

アクション スタックを使用する Dustin.cassiday の方法は危険であり、アプリのデバッグで大きな頭痛の種になる可能性があります。Itay Moav の方法は、現在では非常に冗長になっています。Zend_Navigation

于 2009-07-28T12:18:20.810 に答える
1

あなたが言及した各PHPライブラリにはテンプレートがあり、必要なことを実行できます。

ライブラリを選び、それを理解してください。それは時間とともに報われるでしょう。Smartyのようなテンプレートエンジンは優れていますが、完全なフレームワークはさらに多くの機能を提供します。

于 2009-07-24T21:32:09.657 に答える
1

コントローラーの actionStack で可能です:

$this->_helper->actionStack('menu','index');
$this->_helper->actionStack('ads','index');
于 2010-10-14T09:49:00.670 に答える
0

Cakeでは、これを介して含めるだけの要素に入れることができます

echo $this->element('menu');

この要素は、必要に応じて複雑にすることも単純にすることもできます。ページのどのセクションにいるかを自動的に強調表示する必要がある場合は、いくつかの方法があります。たとえば、要素が取得できる各コントローラー/アクションに変数を設定します。

// Controller
$this->set('currentNode', 'homepage');

// Menu Element
if ($currentNode == 'homepage') {
    // add class 'selected' to menu item, or something like this
}

アプリケーションの複雑さに応じて、完全に自己完結型にすることもできます。

// Menu Element
if ($this->controller == 'home') {
    // highlight this menu item, add extra sub-items, re-calibrate flux capacitor
}

要点は、これを行う方法は確かにありますが、使用するフレームワークと、正確に何を達成する必要があるかによって異なります。フレームワークやテンプレート エンジンの選択は、この小さな機能に依存するべきではありません。

于 2009-07-25T02:17:50.737 に答える
0

Zend Framework (あなたが言及したものの中で私が知っているのはこれだけです) には、これを達成する方法がいくつかあります。私はヘルパーの方法を好みます。
レイアウトは次のようになります。

<html>
<head>
<!--scripts go here-->
</head>
<body>
<div id='banner'></div>
<div id='menu'><?php $this->menu() ?></div>
<div id='container'><?php $this->layout()->content ?></div>
<div id='ads'><?php $this->ads() ?>
<div id='footer'>blah</div>
</body>
</html>

そして、次の 2 つのビュー ヘルパーが作成されます。

class Zend_View_Helper_Menu{
   public function menu(){
       echo "<html.........>";
   }
}

class Zend_View_Helper_Ads{
   public function ads(){
       echo "<html.........>";
   }
}

あなたが与えた構文とまったく同じ結果になる方法もあります。この方法に慣れていない場合は、このリンクを試してください

于 2009-07-25T02:17:59.860 に答える
0

DooPHP フレームワークでは簡単 <!-- include 'templatefilename' --> です。ビュー テンプレートで使用するだけです。フレームワークのビュー部分は非常に柔軟です。サイト http://doophp.com/demosにテンプレート エンジンのデモがあります。

于 2009-07-26T10:22:35.403 に答える
0

おそらく、テンプレート エンジンほどフレームワークを探しているわけではありません。Smartyをお試しください。

于 2009-07-24T21:14:00.490 に答える
0

Smarty またはTempalte lite

于 2009-07-24T21:15:33.607 に答える
0

Zend Framework では、次のように ViewRenderer ヘルパーの responseSegment プロパティを設定することで、レイアウトの各セクションに個別のアクションとビューを作成できます。

class IndexController extends Zend_Controller_Action {

    public function menuAction() {

        //menu code goes here

        $this->_helper->viewRenderer->setResponseSegment('menu');
    }

    public function adsAction() {

        //ads code goes here

        $this->_helper->viewRenderer->setResponseSegment('ads');
    }
}

等...

次に、指定したとおりにレイアウト ファイルでそれらを呼び出すことができます。

<?= $this->layout()->menu; ?>
<?= $this->layout()->ads; ?>
于 2009-07-26T03:08:08.370 に答える