it-swarm.com.de

Empfohlene Methode zur serverseitigen Validierung für benutzerdefinierte Komponenten mit Ajax

Ich entwickle eine benutzerdefinierte Komponente und benutze Ajax zum Aufrufen verschiedener Aufgaben über den Controller.

Ich habe ein Formular, in dem der Benutzer Daten eingibt, die vor der Datenbanktransaktion validiert werden sollen. Ich benutze JTable für die Interaktion mit der Datenbank.

Für die serverseitige Validierung gibt es zwei Möglichkeiten:

1) Verwenden von Model durch Erweitern von JModelForm und Überschreiben der validate () -Methode dieses Formulars, mit der Nachrichten an das JResponseJSon-Objekt im Controller zurückgegeben werden können.

2) Überschreiben der check () - Methode von JTable, die die Daten überprüft (und Nachrichten an JResponseJson Object zurückgibt), bevor sie in der Datenbank gespeichert werden.

Beide oben genannten Methoden validieren Daten auf der Serverseite. Meine Frage wäre, was der beste Weg aus den beiden oben genannten ist, wenn ich bedenke, dass ich JResponseJson-Objekt verwende, um meine Anwendung auf AJAX Weise zu behandeln.

Hier ist mein Controller-Code:

/**
 * 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();
    }
}

Hier ist der Prüfmethodencode meiner 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

Wie bereits erwähnt, ist es besser, Fehler zu verwalten, ohne Bedingungen in die Geschäftslogik einzufügen.

Sie können einfach Ausnahmen auslösen und sie auf der höchsten Ebene abfangen, wo Sie nach Json codieren können (und eine Umleitung vermeiden).

Tipp: Obwohl Sie die App schließen, kann jede Erweiterung HTML zu Ihrer Json-Datenausgabe hinzufügen, namentlich Jomsocial. Ein Trick, eine gültige Json-Ausgabe, kann mit benutzerdefinierten Tags versehen werden, um sie in $ .ajax aus Text zu "extrahieren".

4
Anibal