0

すべてのページで呼び出される要素がありuserbarます-ユーザーがログインしているかどうかをユーザーに伝えます。この要素を作成し、default.ctp にエコーしました。

<?php echo $this->element('userbar', array('text' => 'You are not logged in.')); ?>

これで、すべてのページに表示されます。ただし、このテキストを変更する方法がどこにも見つかりません。たとえば、コントローラーからこの要素にアクセスして変更したいとします。どのように?

4

2 に答える 2

1

ビュー変数を設定してから、それを使用します。

<?php
class MyController extends AppController
{
    function myaction () {
        $this->set ('my_var', 'You are not logged in');
    }
}
?>

そして、ビューで:

<?php echo $this->element ('userbar', array ('text' => $my_var)); ?>

これは、すべてのページ要求で行うことであると考えると、AppController::beforeFilter().

これを行う方法は他にもあります。ただし、コントローラーで要素をレンダリングする場合でも、ビュー変数を設定し、それをビューにエコーする必要があります。

お役に立てれば。

于 2013-01-13T09:11:55.730 に答える
1

vanneto は、この質問に非常に具体的に答えてくれました。しかし、私の意見に基づくと、ここで起こることは設計上の欠陥です。そのため、この質問へのアプローチ方法に関する別のオプションを提供するために、この回答を追加します。私はこの種の解決策を見ており、長期的には問題を引き起こすからです.

ケースは、ログインまたはログアウトしたテキストです。

Auth コンポーネントを使用するとします。

http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

コントローラーから始めます。おそらく、AppController には次のようなものがあります。

public function beforeFilter() {
    parent::beforeFilter();
    $this->set('userIsLoggedIn', AuthComponent:: loggedIn());
    $this->set('loggedInUser', AuthComponent::user());
}

これが何をするか: リクエストごとに、ログインしているユーザーをビューに送信します。これで、どのテキストを送信する必要があるかを検出する if ステートメントをコントローラーに含めることができると言えますが、実際には必要ではありません。

あなたの要素では、それもできます。

したがって、要素に次のようなものを入れます:

if($userIsLoggedIn) {
    echo 'User is logged in.';
}else{
    echo 'You are not logged in!';
}

一般に、この種のロジックを実装するために、もう少しヘルパーに移行します。これは、適切にスタイルされたコーディングのためのより多くのオプションを持つクラスであるためです。しかし、要素を使用するだけでも実行できます。

これで、テキストが正しくなりました。次に、ポイントに到達します: 静的テキストは要素に属していますか? いいえ、違います。したがって、それを改善するのは、次のように実装することです。

if($userIsLoggedIn) {
    echo __('User is logged in');
}else{
    echo __('User is not logged in');
}

そうすれば、静的テキストを .po ファイルに入れることができます。それらが何であるかわからない場合:

http://book.cakephp.org/2.0/en/core-libraries/internationalization-and-localization.html

たとえば、サイトが多言語化された場合にも、この要素を使用できるようになりました。または、ソース コードに触れずにテキスト ライターにテキストを編集させることもできます。

ご覧のとおり、これは別のアプローチですが、より明確なコードが得られると思います。コードを分離し、コントローラーがタスクを実行し、要素がタスクを実行し、ビューにハードコーディングされていないため、テキストも分離されます。

コードに関してはそれほど多くはないので、このような解決策を強くお勧めします。ヘルパーで行うこともできます。

この種のアプローチに関するいくつかの情報源:

http://en.wikipedia.org/wiki/Object-directional_programming#Decoupling

http://en.wikipedia.org/wiki/Single_responsibility_principle

于 2013-01-13T11:53:17.567 に答える