Joomla!のViewで違う名前のModelを使う
まだまだJoomlaのコンポーネントを作成中。
JoomlaでMVCスタイルに沿ってコンポーネントを作る場合、各クラス・ファイル名をJoomla流儀の命名規則にしておかないと結構面倒。
■ViewでView名とは違う名前のModelを使いたい
admin側の機能を先に作ったんだけど、ユーザー側のコードでもadmin側で作ったmodelを使いたい。色々調べたり試行錯誤したりして、1時間くらいかかってしまった…
フォーラムのこの書き込みが結構役に立った。
■やりかた
・Controllerで使いたいModelをViewにセットする必要がある
以下、Controllerのコードの抜粋。
function foo() { //admin側のmodelsディレクトリをmodelクラスの検索パスに追加 JModel::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'models'); // viewで使いたいmodelを取得 $model =& $this->getModel('Modelname', 'Prefix'); // viewを取得し、先ほどのmodelをセットする $view =& $this->getView('foo', 'html'); // 第2引数を true にすると、このモデルがそのviewのデフォルトmodelになる $view->setModel($model, true); //この辺は普通通り。 JRequest::setVar('view', 'foo'); parent::display(); }
次にviewのコードの抜粋
function display($tpl = null) { //Get the lessons available. // 以下のようにmodelを取得可能 $model = $this->getModel('Modelname', 'Prefix'); $data = $model->getData(); //あるいは、以下のように。 $data = $this->get('Data'); }
■うまくいかない場合、こういう逃げ方もあるけど…
最悪、以下のようにviewの中でmodelを普通にインスタンス生成する汚いコードにしようかと思ったけど、何とか避けられて良かった。
require_once(JPATH_COMPONENT_ADMINISTRATOR.DS.’models’.DS.’modelname.php’);
$model=new PrefixModelname();
$data = $model->getData();