Enregistrement d'un formulaire en base de données

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] Enregistrement d'un formulaire en base de données

    Bonjour,

    Je suis en train de créer mon 1er composant sous Joomla.
    En suivant des tutos et autres docs, j'ai réalisé un formulaire pour enregistrer les données en base de données.
    Mais rien n'apparait en base de données. Le lien est fait puisque j'ai une vue qui m'affiche des données et c'est OK.
    L'ajout ne se fait donc pas. Mais je ne vois aucune erreur (du moins en front). Est ce qu'il y a un endroit où je pourrais trouver des logs ? avec éventuellement des erreurs ?

    Ca me semble pourtant tout simple ce que je souhaite faire mais je me galère :-(

    Merci d'avance pour votre aide.
    Dernière édition par Niella79 à 24/07/2019, 16h18

  • #2
    Salut

    Quelle ligne PHP tu utilises pour faire ton bouton submit?
    Passes tu par le controller?

    Parce que la, avec une info, du style ca marche pas, difficile de t'aider.

    ++
    Wis

    Commentaire


    • #3
      Bonjour,

      Je vais effectivement détailler mon problème qui a avancé depuis dans la mesure où j'ai une erreur qui apparaît Call to a member function getColumnAlias() on boolean
      lors du submit du formulaire.

      Voilà mes différents éléments :

      /views/calculatrice/view.html.php

      Code:
      <?php
      defined('_JEXEC') or die;
      
      class HiitchroiViewCalculatrice extends JViewLegacy
      {
        public function display($tpl = null)
        {
      
          //$this->state = $this->get('State');
          $item = $this->get('Item');
          $this->item = &$item;
          $this->form = $this->get('Form');    
      
          $this->return_page = $this->get('ReturnPage');
      
          if(!empty($item)){
            $this->form->bind($item);
          }
      
          if(count($errors = $this->get('Errors'))){
            JError::raiseWarning(500, implode("\n", $errors));
            return false;
          }
      
          JFactory::getLanguage()->load('joomla', JPATH_ADMINISTRATOR);
      
          parent::display($tpl);
      
        }
      }
      /views/calculatrice/tmpl/default.php

      Code:
      <?php
      defined('_JEXEC') or die;
      
      JHtml::_('behavior.formvalidation');
      
      $language = JFactory::getLanguage();
      $ltag = $language->getTag();
      $language->load('com_hiitchroi', JPATH_ADMINISTRATOR, $ltag, true);
      
      
      ?>
      
      <script type="text/javascript">
          Joomla.submitbutton = function(task)
          {
              if(task == 'item.cancel' || document.formvalidator.isValid(document.id('hiitchroi-item-form'))){
      
                  Joomla.submitform(task, document.getElementById('hiitchroi-item-form'));
              }else{
                  alert('<?php echo $this->escape(JText::_('JGLOBAL_VALIDATION_FORM_FAILED')); ?>')
              }
      
          }  
      </script>
      
      
              <form action="<?php echo JRoute::_('index.php?option=com_hiitchroi&view=roiitem&layout=retour&id='.(int)$this->item->id); ?>"
      method="post" name="adminForm" id="hiitchroi-item-form" class="form-validate">
                      <fieldset id="fieldset_form">
                          <legend >Les champs marqués avec une *sont obligatoires</legend>
      
                              <?php foreach($this->form->getFieldset('partie1') as $field): ?>
                                <div class="control-group">
                                  <div class="control-label"><?php echo $field->label; ?></div>
                                  <div class="controls calculatrice_form_input"><?php echo $field->input; ?></div>
                                </div>
                              <?php endforeach; ?>
      
      
                              <div >
                              <button type="button" id="calculatrice_form_button--calculer" onclick="Joomla.submitbutton('calculatrice.save')">
                                  Calculer
                              </button>
                              </div>
                      </fieldset>
                         <input type="hidden" name="task" value="" />
                          <?php echo JHtml::_('form.token'); ?>
                        <input type="hidden" name="return" value="<?php echo $this->return_page; ?>" />
                  </form>
              </div>
          </div>
      </div>
      /tables/calcultrice.php
      Code:
      <?php
      defined('_JEXEC') or die;
      
      class HiitchroiTableCalculatrice extends JTable
      {
      
        public function __construct(&$db){
            parent::__construct('#__hiitchroi_items', 'id', $db);
        }
      
        public function check(){
      
          $isValid = true;
      
          return $isValid;
        }
      
      }
      /models/calculatrice.php

      Code:
      <?php
      defined('_JEXEC') or die;
      
      class HiitchroiModelCalculatrice extends JModelForm
      {
      
        public function getItem($pk = null)
        {
          $app = JFactory::getApplication();
          $id = $app->input->getInt('id');
      
          if(empty($id)){
             return $this->getNullItem();
          }
      
          $db = $this->getDbo();
          $query = $db->getQuery(true);
          $query->select('*');
          $query->from('#__hiitchroi_items');
          $query->where('id = '.$id);
      
          $db->setQuery($query);
          $result = $db->loadObject();
      
          return $result;
        }
      
        public function getForm($data = array(), $loadData = true)
        {
          $app = JFactory::getApplication();
      
          //Nous chargeons le formulaire ici
          $form = $this->loadForm('com_hiitchroi.calculatrice', 'calculatrice', array('control'=>'jform', 'load_data'=>$loadData));
          if(empty($form)){
            return false;
          }  
      
          return $form;
        }
      
        protected function loadFormData()
        {
          $data = JFactory::getApplication()->getUserState('com_hiitchroi.edit.calculatrice.data', array());
          if(empty($data)){
            $data = $this->getItem();
          }  
      
          return $data;
        }
      
         public function getTable($type = 'Form', $prefix = 'HiitchroiTable', $config = array()){
          return JTable::getInstance($type, $prefix, $config);    
        }
      
        private function getNullItem(){
      
          //Nous créons un objet vide
          $item = new stdClass();
          $item->id = NULL;
          $item->organisation = NULL;
          $item->nb_personnes = NULL;
          $item->salaire    = NULL;
          $item->nom = NULL;
          $item->fonction = NULL;
          $item->societe = NULL;
          $item->email = NULL;
          $item->telephone = NULL;
          $item->roi = NULL;
          return $item;
        }
      
      
        public function getReturnPage()
        {
          return base64_encode($this->getState('return_page'));
        }
      
      }
      /forms/calculatrice.xml
      Code:
      <?xml version="1.0" encoding="utf-8"?>
      <form>
        <fieldset name="partie1">
      
      
            <field name="organisation" type="radio"
              label="COM_HIITCHROI_FIELD_ORGANISATION_LABEL"
              description="COM_HIITCHROI_FIELD_ORGANISATION_DESC"
          required="true"
              class="inputbox" >
                  <option value="1" >COM_HIITCHROI_FIELD_ORGANISATION_RADIO1</option>
                  <option value="2" >COM_HIITCHROI_FIELD_ORGANISATION_RADIO2</option>
              </field>
      
            <field name="nb_personnes" type="number"
              label="COM_HIITCHROI_FIELD_NB_PERSONNES_LABEL"
              description="COM_HIITCHROI_FIELD_NB_PERSONNES_DESC"
          required="true"
              class="inputbox" />
      
            <field name="salaire" type="number"
              label="COM_HIITCHROI_FIELD_SALAIRE_LABEL"
              description="COM_HIITCHROI_FIELD_SALAIRE_DESC"
          required="true"
              class="inputbox" />
      
            <field name="nom" type="text"
              label="COM_HIITCHROI_FIELD_NOM_LABEL"
              description="COM_HIITCHROI_FIELD_NOM_DESC"
          required="true"
              class="inputbox" />        
      
            <field name="fonction" type="text"
              label="COM_HIITCHROI_FIELD_FONCTION_LABEL"
              description="COM_HIITCHROI_FIELD_FONCTION_DESC"
          required="true"
              class="inputbox" />
      
            <field name="societe" type="text"
              label="COM_HIITCHROI_FIELD_SOCIETE_LABEL"
              description="COM_HIITCHROI_FIELD_SOCIETE_DESC"
          required="true"
              class="inputbox" />
      
          <field name="email" type="text"
              label="COM_HIITCHROI_FIELD_EMAIL_LABEL"
              description="COM_HIITCHROI_FIELD_EMAIL_DESC"
          required="true"
              class="inputbox" />
      
          <field name="telephone" type="text"
              label="COM_HIITCHROI_FIELD_TELEPHONE_LABEL"
              description="COM_HIITCHROI_FIELD_TELEPHONE_DESC"
          required="true"
              class="inputbox" />
      
          <field name="roi" type="number"
              label="COM_HIITCHROI_FIELD_ROI_LABEL"
              description="COM_HIITCHROI_FIELD_ROI_DESC"
              class="inputbox" />
      
           <field name="id" type="text"
            default="0" label="JGLOBAL_FIELD_ID_LABEL"
            readonly="true" class="readonly"
            description="JGLOBAL_FIELD_ID_DESC" />
        </fieldset>
      </form>
      /controllers/calculatrice.php
      Code:
      <?php
      defined('_JEXEC') or die;
      
      class HiitchroiControllerCalculatrice extends JControllerForm
      {
        public function __construct( $config = array()){
          parent::__construct($config);    
        }
      
            public function add(){
              if(!parent::add()){
                  $this->setRedirect($this->getReturnPage());
              }
          }
      
      
        //Nous reviendrons ici plus tard
        public function allowEdit($data = array(), $key = 'id'){
           return true;
        }
      
        //Nous reviendrons ici plus tard
        public function allowAdd($data = array(), $key =  'id'){
          return true;
        }
      
          public function getModel($name = 'calculatrice', $prefix = '', $config = array('ignore_request' => true)){
              $model = parent::getModel($name, $prefix, $config);
              return $model;
          }
      
          protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id'){
              $tmpl = $this->input->get('tmpl');
              $append = '';
      
              if($tmpl){
                  $append .= '&tmpl='.$tmpl;
              }
      
              $append .= '&layout=edit';
      
              if($recordId){
                  $append .= '&'.$urlVar.'='.$recordId;
              }
      
              $return = $this->getReturnPage();
              if($return){
                  $append .= '&return='.base64_encode($return);
              }
      
              return $append;
          }
      
          protected function getReturnPage(){
              $return = $this->input->get('return', null, 'base64');
      
              if(empty($return) || !JUri::isInternal(base64_decode($return))){
                  return JUri::base();
              }else{
                  return base64_decode($return);
              }
          }
      
          protected function postSaveHook(JModelLegacy $model, $validData = array()){
              $task = $this->getTask();
      
              if($task == 'save'){
                  $this->setRedirect(JRoute::_('index.php?option=com_hiitchroi&view=roiitem&layout=retour&id='.$validData['id'], false));
              }
          }
      
          public function save($key = null, $urlVar = 'id'){
              $result = parent::save($key, $urlVar);
      
              if($result){
                  $this->setRedirect($this->getReturnPage());
              }
      
              return $result;
          }
      }
      Je crois que je n'ai rien oublié...
      Si quelqu'un arrive à voir où est mon erreur !!! parce que là je désespère :-(
      Dernière édition par Niella79 à 22/07/2019, 22h12

      Commentaire


      • #4
        Bonjour,

        J'ai activé le mode debug pour avoir plus d'information sur mon erreur.
        Donc j'obtiens : Call to a member function getColumnAlias() on boolean lors du submit du formulaire

        Voici la callstack qui s'affiche :
        Cliquez sur l'image pour l'afficher en taille normale

Nom : Capture_calc.JPG 
Affichages : 67 
Taille : 128,3 Ko 
ID : 2003612

        Est ce que ça parle à quelqu'un ?

        Commentaire


        • #5
          Hello.

          Tu ne donnes pas les bonnes informations de la classe de ta table au Model.

          Donc la classe de ta table, héritée de JTable n'est pas instanciée dans le model, qui te sort une erreur quand il essaie d'appeler une méthode définie dans le classe mère JTable (méthode getColumnAlias()).

          Il faut corriger ton Model :
          Code PHP:
          public function getTable($type 'Calculatrice'$prefix 'HiitchroiTable'$config = array())
              {
                  return 
          JTable::getInstance($type$prefix$config);
              } 
          Dernière édition par roland_d_alsace à 23/07/2019, 17h03 Raison: fautes
          A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
          Rejoignez le Joomla Users Groupe Alsace...
          roland_d_alsace va-t-il devenir roland_du_grand_est ?

          Commentaire


          • #6
            Bonjour roland_d_alsace,

            J'ai eu beaucoup d'espoir mais hélas j'ai effectué la correction mais cela n'a pas résolu le problème. Toujours la même erreur.
            (j'ai un fichier Form pour une table également).

            Commentaire


            • #7
              Envoyé par Niella79 Voir le message
              Bonjour roland_d_alsace,

              J'ai eu beaucoup d'espoir mais hélas j'ai effectué la correction mais cela n'a pas résolu le problème. Toujours la même erreur.
              (j'ai un fichier Form pour une table également).
              Tu es sûr que Joomla sait ou chercher le fichier où est défini la classe HiitchroiTableCalculatrice ?

              As-tu bien enregistré le chemin d'accès par un
              Code PHP:
              JTable::addIncludePath('chemin_de_tes_classes_filles_de_JTable'); 
              quelque part dans ton code ?

              Voir : https://docs.joomla.org/Using_the_JTable_class
              Dernière édition par roland_d_alsace à 23/07/2019, 22h12
              A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
              Rejoignez le Joomla Users Groupe Alsace...
              roland_d_alsace va-t-il devenir roland_du_grand_est ?

              Commentaire


              • #8
                Je ne vois pas où je pourrais insérer cette ligne. Mais je doute que ce soit le problème car si j'ajoute id=1 à mon url il m'affiche bien l'enregistrement 1 de ma table avec ma vue....

                Commentaire


                • #9
                  J'ai réussi à m'en sortir en étendant mon modele d'un ce ce que j'avais en administrator (c'était la même chose) et je n'ai plus l'erreur. L'enregistrement est bien ajouté.
                  J'ai un autre problème mais je vais faire un nouveau sujet pour celui là.

                  Merci

                  Commentaire

                  Annonce

                  Réduire
                  Aucune annonce pour le moment.

                  Partenaire de l'association

                  Réduire

                  Hébergeur Web PlanetHoster
                  Travaille ...
                  X