JModelAdmin / function getTable

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

  • [Problème] JModelAdmin / function getTable

    Bonjour,
    J'ai réussi à créer un composant book avec Developing a Model-View-Controller (MVC) Component for Joomla!1.7.
    Je souhaite ajouter une table des emprunteurs dans le model book.
    Question comment dans JmodelAdmin faire une seconde function getTable avec une table des emprunteurs et l'afficher dans le formulaire ?
    Merci.
    Cordialement.
    Avalokitech.

  • #2
    Re : JModelAdmin / function getTable

    Tout dépend de l'architecture de tes tables ( et ton MCD )
    si tu as 2 tables (books) pour les livres et (lenders) pour les emprunteurs.
    Books comme Table principale avec un champ id_lender (clé étrangère) pour enregistrer l'emprunteur.
    Lenders comme table avec au moins 2 champs (id, value). value= le nom de l'emprunteur.

    Dans ta view/book/view.html.php ... (formulaire)
    //Charge les caracts du livre
    $book =& $this->get('Data');

    //Charge les emprunteurs
    $lenders =& $this->get('DataLenders');

    (...pense aux assignRef ... )
    $this->assignRef( 'book', $book );
    $this->assignRef( 'lenders', $lenders);

    ...


    Dans model/book.php ...

    Tu trouveras 2 queries ...

    Code PHP:
     function &getData()    {

        if (empty( 
    $this->_data )) {

        
    $query1 ' SELECT a.*, emprunteur.value '
         
    ' FROM #__books AS a '
         
    ' LEFT JOIN #__lenders AS emprunteur ON emprunteur.id = a.id_lender '
         
    ' WHERE a.id = ' $this->_id;

        
    $this->_db->setQuery$query1 );
        
    $this->_data $this->_db->loadObject();
        }


        
    // Initialise _data_lenders avec la liste des différents emprunteurs
        
    $query2 'SELECT * FROM #__leders WHERE (published=1) ORDER BY value ASC';
        
    $this->_db->setQuery$query2 );
        
    $this->_data_lenders $this->_getList($query2);

      return 
    $this->_data;
     }
    //function


    // return Lenders to the view...
     
    function &getDataLenders()
      {
      return 
    $this->_data_lenders;
      } 
    puis dans le formulaire ... voici le code qui te permettra de voir le combo (liste des emprunteurs) ET d'en affecter 1 à un livre ...
    view/book/tmpl/default_form.php

    Code PHP:
        <tr>
            <td class="key"><?php echo JText::_('LENDERS');  ?></td>
            <td><input type="hidden" name="id_lender" id="id_lender" value="<?php echo $this->id_lender ;?>" />
           <?php echo JHTML::_('select.genericlist'$this->lenders'id_lender''class="inputbox"','id','value'$this->book->id_lender) ;?>
            </td>
        </tr>
    le principe est là !
    good luck
    Developper of JBreeding Manager: http://www.jbreeding.fr/
    J-cook Referral : Service Générateur d'Extensions pour Joomla

    Commentaire


    • #3
      Re : JModelAdmin / function getTable

      Merci pour ta réponse. Ok pour l'affichage dans default.php. Est-ce que cela fonctionne dans form.php?


      Voici la contruction d'un modèle en Joomla 1.7
      <?php

      /**
      * @version $Id: entry.php 42 2011-03-31 09:12:23Z alagune $
      * @package book
      * @subpackage Component
      * @copyright Copyright (C) 2010-today Alain Lagune. All rights reserved.
      * @author Alain Lagune
      * @link http://joomlacode.org/gf/project/book/
      * @license http://www.gnu.org/licenses/gpl-2.0.html
      */

      // No direct access to this file
      defined('_JEXEC') or die('Restricted access');

      // import Joomla modeladmin library
      jimport('joomla.application.component.modeladmin') ;

      // import Joomla categories library
      jimport('joomla.application.categories');

      /**
      * Entry Model of Book component
      */
      class BookModelEntry extends JModelAdmin
      {
      /**
      * Method to test whether a record can be deleted.
      *
      * @param object $record A record object.
      *
      * @return boolean True if allowed to delete the record. Defaults to the permission set in the component.
      *
      * @note Overload JModelAdmin::canDelete
      */
      protected function canDelete($record)
      {
      $user = JFactory::getUser();
      if ($record->catid)
      {
      return $user->authorise('core.delete', 'com_book.category.' . (int)$record->catid);
      }
      else
      {
      return parent::canDelete($record);
      }
      }

      /**
      * Method to test whether a record state can be changed.
      *
      * @param object $record A record object.
      *
      * @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component.
      *
      * @note Overload JModelAdmin::canEditState
      */
      protected function canEditState($record)
      {
      $user = JFactory::getUser();

      // Check against the category.
      if (!empty($record->catid))
      {
      return $user->authorise('core.edit.state', 'com_book.category.' . (int)$record->catid);
      }

      // Default to component settings if category not known.
      else
      {
      return parent::canEditState($record);
      }
      }

      /**
      * Returns a reference to the a Table object, always creating it.
      *
      * @param string $type The table type to instantiate.
      * @param string $prefix A prefix for the table class name.
      * @param array $config Configuration array for model. Optional.
      *
      * @return JTable A database object
      *
      * @note Overload JModel::getTable
      */
      public function getTable($type = 'Entry', $prefix = 'BookTable', $config = array())
      {
      return JTable::getInstance($type, $prefix, $config);
      }

      /**
      * Method to get the record form.
      *
      * @param array $data Data for the form.
      * @param boolean $loadData True if the form is to load its own data (default case), false if not.
      *
      * @return mixed A JForm object on success, false on failure
      *
      * @note Overload JModelForm::getForm
      */
      public function getForm($data = array(), $loadData = true)
      {
      // Get the form.
      $form = $this->loadForm('com_book.entry', 'entry', array('control' => 'jform', 'load_data' => $loadData));
      if (empty($form))
      {
      return false;
      }

      // Modify the form based on access controls.
      if (!$this->canEditState((object)$data))
      {
      // Disable fields for display.
      $form->setFieldAttribute('published', 'disabled', 'true');

      // Disable fields while saving.
      // The controller has already verified this is a record you can edit.

      $form->setFieldAttribute('published', 'filter', 'unset');
      }
      return $form;
      }

      /**
      * Method to get the data that should be injected in the form.
      *
      * @return mixed The data for the form.
      *
      * @note Overload JModelForm::loadFormData
      */
      protected function loadFormData()
      {
      // Check the session for previously entered form data.
      $data = JFactory::getApplication()->getUserState('com_book.edit.entry.data', array());
      if (empty($data))
      {
      $data = $this->getItem();

      // Set the variants
      $data->variants = implode(', ', $data->variants);

      // Prime some default values.
      if ($data && $this->getState('entry.id') == 0)
      {
      $app = JFactory::getApplication();
      $data->set('catid', JRequest::getInt('catid', $app->getUserState('com_book.entries.filter.category_id ')));
      }
      }
      return $data;
      }

      /**
      * Method to get a single record.
      *
      * @param integer $pk The id of the primary key.
      *
      * @return mixed Object on success, false on failure.
      *
      * @note Overload JModelAdmin::getItem
      */
      public function getItem($pk = null)
      {
      if ($item = parent::getItem($pk))
      {
      if ($item->id)
      {
      // Get the database object
      $db = JFactory::getDbo();

      // Get the variants
      $query = $db->getQuery(true);
      $query->select('alternate');
      $query->from($db->nameQuote('#__book_entry_variants_' . $item->language));
      $query->where('eid=' . (int)$item->id);
      $query->order('ordering');
      $db->setQuery($query);
      $item->variants = $db->loadResultArray();
      if ($db->getErrorNum())
      {
      $this->setError($db->getErrorMsg());
      return false;
      }
      }
      else
      {
      $item->variants = array();
      }
      }
      return $item;
      }

      /**
      * Method to save the form data.
      *
      * @param array $data The form data.
      *
      * @return boolean True on success.
      *
      * @note Overload JModelAdmin::save
      */
      public function save($data)
      {
      $id = $data['id'];

      // Compte the is_new and the change_language flags
      if ($id)
      {
      $table = $this->getTable();
      $table->load($id);
      $is_new = false;
      $change_language = $table->language != $data['language'];
      }
      else
      {
      $is_new = true;
      $change_language = false;
      }

      // If saving is successfull
      if (parent::save($data))
      {
      $db = JFactory::getDbo();
      if ($is_new)
      {
      // Get the new inserted id
      $id = $this->getState('entry.id');
      }
      else
      {
      // Get the current id
      $id = $table->id;

      // Delete the old variants
      $query = $db->getQuery(true);
      $query->delete();
      $query->from($db->nameQuote('#__book_entry_variants_' . $table->language));
      $query->where('eid=' . $id);
      $db->setQuery($query);
      $db->query();
      if ($db->getErrorNum())
      {
      $this->setError($db->getErrorMsg());
      return false;
      }
      }

      // Com**** the variants
      $variants = trim($data['variants']);
      if (empty($variants))
      {
      $variants = array($data['title']);
      }
      else
      {
      $variants = explode(',', $variants);
      }

      // Insert new variants
      $query = $db->getQuery(true);
      $query->insert($db->nameQuote('#__book_entry_variants_' . $data['language']));
      foreach($variants as $i => $variant)
      {
      $query->clear('set');
      $query->set('eid=' . (int)$id);
      $query->set('alternate=' . $db->quote(trim(preg_replace('/(\s+)/', ' ', $variant))));
      $query->set('ordering=' . ($i + 1));
      $db->setQuery($query);
      $db->query();
      if ($db->getErrorNum())
      {
      $this->setError($db->getErrorMsg());
      return false;
      }
      }
      return true;
      }
      return false;
      }

      /**
      * A protected method to get a set of ordering conditions.
      *
      * @param object $table A JTable object.
      *
      * @return array An array of conditions to add to ordering queries.
      *
      * @note Overload JModelAdmin::getReorderConditions
      */
      protected function getReorderConditions($table)
      {
      $condition = array();
      $condition[] = 'catid = ' . (int)$table->catid;
      return $condition;
      }
      }
      Comment lire la table des lenders ?.
      Merci d'avance.
      Cordialement
      Dernière édition par Avalokitech à 12/01/2012, 19h37 Raison: Ok pour Joomla 1.5, KO pour Joomla 1.7

      Commentaire


      • #4
        Re : JModelAdmin / function getTable

        Pour ta première question, default_form.php ou form.php, c'est du pareil au même, tout dépend de l'appel du nom de tmpl qui est fait dans le display de la vue...

        Dans ton exemple, tu dois trouver toutes les fonctions de contrôle pour Form 'books' ( chargement de toute la collection de livres ), et t'en inspirer...
        /**
        * Method to get the datas.
        /**

        Tu ne trouveras pas cette méthode dans ton exemple, qui ne gère que les fonctions
        pour Form 'book', gestion du formulaire pour 1 id. ( display, add, remove, etc ...)

        De plus, la table secondaire 'lenders' et tout le code associé à sa gestion est à créer bien sûr ...
        Developper of JBreeding Manager: http://www.jbreeding.fr/
        J-cook Referral : Service Générateur d'Extensions pour Joomla

        Commentaire


        • #5
          Re : JModelAdmin / function getTable

          De plus, la table secondaire 'lenders' et tout le code associé à sa gestion est à créer bien sûr ...
          J'ai déjà la table et ses champs, et l'affichage etc ...
          Ce que je ne sais pas faire c'est lire la table dans le model et seulement cela.
          Comment doubler le getTable ?
          Merci.
          Cordialement

          Commentaire


          • #6
            Re : JModelAdmin / function getTable

            Je reprends ce poste reté sans réponse.
            Je recherche le PLAN Joomla 1.7 pour afficher une table dans le form.php (détail).
            Ou mettre la lecture de la table ? Comment transporter le résultat de cette lecture dans le formulaire.
            Exemple: Dams Com_book comment ajouter la table des emprunteurs.
            Cordialement.

            Commentaire


            • #7
              Re : JModelAdmin / function getTable

              OK, je comprends. Il faut que tu te formes au développement MVC pour Joomla...
              Une petite install vaut mieux qu'un long discours ....
              Voici les 2 tables en question avec relation
              Cliquez sur l'image pour l'afficher en taille normale

Nom : tables_biblio.jpg 
Affichages : 1 
Taille : 15,6 Ko 
ID : 1798511

              Et cette archive est installable J1.7, et full opérationnelle ...
              Pour info, j'ai créé ce composant en 8 minutes, montre en main, avec j-cook.pro, que je t'invite à découvrir, sans modération. Perso, ça m'a beaucoup aidé à comprendre les rouages MVC...

              com_biblio.zip

              Etudies le code qui permet les échanges de valeurs depuis View, puis Model, retour à View pour le display vers Tmpl.
              Tous les grands principes sont là !
              Developper of JBreeding Manager: http://www.jbreeding.fr/
              J-cook Referral : Service Générateur d'Extensions pour Joomla

              Commentaire


              • #8
                Re : JModelAdmin / function getTable

                Bonjour,
                Je viens de découvrir ta solution.
                Cela me paraît en adéquation avec ma demande.
                J'espère que cette astuce permettra à d'autres novices de se former.
                Cordialement.
                Réglé.
                Dernière édition par Avalokitech à 20/03/2012, 08h52 Raison: Réglé

                Commentaire


                • #9
                  Re : JModelAdmin / function getTable

                  ha oui, je me rappelle, ... et tant mieux si ça répond à la question!
                  Developper of JBreeding Manager: http://www.jbreeding.fr/
                  J-cook Referral : Service Générateur d'Extensions pour Joomla

                  Commentaire

                  Annonce

                  Réduire
                  Aucune annonce pour le moment.

                  Partenaire de l'association

                  Réduire

                  Hébergeur Web PlanetHoster
                  Travaille ...
                  X