2011-10-30 11 views
2

私は現在CakePHPの初心者で、CakePHP 1.3で遊んでいましたが、最近CakePHP 2.0がリリースされました。CakePHP 2.0オブジェクトではない配列

これまでのところ、私はそれが好きですが、唯一の問題はオブジェクトを返さないという事実です。むしろ配列を返すだけです。つまり、$ post ['Post'] ['id']をしなければならないということはほとんど意味がありません。私の意見では、post-> idを$するのははるかに現実的です。

Googleの後、私はthisリンクを見つけましたが、これはFormクラスを使用しているときに定義されていないインデックスに関するエラーを発生させ続けました(これは配列バージョンではなくオブジェクト化されたバージョンを取得したためです)。私はブログのチュートリアル(すでに1.3の下でそれを踏襲しているが、2.0のために、再びその上に行く)

を、次の午前

、誰もがそれはFormクラスに干渉することなく、これを達成する方法を知っていますか?

ホーク

答えて

2

追加のオブジェクト変数を作成することができます。こうすることで、Cakeのオートマティックに干渉することなく、$ modelNameObj-> idのような形式でデータにアクセスすることができます。フォーマット。

まず、まだ/ app/ControllerにAppController.phpを作成していない場合は作成します。その後、beforeRender()関数を作成します。これは、Cakeの標準命名規則でデータを探し、そこから追加のオブジェクト変数を作成します。

$productsObj; 

view.ctp

$productObj->id; 

index.ctp

私たちは「ALL:

<?php 
App::uses('Controller', 'Controller'); 

class AppController extends Controller { 

    public function beforeRender() { 

    parent::beforeRender(); 

    // camelcase plural of current model 
    $plural = lcfirst(Inflector::pluralize($this->modelClass)); 

    // create a new object 
    if (!empty($this->viewVars[$plural])) {  
     $objects = Set::map($this->viewVars[$plural]); 
     $this->set($plural . 'Obj', $objects);  
    } 

    // camelcase singular of current model 
    $singular = lcfirst(Inflector::singularize($this->modelClass));  

    // create new object 
    if (!empty($this->viewVars[$singular])) {  
     $object = Set::map($this->viewVars[$singular]); 
     $this->set($singular . 'Obj', $object); 
    } 
    } 
} 

は、その後、あなたの意見では、あなたはそうのようなオブジェクトにアクセスすることができますもう一度Objを追加するo Cakeがすでに提供している変数名。いくつかの例のマッピング:

製品の展示 - >$ productsObj

でProductType - >$ productTypesObj

私は、これは完璧ではない知っているが、それは基本的にあなたが望んで達成するであろうと、すべてにわたって利用可能となりますあなたのモデルの

+0

これは機能しました!ありがとう!あなたが言ったように完璧ではないかもしれませんが、何とかそれが必要なら、この方法で配列とオブジェクトバージョンの両方にアクセスできます!ありがとう –

0

私はこの質問を、私の頭の中の時間のカップルでも実行しました。今ではいくつかのCakeベースのアプリケーションで、オブジェクトを使うよりも配列を使って便利に結果セットを分岐してマージ(am、in_arrayなど)できるという利点があります。 $ Post-> id形式は、構文上の甘い砂糖になりますが、配列に比べて本当の利点はありません。

+0

あなたのご意見をお待ちしていますが、それは本当に私の質問に答えません。/ –

+0

私はあなたが間違っていることを指摘しておきたいと思います。連想配列は移動する方法です。 – sibidiba

0

公共のプロパティを繰り返し処理して(ReflectionClass::getProperties参照)、それを配列に保存して配列を返す関数を書くことができます。

クラスにアクセスできる場合はArrayAccess Interfaceを実装し、オブジェクトとして配列に簡単にアクセスできます。

PS:申し訳ありませんが、私は、CakePHPを使用したことがありませんが、私は、私はMOZは、既存の数がある提案のアイデアを気に入っている間、オブジェクトツー配列の変換は、フレームワークの特定の問題

2

である必要はありませんだと思いますこの問題の解決策。

私が見つけた最も速いものはhttps://github.com/kanshin/CakeEntityですが、2.xでリファクタリングする必要があるかもしれません。すでに2.xの分岐やフォークがあるかもしれませんが、私は見ていませんでした。

+0

2があります。0ブランチは、ファイル名のCakePHP 2.0規約で更新されました。 – brism

3

ほとんど知られていない事実:ケーキは、それらをオブジェクトとして、あるいはオブジェクトのうまくプロパティとして返します。アレイは構文糖である:

// In your View: 
    debug($this->viewVars); 

Shwoing $thisviewVarsコントローラのアクションから$this->set('key', $variable)又は$this->set(compact('data', 'for', 'view'))に対応する表示オブジェクトとあります。

キーストロークのためにそれらを押しつぶして問題が発生するのは、ケーキです。なぜなら、キーストロークのために$Post->idにそれらを押しつぶすことに問題があります。 Cakeは重いリフターになるように設計されているため、組み込みのORMは非常に強力で、やむを得ず、無限に関連する無限列のテーブル(自動コールバック、自動データの受け渡し、クエリの生成など)を扱うことを意図しています。多次元配列のベース深度は、あなたのfindメソッドでは、複数の関連モデル(例えば)を持つ複数の$ Postを扱うとすぐに、配列をミックスに導入しました。それを回避するだけです。

異なるfindメソッドは、異なる深度の配列を返します。デフォルトで生成されたコントローラコードから、$this->set('posts', $this->paginate()); - 使用するビューは$this->set('post', $this->Post->read(null, $id));を使用し、編集は$this->setを使用しないと、投稿はまったく見つかりません - $this->data = $this->Post->read(null, $id);を割り当てます。

FWIW、Set::mapはおそらく、おそらく(編集した)編集アクションをマップしようとしているので、undefined indexというエラーをスローしますか?デフォルトでは、編集アクションは$this->setを使用して関連するモデル検索をビューに設定します。 $ this-> readの結果は$this->dataに送信されます。これはおそらくSet :: mapが失敗している理由です。いずれにせよ、あなたはまだ$Post[0]->idまたは$Post->id(使用した方法を見つける方法に応じて)を目指すことになりますが、これはあまり改善されません。

は、ここでこれらのアクションの設定::マップ()プロパティの深さのいくつかの一般的な例です:

// In posts/index.ctp 
    $Post = Set::map($posts); 
    debug($Post); 
    debug($Post[0]->id); 

    // In posts/edit/1 
    debug($this-viewVars); 
    debug($this->data); 

    // In posts/view/1 
    debug($this-viewVars); 
    $Post = Set::map($post); 
    debug($Post->id); 

http://api13.cakephp.org/class/controller#method-Controllerset

http://api13.cakephp.org/class/model#method-Modelread

http://api13.cakephp.org/class/model#method-ModelsaveAll

HTH。

関連する問題