5

さて、私は自分自身にCakePHPフレームワークを教えようとしており、自分のために簡単なデモアプリをノックアップしようとしています。

コントローラー、ビュー、モデルをすべてセットアップして機能させていますが、基本的なオンラインヘルプショーよりも少しだけ多くのことをしたいと思っています。

私は次のようにguitars_controller.phpファイルを持っています...

<?php
class GuitarsController extends AppController {
    var $name = 'Guitars';
    function index() {
        $this->set('Guitars', $this->Guitar->findAll());
        $this->pageTitle = "All Guitars";
    }
    function view($id = null) {
        $this->Guitar->id = $id;
        $this->set('guitar', $this->Guitar->read());
        // Want to set the title here.
    }
}
?>

'Guitar'オブジェクトには'Name'という属性が含まれており、それを個々のページビューのpageTitleとして設定できるようにしたいと思います。

誰かが私がそれをどのように行うかを指摘できますか?

注意:この種のデータを設定するアプリケーションの場所については一般的な意見の相違があることは知っていますが、私にとってはデータに関連しています。

4

10 に答える 10

5

これらのアクションはモデルに依存しないため、 app/app_controller.php ファイルに入れることができます

<?php
class AppController extends Controller {
    function index() {
        $this->set(Inflector::variable($this->name), $this->{$this->modelClass}->findAll());
        $this->pageTitle = 'All '.Inflector::humanize($this->name);
    }
    function view($id = null) {
        $data = $this->{$this->modelClass}->findById($id);
        $this->set(Inflector::variable($this->modelClass), $data);
        $this->pageTitle = $data[$this->modelClass][$this->{$this->modelClass}->displayField];
    }
}
?>

ブラウザーで /guitars を指定すると、ギター コントローラー インデックス アクションが呼び出されますが、これは存在しないため、AppController (GuitarsController の継承元) 内のアクションが実行されます。ビューアクションも同様です。これは、DrumsController、KeyboardsController などでも機能します。

于 2008-10-11T09:37:09.380 に答える
4

これはコントローラーで設定できます。

function view($id = null) {
    $guitar = $this->Guitar->read(null, $id);
    $this->set('guitar', $guitar);
    $this->pageTitle = $guitar['Guitar']['name'];
}

またはビューで:

<? $this->pageTitle = $guitar['Guitar']['name']; ?>

ビューで設定された値は、コントローラーで既に設定されている可能性のある値をオーバーライドします。

セキュリティのため、pageTitle を表示するレイアウト/ビューで、この任意のデータを html エンコードして、インジェクション攻撃や破損した html を回避する必要があります。

<?php echo h( $title_for_layout ); ?>
于 2008-10-10T19:26:44.090 に答える
1

ooパラダイムに関するあなた自身の答えに応えて。こんな感じです :

function view($id) {
    $this->Guitar->id = $id;
    $this->Guitar->read();
    $this->pageTitle = $this->Guitar->data['Guitar']['name'];
    $this->set('data', $this->Guitar->data);
}

ところで、これは url ユーザー入力であるため、id が設定されていて有効かどうかなどを確認する必要があります。

于 2008-10-12T21:16:10.670 に答える
1

CakePHP 1.3 から、設定ページのタイトルが変更されました。

$this->pageTitle = "Title"; //deprecated

$this->set("title_for_layout",Inflector::humanize($this->name)); // new way of setting title

注: Inflector の詳細: http://api13.cakephp.org/class/inflector#method-Inflector

于 2011-07-24T04:46:19.343 に答える
0
$this->pageTitle = $this->Guitar->Name;

それはビューに入るはずです、私はPHPやcakePHPではありませんが、それはビューが行うべきことであり、コントローラーではありません。

于 2008-10-10T18:58:52.087 に答える
0

「しかし、基本的なオンライン ヘルプが示すよりも少し多くのことをしたいのです。」

それは常に摩擦ではありませんか?非常に多くのドキュメンテーションが最低限のものに向けられているため、実際にはあまり役に立ちません。利用可能なチュートリアルの多くを完了することができますが、予約から一歩外れるとすぐに混乱が始まります.まあ、それは最低限またはプロの開発者の最大のいずれかですが、簡単さ、明快さ、深さのスイートスポットに到達することはめったにありません.

私は現在、Zend Framework のドキュメントを自分で使用するために単純に書き直しています。これにより、矛盾を解消し、あいまいな仮定を明確にし、それを理解するためのコアとなる「ベスト プラクティス」の方法を理解できるようになります。私のモットー: 易しさ、明瞭さ、深さ。やさしさ、明快さ、深み。

于 2008-10-10T20:11:47.337 に答える
0

ああ、自明ではない答えは次のとおりです...

$this->pageTitle = $this->viewVars['guitar']['Guitar']['Name'];

コントローラーに次のコードを配置することでこれを見つけました(正直なところ、報われたロングショットでした)

echo "<pre>"; print_r($this);echo "</pre>";

助けようとしたすべての人に感謝します。

于 2008-10-10T20:26:25.810 に答える
0

コントローラーに入れる必要があります。これを見る

于 2008-10-10T19:21:40.917 に答える
0

OK、ビューではなくコントローラーでページタイトルを設定したいです。だからここに私がしたことがあります:

class CustomersController extends AppController {

    var $name = 'Customers';

    function beforeFilter() {
        parent::beforeFilter();
        $this->set('menu',$this->name);
        switch ($this->action) {
          case 'index':
            $this->title = 'List Customer';
            break;
          case 'view':
            $this->title = 'View Customer';
            break;
          case 'edit':
            $this->title = 'Edit Customer';
            break;
          case 'add':
            $this->title = 'Add New Customer';
            break;
          default:
            $title = 'Welcome to '.$name;
            break;
        }
        $this->set('title',$this->title);
      }

$this->titleトリックは、アクション内に設定できないことです。動作しません。Webページはレンダリング後にアクションに到達するように思えますが、beforeFilter.

于 2011-05-14T20:17:29.043 に答える
0
echo "<pre>"; print_r($this);echo "</pre>";

どうですか

pr( $this );
于 2009-03-23T07:44:20.023 に答える