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 : 45 
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
                  1 sur 2 < >

                  C'est [Réglé] et on n'en parle plus ?

                  A quoi ça sert ?
                  La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

                  Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

                  Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
                  Comment ajouter la mention [Réglé] à votre discussion ?
                  1 - Aller sur votre discussion et éditer votre premier message :


                  2 - Cliquer sur la liste déroulante Préfixe.

                  3 - Choisir le préfixe [Réglé].


                  4 - Et voilà… votre discussion est désormais identifiée comme réglée.

                  2 sur 2 < >

                  Assistance au forum - Outil de publication d'infos de votre site

                  Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

                  Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

                  Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

                  UTILISER À VOS PROPRES RISQUES :
                  L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

                  Problèmes connus :
                  FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

                  Installation :

                  1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

                  Archive zip : https://github.com/AFUJ/FPA/zipball/master

                  2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

                  3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

                  4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

                  5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

                  6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
                  et remplacer www. votresite .com par votre nom de domaine


                  Exemples:
                  Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
                  Télécharger le script fpa-fr.php dans: /public_html/
                  Pour executer le script: http://www..com/fpa-fr.php

                  Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
                  Télécharger le script fpa-fr.php dans: /public_html/cms/
                  Pour executer le script: http://www..com/cms/fpa-fr.php

                  En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

                  Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
                  Voir plus
                  Voir moins

                  Partenaire de l'association

                  Réduire

                  Hébergeur Web PlanetHoster
                  Travaille ...
                  X