Je développe des composants personnalisés et j'utilise Ajax pour appeler diverses tâches via le contrôleur.
J'ai un formulaire, où l'utilisateur entre des données qui doivent être validées avant la transaction de base de données. J'utilise JTable pour interagir avec la base de données.
Il existe deux façons d’avoir une validation côté serveur:
1) Utilisation de Model en étendant JModelForm et en remplaçant la méthode validate () de ce formulaire qui peut renvoyer un message à l’objet JResponseJSon dans le contrôleur.
2) Ignorer la méthode check () de JTable qui vérifiera les données (et renverra les messages à l'objet JResponseJson) avant qu'il ne soit stocké dans la base de données.
Les deux méthodes ci-dessus valident les données côté serveur. Ma question serait, quelle est la meilleure façon de sortir de deux ci-dessus, étant donné que j'utilise un objet JResponseJson pour traiter mon application de manière AJAX.
Voici mon code de contrôleur:
/**
* 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();
}
}
Voici le code de ma méthode de vérification 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;
}
Comme suggéré précédemment, il est préférable de gérer les erreurs sans introduire de conditions de base dans la logique métier.
Vous pouvez simplement lancer des exceptions et les attraper au plus haut niveau, où vous pouvez encoder en Json (et éviter une redirection).
Conseil: Un aspect désagréable, même si vous fermez une application, n’importe quelle extension peut ajouter du code HTML à votre sortie de données Json, en particulier Jomsocial. Une astuce, une sortie Json valide peut être encapsulée avec un balisage personnalisé pour "l'extraire" dans $ .ajax à partir du texte.