web-dev-qa-db-fra.com

Recharger le formulaire d'administration après l'enregistrement dans la base de données

Dans un composant personnalisé, l'utilisateur dans la vue d'édition d'un élément doit pouvoir charger un champ dans le champ de l'éditeur via modal et ajax.

Le cas est que l'utilisateur peut remplir un champ d'édition à partir d'un modèle de texte afin d'éviter d'écrire ou de copier/coller un tas de html.

Le problème est que lorsque je définit le contenu de l'éditeur avec javascript, le champ de l'éditeur ne change pas sa valeur. J'ai commenté en tant que // ne fonctionne pas dans le code.

Ainsi, lorsque je sélectionne la valeur dans le modal, j'appelle une fonction javascript et enregistre le contenu du champ dans la base de données.

Le nouveau problème est que je dois maintenant actualiser la page ou le champ pour obtenir les nouvelles données de la base de données vers le formulaire.

En cherchant j'ai trouvé un morceau de code qui suppose de le faire en utilisant set-> redirect mais cela ne fonctionne pas. J'ai également essayé d'appeler override et d'appeler la fonction de sauvegarde parrent :: save () avec les nouvelles données, mais cela n'a pas fonctionné également. Je ne peux pas comprendre comment le faire fonctionner. Je suis donc ouvert à toute suggestion ou à tout autre moyen que je devrais essayer.

Voici mon code:

Les appels ajax dans le modèle de modification: views/contract/tmpl/edit.php

<script type = text/javascript>
  function loadTemplate(tId, title) {
    jQuery.ajax({
      method: "POST",
      cache: false,
      url: 'index.php?option=com_contract&task=template.getTemplate&id=' + tId,
      data: {id: tId}
    }).success(function (response) {
      var data = JSON.parse(response);
      var tmplText = data.template_text;
      jQuery("#templText").val(""); //Not working
      jQuery("#templText").val(tmplText); //Not working
      saveTemplate();
    }).error(function(error) {
      console.log('Error : ');
    });
  }

  function saveTemplate() {
    jQuery.ajax({
      method: "POST",
      cache: false,
      url: 'index.php?option=com_contract&task=contract.saveContractText&id=<?php echo $this->item->id?>',
      data: jQuery("#tmplForm input").serialize()
    }).success(function (response) {

    }).error(function(error) {
      alert(error);
    });
  }
</script>

Le contrôleur de template: controllers/template.php

class ContractControllerTemplate extends JControllerForm {

  public function getTemplate() {
    $id = $_POST['id'];

    try {
      $db = JFactory::getDbo();
      $query = $db->getQuery(true);
      $query->select('id, template_text')
              ->from('#__contract_templates')
              ->where('id = ' . $id);
      $db->setQuery($query);

      $results = $db->loadObjectList();
    } catch (Exception $e) {
      $msg = $e->getMessage();
      JLog::add('Error msg : ' . $msg, JLog::DEBUG, 'getTemplate_controller');
      JFactory::getApplication()->enqueueMessage($msg, 'error');
      echo $msg;
    }

    echo json_encode($results[0]);
    die();
  }
}

Et enfin le contrôleur de contrat avec la fonction de sauvegarde et la redirection. controllers/contract.php

class ContractControllerContract extends JControllerForm {

  public function saveContractText() {
    JSession::checkToken() or die('Invalid Token');

    $app = JFactory::getApplication();
    $lang = JFactory::getLanguage();
    $model = $this->getModel();
    $table = $model->getTable();
    $data = $this->input->post->get('jform', array(), 'array');
    $checkin = property_exists($table, 'checked_out');
    $context = "$this->option.edit.$this->context";
    $task = $this->getTask();

    if (empty($key)) {
      $key = $table->getKeyName();
    }

    if (empty($urlVar)) {
      $urlVar = $key;
    }
    $recordId = $this->input->getInt($urlVar);
    // Populate the row id from the session.
    $data[$key] = $recordId;

    $data['id'] = $_POST['itemId'];
    $data['contract_text'] = $_POST['templText'];

    $db = JFactory::getDbo();

    $query = $db->getQuery(true);
    $field = $db->quoteName('contract_text') . ' = ' . $db->quote($data['contract_text']);
    $condition = $db->quoteName('id') . ' = ' . $data['id'];
    $query->update($db->quoteName('#__contract_contracts'))->set($field)->where($condition);
    $db->setQuery($query);
    $result = $db->execute();

    $app->setUserState($context . '.data', $data);
    $this->setRedirect(
            JRoute::_(
                    'index.php?option=' . $this->option . '&view=' . $this->view_item
                    . $this->getRedirectToItemAppend($recordId, $urlVar), false
            )
    );

    return false;
  }

}

Merci

2
mixahlos

Lorsque vous enregistrez le modèle avec l'appel JavaScript saveTemplate(), vous envoyez un appel Ajax au serveur. Cet appel Ajax est celui qui est redirigé avec une redirection HTTP. Vous ignorez la réponse du serveur. Si vous l'avez cochée, il s'agirait du contenu de la page vers laquelle vous essayez de vous rediriger.

Pour émettre une redirection après l'appel Ajax, vous devez le faire dans la fonction JavaScript avec window.location.href='[URL]'.

Dans saveTemplate ():

}).success(function (response) {

  window.location.href='[URL]';

}).error(function(error) {
3
Javatasse