web-dev-qa-db-ja.com

Ajaxを使用したカスタムコンポーネントのサーバー側検証の推奨される方法

私はカスタムコンポーネントを開発しており、コントローラーを介してさまざまなタスクを呼び出すために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;
    }
6
Sahil Purav

前述のとおり、ビジネスロジックに条件を導入せずにエラーを管理することをお勧めします。

例外をスローして、それらをJsonにエンコードできる(そしてリダイレクトを回避する)最高レベルでキャッチすることができます。

ヒント:厄介な点の1つは、アプリを閉じたとしても、どの拡張機能でもJsonデータ出力(Jomsocial)にHTMLを追加する可能性があります。トリック、有効なJson出力をカスタムタグでラップして、テキストから$ .ajax内に「抽出」できます。

4
Anibal