Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] [Résolu] Overrider le template create par défaut de jDaoCrudController

Posted by cowa on 01/16/2008 00:02

Bonsoir, tout est dans le titre : je cherche à overrider le template par défaut qui est utilisé pour la création par jDaoCrudController.

Je sais qu'on peut overrider les paramètres suivants sans problème :

	protected $listTemplate = 'list_annonce';
	protected $editTemplate = 'edit_annonce';
	protected $viewTemplate = 'view_annonce';

mais il n'y a pas de $createTemplate...

J'ai bien essayé la solution suivante :

	protected function _create($form, $resp, $tpl) {
		$this->_editUpdate($form, $resp, $tpl);
		$resp->bodyTpl = 'edit_annonce';
	}

mais j'obtiens un joli

Fatal error: Call to a member function getBuilder() on a non-object car ma page ne trouve pas de variable form.

Une solution ? :)

Edit : ah oui, si je rappelle $this->_editUpdate($form, $resp, $tpl); c'est parce que j'ai des traitements particuliers (chargement de listes, etc.) à faire avant d'afficher mon formulaire de création / édition.

  [Opened] Re: Overrider le template create par défaut de jDaoCrudController

Reply #1 Posted by laurentj on 01/16/2008 00:07

Bonsoir,

le template $editTemplate est utilisé à la fois pour la création et la mise à jour. Voir le template par defaut dans le module jelix.

  [Opened] Re: Overrider le template create par défaut de jDaoCrudController

Reply #2 Posted by cowa on 01/16/2008 13:22

Avec plaisir. J'espère qu'il n'y a pas d'énormité dans mon code... oO'

  <?php
  /**
  * @package
  * @subpackage annonce
  * @author
  * @copyright
  * @link
  * @licence  http://www.gnu.org/licenses/gpl.html GNU General Public Licence, see LICENCE file
  */
  
  class vehiculeCtrl extends jControllerDaoCrud {
  
    protected $dbProfil = 'mabase';
    
    protected $dao = 'annonce~vehicule';
  
    protected $form = 'annonce~vehicule';
    
    protected $listTemplate = 'list_annonce';
    protected $editTemplate = 'edit_annonce';
    protected $viewTemplate = 'view_annonce';
    
    protected function _getResponse() {
        $rep = $this->getResponse('html');
        $rep->title = 'Gestion des annonces';
        $rep->bodyTpl = 'main_annonce';
        return $rep;
    }
    
    protected function _create($form, $resp, $tpl) {
      $this->_editUpdate($form, $resp, $tpl);
      $resp->bodyTpl = 'edit_annonce';
    }
    
    /**
     * Override de la fonction editupdate() par défaut pour charger notamment les cases à cocher multiples
     * qui ne peuvent pas être chargées par le DAO CRUD basique et plein d'autres listes...
     */
    protected function _editUpdate($form, $resp, $tpl) {
      $resp->title = 'Gestion des annonces - Modification';
      $form = $tpl->get('form');
      $vehiculeId = $form->getData('id');
      
      $maFactory = jDao::get("equipement");
          
      // Chargement des valeurs des équipements de confort
        $conditions = jDao::createConditions();
        $conditions->addCondition('type_equipement', '=', 1);
        $liste = $maFactory->findBy($conditions);
      if ($liste->rowCount() > 0) {
        $liste->next();
        foreach($liste as $record) {
          $datas1[$record->id] = $record->nom;
        }
        $form->getControl('equipementsConfort')->datasource->datas = $datas1;
        if ($vehiculeId != null) {
          $form->initControlFromDao('equipementsConfort', 'annonce~vehicule_equipement_confort');
        }
      }
          
      // Chargement des valeurs des équipements de sécurité
        $conditions = jDao::createConditions();
        $conditions->addCondition('type_equipement', '=', 2);
        $liste = $maFactory->findBy($conditions);
      if ($liste->rowCount() > 0) {
        $liste->next();
        foreach($liste as $record) {
          $datas2[$record->id] = $record->nom;
        }
        $form->getControl('equipementsSecurite')->datasource->datas = $datas2;
        if ($vehiculeId != null) {
          $form->initControlFromDao('equipementsSecurite', 'annonce~vehicule_equipement_securite');
        }
      }
          
      // Chargement des valeurs des équipements audio et navigation
        $conditions = jDao::createConditions();
        $conditions->addCondition('type_equipement', '=', 3);
        $liste = $maFactory->findBy($conditions);
      if ($liste->rowCount() > 0) {
        $liste->next();
        foreach($liste as $record) {
          $datas3[$record->id] = $record->nom;
        }
        $form->getControl('equipementsAudio')->datasource->datas = $datas3;
        if ($vehiculeId != null) {
          $form->initControlFromDao('equipementsAudio', 'annonce~vehicule_equipement_audio');
        }
      }
          
      // Chargement des valeurs des équipements extérieurs
        $conditions = jDao::createConditions();
        $conditions->addCondition('type_equipement', '=', 4);
        $liste = $maFactory->findBy($conditions);
      if ($liste->rowCount() > 0) {
        $liste->next();
        foreach($liste as $record) {
          $datas4[$record->id] = $record->nom;
        }
        $form->getControl('equipementsExterieurs')->datasource->datas = $datas4;
        if ($vehiculeId != null) {
          $form->initControlFromDao('equipementsExterieurs', 'annonce~vehicule_equipement_exterieur');
        }
      }
      
      // Chargement des types de véhicule en javascript
      $typeVehiculeDao = jDao::get("type_vehicule");
      $conditions = jDao::createConditions();
      // Sort by constructeur_id desc, nom asc
      $conditions->addItemOrder('constructeur_id', 'asc');
      $conditions->addItemOrder('nom', 'asc');
      $typesVehicule = $typeVehiculeDao->findBy($conditions);
      $typesVehiculeHtmlArray = "\n<script type=\"text/javascript\">\nvar typeVehiculeHM = new HashMap();\n";
      $currentConstructeur = 0;
      foreach($typesVehicule as $typeVehicule) {
        if ($currentConstructeur != $typeVehicule->constructeur_id) {
          if ($currentConstructeur != 0) {
            // Ajout de la liste de ce constructeur à la liste des types
            $typesVehiculeHtmlArray .= "typeVehiculeHM.put('".$currentConstructeur."', typeVehicule".$currentConstructeur.");\n";
          }
          $currentConstructeur = $typeVehicule->constructeur_id;
          $typesVehiculeHtmlArray .= "var typeVehicule".$typeVehicule->constructeur_id." = new Array();\n";
        }
        // Ajout d'un type de véhicule à ce constructeur
        $typesVehiculeHtmlArray .= "typeVehicule".$typeVehicule->constructeur_id.".push(generateOption(".$typeVehicule->id.", '".$typeVehicule->nom."'));\n";
      }
      $typesVehiculeHtmlArray .= "</script>";
      $tpl->assign('typesVehiculeHtmlArray', $typesVehiculeHtmlArray);
      
      // Chargement des modèles de véhicule en javascript
      $modeleDao = jDao::get("modele");
      $conditions = jDao::createConditions();
      // Sort by type_vehicule_id desc, nom asc
      $conditions->addItemOrder('type_vehicule_id', 'asc');
      $conditions->addItemOrder('nom', 'asc');
      $modeles = $modeleDao->findBy($conditions);
      $modelesHtmlArray = "\n<script type=\"text/javascript\">\nvar modeleHM = new HashMap();\n";
      $currentTypeVehicule = 0;
      foreach($modeles as $modele) {
        if ($currentTypeVehicule != $modele->type_vehicule_id) {
          if ($currentTypeVehicule != 0) {
            // Ajout de la liste des modèles de ce type à la liste des modèles
            $modelesHtmlArray .= "modeleHM.put('".$currentTypeVehicule."', modele".$currentTypeVehicule.");\n";
          }
          $currentTypeVehicule = $modele->type_vehicule_id;
          $modelesHtmlArray .= "var modele".$modele->type_vehicule_id." = new Array();\n";
        }
        // Ajout d'un modèle de véhicule à ce type
        $modelesHtmlArray .= "modele".$modele->type_vehicule_id.".push(generateOption(".$modele->id.", '".$modele->nom."'));\n";
      }
      $modelesHtmlArray .= "</script>";
      $tpl->assign('modelesHtmlArray', $modelesHtmlArray);
      
      $tpl->assign('form', $form);
    }
    
    /**
     * Override la fonction de sauvegarde par défaut du DAO CRUD.
     * Sauvegarde les équipements d'un véhicule, les noms des photos associées.
     */
    protected function _afterUpdate($form, $id, $resp) {
      $form->saveControlToDao('equipementsConfort', 'vehicule_equipement_confort');
      $form->saveControlToDao('equipementsSecurite', 'vehicule_equipement_securite');
      $form->saveControlToDao('equipementsAudio', 'vehicule_equipement_audio');
      $form->saveControlToDao('equipementsExterieurs', 'vehicule_equipement_exterieur');
  
      function stockerPhoto($num, $form) {
        // Stockage du nom du fichier
        if (!is_null($_FILES['photo'.$num]['name'])) {
          $form->setData('photo'.$num.'_nom', $_FILES['photo'.$num]['name']);
        }
      
        $nomFichier = JELIX_APP_VAR_PATH.'uploads/annonce~vehicule/'.$_FILES['photo'.$num]['name'];
        //////////////////////////////// 1. Redimensionnement de l'image originale
        if (file_exists($nomFichier) && is_file($nomFichier)) {
          $source = imagecreatefromjpeg(JELIX_APP_VAR_PATH.'uploads/annonce~vehicule/'.$_FILES['photo'.$num]['name']); // La photo est la source
          $destination = imagecreatetruecolor(800, 600); // On crée la miniature vide
      
          // Les fonctions imagesx et imagesy renvoient la largeur et la hauteur d'une image
          $largeur_source = imagesx($source);
          $hauteur_source = imagesy($source);
          $largeur_destination = imagesx($destination);
          $hauteur_destination = imagesy($destination);
          
          // On crée la miniature
          imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source);
          
          // On enregistre la miniature sous le nom "image.jpg"
          imagejpeg($destination, JELIX_APP_VAR_PATH.'uploads/annonce~vehicule/'.$_FILES['photo'.$num]['name']);
          
          //////////////////////////////// 2. Création de la miniature
          $source = imagecreatefromjpeg(JELIX_APP_VAR_PATH.'uploads/annonce~vehicule/'.$_FILES['photo'.$num]['name']); // La photo est la source
          $destination = imagecreatetruecolor(200, 150); // On crée la miniature vide
      
          // Les fonctions imagesx et imagesy renvoient la largeur et la hauteur d'une image
          $largeur_source = imagesx($source);
          $hauteur_source = imagesy($source);
          $largeur_destination = imagesx($destination);
          $hauteur_destination = imagesy($destination);
          
          // On crée la miniature
          imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur_destination, $hauteur_destination, $largeur_source, $hauteur_source);
          
          // On enregistre la miniature sous le nom "mini-image.jpg"
          imagejpeg($destination, JELIX_APP_VAR_PATH.'uploads/annonce~vehicule/mini-'.$_FILES['photo'.$num]['name']);
        }
        
      }
      
      for ($i = 1; $i <= 10; $i++) {
        if ($_FILES['photo'.$i]['size'] > 0) {
          stockerPhoto($i, $form);        
        }
      }
      
      // Dé-escape le escaping automatique fait par Jelix (il met un \ devant les guillemets ("))
      $form->setData('description', str_replace('\\"', '"', $form->getData('description')));
      
      $form->saveToDao('vehicule');
      $resp->action = $this->_getAction('precreate');
    }
    
  }
  ?>

Je voudrais que $resp->action = $this->_getAction('precreate'); renvoie sur la même page d'édition vide.

  [Opened] Re: Overrider le template create par défaut de jDaoCrudController

Reply #3 Posted by cowa on 01/17/2008 11:53

Tout marche niquel avec les modifs que tu me conseilles.

Pour ce qui est du bug initial... en fait j'avais laissé une balise formfull pour le cas de la création dans le fichier .tpl !

Ce message n'aura pas servi à rien puisque j'ai eu droit en prime à une relecture de mon code ;)

Merci, cowa

 
Page
  1. Re: Overrider le template create par défaut de jDaoCrudController