MVCモデルを使用してレコードをロード、変更、保存するにはどうすればよいですか?


7

グーグル後など すべてのプラグインイベントなどが行われるように、Joomlaに新しいカテゴリを追加する以下のコードに到達しました。

$basePath = JPATH_ADMINISTRATOR.'/components/com_categories';
require_once $basePath.'/models/category.php';
$catmodel = new CategoriesModelCategory(array('table_path' => $basePath.'/tables'));

$myArrayOfData = array('id'=>'0','title'='my title'...);
$catmodel->save($myArrayOfData);

現状では、同じコードを使用してレコードを更新していますが、追加するデータ配列の新しいコピーの代わりに、SQLを使用して既存のレコードを配列として取得し、同じ方法で変更して保存しています。

これは「機能」しますが、正しい方法とは思えないため、CategoryのIDを使用してモデルをロードし、そのメソッドを使用して変更/保存する方法に興味があります。私は、Category Componentが実行するときに実行されるコードを試してみましたが、それがどのように行われるかを詳しく説明するには、あまりにも多くのことが起こっています。

回答:


3

$ idに保存されているカテゴリIDがあるとします。以前と同じように、カテゴリモデルをインスタンス化できます。

$basePath = JPATH_ADMINISTRATOR . '/components/com_categories';
require_once $basePath . '/models/category.php';
$catModel = new CategoriesModelCategory(array('table_path' => $basePath . '/tables'));
$id = 11;

これで2つの方法があります。

方法1-JTableオブジェクトなし

$item = $catModel->getItem($id);
$catModel->save('id' => $id, 'parent_id' => $item->parent_id, 'title' => 'My New Title'); // parent_id should be defined otherwise a warning will be displayed

方法2-JTableオブジェクトを使用

$catTable = $catModel->getTable();
$catTable->load($id);
$catTable->title = 'My New Title';

$catTable->check();
$catTable->store();

注意

最初のメソッドでのみonContentBeforeSaveonContentAfterSaveイベントが発生します。


ああ...テーブルをロードしています......事実の後でいつも明らかです、笑...
GDP

このコードで非オブジェクトエラーが発生します。質問を更新して、場所を示す回答を組み込みました。
GDP

@GDP、私は私の答えを変更しました。確認して結果を教えてください。
Farahmand 2014年

エラーCategoriesTableCategory::bind(*NULL*)が発生しますが、変更した答えは、探しているモデルではなくjTableを使用しています。これにより、onContentAfterSaveなどのプラグインイベントが発生しますか?
GDP

@GDP、私は自分の回答を編集しましたが、現在は機能しています。このsaveメソッドは、フォームをデータにバインドするために使用されます。checkstoreメソッドに置き換えました。これで、テーブルがモデルから呼び出されるため、カテゴリモデルも手に入ります。
Farahmand 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.