特定のプロパティが特定の値であるすべてのモデルの名前を取得できるようにしたいと考えています。
理想的には、AppModel にプロパティを配置し、それを継承して他のすべてのモデルに設定し、どこからでも簡単にアクセスできるようにしたいと考えています。これが私のアイデアの要点です:
グループ化するすべてのモデルでこれをtrueに設定します。
class AppModel extends Model {
public $hasPortal = false;
}
次に、この関数を AppController に追加します。
class AppController extends Controller {
public $components = array('DebugKit.Toolbar');
static function getPortals() {
$portalModels = array();
$models = App::objects('Model');
foreach( $models as $model ) {
if ( !class_exists($model) ) {
$m = ClassRegistry::init($model);
if ( $m->hasPortal ) {
$portalModels[] = $model;
}
}
}
return $portalModels;
}
}
だから私はこれを行うことができます:$portals = AppController::getPortals()
どこにいても — そして今のところ (私が 20 を超えるクラスを持っているとき!) 十分に機能しますが、愚かなほど非効率的であると確信しています。メニューを生成するために、モデルのコレクション (理想的にはコントローラーと関数でさえ) をその場でグループ化できるようにしたいと考えています。しかし、私は OOP にはまったく無頓着で、これが必要な機能を実現するための最も効率的な方法ではないのではないかと疑っています。
読む前にコメントを参照してください。特定のコンテキストを説明するリクエストに対処しています
このアプローチが理にかなっているという確信はまったくありません。
実際に実装しようとしているのは、 で自動的に作成されるメニューですhome.ctp
。上記のコードを使用すると、次のようになりますhome.ctp
。
$portaledModels = AppController::getPortals();
foreach ($portaledModels as $model) {
echo $this->element('modelPortal', array('model' => $model) );
}
(ただし、最終的に $model は、説明、アイコン リンクなどを保持する配列になります。)
ケーキアプリのデフォルトの「ホーム」ページで、多くのモデルのさまざまなアクションにナビゲートする手段が本当に欲しいのですが、すべてではありません (つまりentries/index
、 とauthors/index
は明らかな選択肢ですが、entries_authors
は値がありません)。ユーザーに)。
したがって、この場合、アクセス可能にする必要があるモデルの nav インターフェイスを返す要素を作成したいと思います (これは ACL リストの代わりではありません。セキュリティのためにこれを使用するつもりはありません。 home.ctp の内容)。
そのようなモデルのリストを手動で作成し、必要に応じて更新するのは簡単です。ただし、一般的には、プログラムで利用できるものを手で書くことはしないようにしています。models
モデル、基本的にはアプリの内容のレジストリを作成requestAction()
し、同じ効果を得ることができると思いました。しかし、その後、各モデルが呼び出されたときに自動的に登録する方法を考えて迷いましたが、最初だけですか? これはおそらく、私がアマチュア開発者であることを皆さんに再確認する良い機会です、ハハハ。:)