Joomla APIメソッドを使用してフォームデータを保存する方法を見つけようとしています。 ajax呼び出しでデータを保存しようとしています。最初に、コンポーネントの標準のsaveメソッドを呼び出してみました。
_index.php?option=com_whatever&view=wdata&task=save // ...etc
_
これはある程度機能しますが、通話が実際に機能したことを確認する方法が見つかりません。
今、私はjoomla 3.3の新しい非常に素晴らしいajaxプラグインのモデル関数を使用しようとしていますが、どのアプローチが適切かわかりません。私はこのようなことをすることができます:
_function onAjaxSaveWData(){
if(!JSession::checkToken()) return 0; // checking the token
$in=JFactory::getApplication->input;
$data=$in->get('jform',array(),'ARRAY'); //this is unfiltered input?!
JLoader::register('WhateverModelWData', $whatevermodelpath);
$model = new WhateverModelWData();
$model->save($data);
}
_
このアプローチの唯一の問題は、機能していないことです。保存機能はエラーで失敗します。
1064行目のlibraries/legacy/model/admin.phpの非オブジェクトに対するメンバー関数getKeyName()の呼び出し
これが機能しないことに加えて、挿入前にデータをフィルタリングしていません。
私は$model->validate($model->getForm(), $data)
がうまくいくと思いますが、$model->getForm()
も無残に失敗するので、行き詰まっています。誰かが私を助けてくれますか?
最初に、コントローラーメソッドsave()を使用するのが最善だと考えました。これは、最終的に次のように機能します。
$path = JPATH_ADMINISTRATOR . '/components/com_anycomponent;
JLoader::register('AnycomponentControllerAnyController', $path . '/controllers/anycontroller.php');
$controller = AnycomponentControllerAnyController::getInstance('Anycomponent');
$controller->addModelPath($path . '/models', 'Anycomponent');
JTable::addIncludePath($path . '/tables');
JForm::addFormPath($path . '/models/forms');
$ret = $controller->save();
そのため、コンポーネントの外部からコントローラーを呼び出す場合は、必要なすべてのパスを指定する必要があります。これは、コントローラーがJControllerFormを拡張する場合に適用されます。これは、現在joomlaのレガシーフォルダーにありますが、joomlaコア全体で使用されます。フロントエンド-コントローラーの場合、これらもJControllerFormを拡張しない限り、それほどスムーズに動作しない可能性があります。
このようにsaveを呼び出すと、必要なすべてのチェックが行われているようです。データの検証、アクセスのチェックなどです。
挿入されたIDをコントローラーから取得する最良の方法はまだわかりません。save()関数は、関数呼び出しの成功に応じてtrueまたはfalseを返すだけです。
上記と同じメソッドを使用してmodel -save()(上記の質問で私の提案)を呼び出し、必要なパスを最初に追加することができます。これはより柔軟にできますが、その場合はデータ検証チェックとアクセスチェックを自分で実行する必要があります。 controller-save()を呼び出すと、これらの問題に対処できます。
この件に関する詳細情報がある場合は、この回答を自由に修正または拡張してください。
編集:このメソッドを使用して既存のデータを保存する場合は、次のようにidパラメータをURLに追加する必要があります。
index.php?option=com_whatever&view=wdata&task=save&id=20
// where 20 is the id you are editing
IDがフォームのフィールドにのみある場合、これは無視され、レコードは新しいレコードとして追加されます。