私はカスタムコンポーネントを開発しており、コントローラーを介してさまざまなタスクを呼び出すためにAjaxを使用しています。
ユーザーがデータベーストランザクションの前に検証する必要があるデータを入力する1つのフォームがあります。データベースとのやり取りにJTableを使用しています。
サーバー側の検証には2つの方法があります。
1)JModelFormを拡張してModelを使用し、コントローラのJResponseJSonオブジェクトにメッセージを返すことができるそのフォームのvalidate()メソッドをオーバーライドします。
2)データベースに保存する前にデータをチェックする(そしてJResponseJsonオブジェクトにメッセージを返す)JTableのcheck()メソッドをオーバーライドします。
上記のどちらの方法でも、サーバー側でデータが検証されます。私の質問は、JResponseJsonオブジェクトを使用してAJAXの方法でアプリケーションを処理していることを考えると、上記の2つのうちの最良の方法は何ですか?.
これが私のコントローラコードです:
/**
* Overrided Method to save a record.
*
* @return boolean True if successful, false otherwise.
*
* @since 12.2
*/
public function save()
{
// Check for request forgeries.
JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
$app = JFactory::getApplication();
$model = $this->getModel();
$helpdesk = $model->getTable();
$data = $this->input->post->get('jform', array(), 'array');
$key = $helpdesk->getKeyName();
$recordId = $this->input->getInt($key);
// Populate the row id from the session.
$data[$key] = $recordId;
// Access check.
if (!$this->allowSave($data, $key))
{
$this->setRedirect(JRoute::_('index.php?option=' . $this->option . '&view=' . $this->view_list . $this->getRedirectToItemAppend()), JText::_('COM_HELPDESK_SAVE_ACCESS_ERROR'), 'warning');
return FALSE;
}
$response = $model->save($data);
// Attempt to save the data.
if ($response === false)
{
echo new JResponseJson($response, NULL, true);
$app->close();
}
$this->postSaveHook($model, $data);
if ($model->getState('request.new') == '1')
{
$recordId = (int) $model->getState('request.id');
// Set Success Message for New Request.
echo new JResponseJson(NULL, JText::sprintf('COM_HELPDESK_REQUEST_NEW_SAVE_SUCCESS', $recordId));
$app->close();
}
else
{
// Set Success Message for Existing Request.
echo new JResponseJson(NULL, JText::sprintf('COM_HELPDESK_REQUEST_EDIT_SAVE_SUCCESS', $recordId));
$app->close();
}
}
これが私のJTableのチェックメソッドコードです。
/**
* Overloaded check function
*
* @return boolean True on success, false on failure
*
* @see JTable::check
* @since 1.5
*/
public function check()
{
$app = JFactory::getApplication();
$type = 'error';
$flag = true;
if (trim($this->subject) == '')
{
$app->enqueueMessage(JText::_('COM_HELPDESK_SUBJECT_ERROR'), $type);
$flag = false;
}
if (trim($this->description) == '')
{
$app->enqueueMessage(JText::_('COM_HELPDESK_DESCRIPTION_ERROR'), $type);
$flag = false;
}
if ($this->priority == 0)
{
$app->enqueueMessage(JText::_('COM_HELPDESK_PRIORITY_ERROR'), $type);
$flag = false;
}
return $flag;
}
前述のとおり、ビジネスロジックに条件を導入せずにエラーを管理することをお勧めします。
例外をスローして、それらをJsonにエンコードできる(そしてリダイレクトを回避する)最高レベルでキャッチすることができます。
ヒント:厄介な点の1つは、アプリを閉じたとしても、どの拡張機能でもJsonデータ出力(Jomsocial)にHTMLを追加する可能性があります。トリック、有効なJson出力をカスタムタグでラップして、テキストから$ .ajax内に「抽出」できます。