Probleme Parametrage requette SQL

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

  • Probleme Parametrage requette SQL

    Bonjour à toutes et tous !!
    D'abord je vous souhaite une très bonne année, faite de chance et de réussite dans tous vos projets.

    Bien j'ai un composant qui m'affiche une liste de messages contenu dans un livre d'or, tout fonctionne bien mis à part le fait que les messages s'affiche dans l'ordre croissant en frontal, j'aimerai que ce soit l'inverse, le problème est que ce n'est pas prévu dans la configuration du composant.
    J'aimerai donc savoir comment modifier la requette SQL afin de lui ajouter "ORDER BY id DESC"...
    Voici la class "model" de la vue en question et le model frontal principal du composant :
    Code PHP:

    /* MODELE PRINCIPAL */
    class GuestbookModel  extends JModelLegacy 
        protected 
    $_data null;

        
    /**
         * Items total
         *
         * @var integer
         */
        
    protected $_total null;

        
    /**
         * ID
         *
         * @var integer
         */
        
        
    protected $_id null;

        
    /**
         * Default Filter
         *
         * @var mixed
         */
        
        
    protected $_default_filter null;

        
    /**
         * Default Filter
         *
         * @var mixed
         */
        
        
    protected $_default_table null;

            
        
    /**
         * @var        string    The URL option for the component.    
         */
        
    protected $option null;
            
        
    /**
         * @var        string    context    the context to find session data.    
         */        
        
    protected $_context null;        
        
        
    /**
         * Constructor
         */
        
        
    public function __construct()
        {
            
    parent::__construct();
                
    $app = &JFactory::getApplication('site');
                
    // Guess the option from the class name (Option)Model(View).
            
    if (empty($this->option)) {
                
    $r null;
                if (!
    preg_match('/(.*)Model/i'get_class($this), $r)) {
                    
    JError::raiseError(500JText::_('No Model Name'));
                }
                
    $this->option 'com_'.strtolower($r[1]);
            }        
            
            
    $db $this->getDbo();
            
    $this->_query $db->getQuery(true);  
            
            
    $table $this->getTable();
            if(
    $table) {
                
    $this->_default_table $table->getTableName(); 
                if(isset(
    $table->published))  $this->_state_field 'published';
            }
            
            if (empty(
    $this->_context)) {
                
    $this->_context $this->option.'.'.$this->getName();
            }
            
            
    $array JRequest :: getVar('cid', array (
                
    0
            
    ), '''array');
            
    $edit JRequest :: getVar('edit'true);
            if (
    $edit) {
                
    $this->setId((int) $array[0]);
            }
            
    // Get the pagination request variables
        
            
    $limit        $app ->getUserStateFromRequest$this->_context .'.limit''limit'$app->getCfg('list_limit',0), 'int' );
            
    $limitstart    $app ->getUserStateFromRequest$this->_context .'.limitstart''limitstart'0'int' );
        
            
    // In case limit has been changed, adjust limitstart accordingly
            
    $limitstart = ($limit != ? (floor($limitstart $limit) * $limit) : 0);
            
    $this->setState('limit'$limit);
            
    $this->setState('limitstart'$limitstart);

        }

        
    /**
        * Method to get the item identifier
        *
        * @access public
        * @return $_id int Item Identifier
        */
        
    public function getId() {        
            return 
    $this->_id;
        }

        
    /**
        * Method to set the item identifier
        *
        * @access public
        * @param int Item identifier
        */
        
    public function setId($id) {
            
    // Set item id and wipe data
            
    $this->_id $id;
            
    $this->_data null;
        }

        
    /**
           * Return a  List of vendor-Items 
           * @access    public 
           * @return $_data array
           */

        
    public function getData()
        {
            
    // Lets load the content if it doesn't already exist

            
    if (empty($this->_data))
            {
                
    $query $this->_buildQuery();
                
    $this->_data $this->_getList($query,$this->getState('limitstart'), $this->getState('limit'));
            }

            return 
    $this->_data;
            
        }

        
    /**
         * Method to get an Item
         *
         * @access    public 
         * @return $item array
         */
        
        
    public function getItem() {    

            
    $item = & $this->getTable();                
            
    $item->load($this->_id);
            if(isset(
    $item->params)) {                    
                
    $params json_decode($item->params);                    
                
    $item->params = new JObject();
                
    $item->params ->setProperties(JArrayHelper::fromObject($params));
            }
            return 
    $item;

        }

       
    /**
        * Method to delete an Item
         *
        * @access    public
        * @param  $cid int
        * @return $affected int
        */
         
    public function  delete($cid) {
            
    $db = & JFactory::getDBO();     
            
    $query 'DELETE FROM '.$this->_default_table.' WHERE id '.$this->_multiDbCondIfArray($cid);
            
    $db->setQuery$query);

            
    $db->query();
            
    $affected $db->getAffectedRows();        
            return 
    $affected ;
         }



        
    /**
         * Method to store the vendor
         *
         * @access    public
         * @return    boolean    True on success
         */
        
    public function store($data)
        {
            
    // Implemented in child classes    
        
    }

     
        
    /**
         * Method to get a pagination object 
         *
         * @access public
         * @return integer
         */
        
    public function getPagination()
        {
            
    // Lets load the content if it doesn't already exist
            
    if (empty($this->_pagination))
            {
                
    jimport('joomla.html.pagination');
                
    $this->_pagination = new JPagination$this->getTotal(), $this->getState('limitstart'), $this->getState('limit') );
            }

            return 
    $this->_pagination;
        }


        
    /**
         * Method to get the total number of  items
         *
         * @access public
         * @return integer
         */
        
    public function getTotal()
        {
            
    // Lets load the content if it doesn't already exist
            
    if (empty($this->_total))
            {
                
    $query $this->_buildQuery();
                
    $this->_total $this->_getListCount($query);
            }

            return 
    $this->_total;
        }    
        
            
    /**
        * Method to (un)publish an item
        *
        * @access public
        * @return boolean True on success
        
        */
        
    public function publish($cid = array (), $publish 1) {
            
    $user = & JFactory :: getUser();
            if (
    count($cid)) {
                
    JArrayHelper :: toInteger($cid);
                
    $cids implode(','$cid);
                
    $query 'UPDATE '.$this->_default_table.' SET published = ' . (int) $publish ' WHERE id IN ( ' $cids ' )';
                
    $this->_db->setQuery($query);
        
                if (!
    $this->_db->query()) {
                    
    $this->setError($this->_db->getErrorMsg());
                    return 
    false;
                }
            }
            return 
    true;
        }

        
    /**
        * Method to move a item
        *
        * @access public
        * @return boolean True on success
        
        */
        
    public function saveorder($cid = array (), $order) {
            
    $row = & $this->getTable();
            
    $groupings = array ();
            
    // update ordering values
            
    for ($i 0$i count($cid); $i++) {
                
    $row->load((int) $cid[$i]);

                if (
    $row->ordering != $order[$i]) {
                    
    $row->ordering $order[$i];
                    if (!
    $row->store()) {
                        
    $this->setError($this->_db->getErrorMsg());
                        return 
    false;
                    }
                }
            }

            return 
    true;
        }
        
        
    /**
         * Method to move an item
         *
         * @access    public
         * @return    boolean    True on success
         */
        
    public function move($direction)
        {
            
    $row =& $this->getTable();
            if (!
    $row->load($this->_id)) {
                
    $this->setError($this->_db->getErrorMsg());
                return 
    false;
            }
            
    $table $this->getTable();
            
    $where "";
            
            if(
    $row->catid) {
                
    $where ' catid = '.(int) $row->catid.' AND published >= 0 ';
            } 
            if (!
    $row->move$direction$where )) {
                
    $this->setError($this->_db->getErrorMsg());
                return 
    false;
            }

            return 
    true;
        }
        
        
    /**
        * Method to checkin/unlock the item
        *
        * @access public
        * @return boolean True on success
        
        */
        
    public function checkin() {
            if (
    $this->_id) {
                
    $item = & $this->getTable();
                if (!
    $item->checkin($this->_id)) {
                    
    $this->setError($this->_db->getErrorMsg());
                    return 
    false;
                }
            }
            return 
    false;
        }
        
    /**
        * Method to checkout/lock the item
        *
        * @access public
        * @param int $uid User ID of the user checking the article out
        * @return boolean True on success
        
        */
        
    public function checkout($uid null) {
            if (
    $this->_id) {
                
    // Make sure we have a user id to checkout the vendor with
                
    if (is_null($uid)) {
                    
    $user = & JFactory :: getUser();
                    
    $uid $user->get('id');
                }
                
    // Lets get to it and checkout the thing...
                
    $item = & $this->getTable();
                if (!
    $item->checkout($uid$this->_id)) {
                    
    $this->setError($this->_db->getErrorMsg());
                    return 
    false;
                }
                return 
    true;
            }
            return 
    false;
        }    
        

        
    /**
         * Method to set the Default Filter Column
         * 
         * @access public
         * @param mixed Default Filter
         */
        
        
    public function setDefaultFilter($filter) {
            
    $this->_default_filter $filter;
        }
        
        
    /**
        * Method to build the query
        *
        * @access private
        * @return string query    
        */

        
    protected function _buildQuery()
        {
            
    $where $this->_buildContentWhere();
            
    $orderby $this->_buildContentOrderBy();

            
            
    $query 'SELECT * FROM '.$this->_default_table.' '$where $orderby;

            
            return 
    $query;
        }

        
    /**
        * Method to build the Order Clause
        *
        * @access private
        * @return string orderby    
        */
        
        
    protected function _buildContentOrderBy() {
            
    $app = &JFactory::getApplication('site');
            
    $context            $this->option.'.'.strtolower($this->getName()).'.list.';
            
    $filter_order $app->getUserStateFromRequest($context 'filter_order''filter_order'$this->_default_filter'cmd');
            
    $filter_order_Dir $app->getUserStateFromRequest($context 'filter_order_Dir''filter_order_Dir''''word');

            
    $orderby ' ORDER BY ' $filter_order ' ' $filter_order_Dir ;

            return 
    $orderby;
        }
        
        
    /**
        * Method to build the Where Clause 
        *
        * @access private
        * @return string orderby    
        */
        
        
    protected function _buildContentWhere() {
            
    // Implemented in child classes    
        
    }        
        
        protected function 
    _multiDbCondIfArray($search) {
            
    $ret = (is_array($search)) ? " IN ('" implode("','"$search) . "') " " = '" $search "' ";
            return 
    $ret;
        }

    }

    /*** MODELE DE LA VUE ***/
    //Si besoin car post trop long 
    J'ai deja pas mal chercher comment forcer ce order by à "desc" mais je ne trouve pas... et tous les "var_dump" que je fais ne donner rien... d'ailleur j'ai l'impression que la requette et faite par Joomla et non par le composant, dans ce cas comment paramètrer ma requette ??

    Merci d'avance pour votre aide et bonne semaine !!

  • #2
    Re : Probleme Parametrage requette SQL

    que mets tu au niveau de ton controleur?
    Christophe
    http://www.webcrea.fr

    Commentaire


    • #3
      Re : Probleme Parametrage requette SQL

      Merci pour ta réponse Christophe !!

      En réalité c'est bon j'ai réussi à régler mon problème. Dans le modele affecté à ma vue j'ai une méthode
      qui s’appelle "getListQuery()" à laquelle j'ai rajouté un paramètre "$query->order('id desc')".

      Par contre puisque l'on parle de contrôleur, j'ai ajouté à ce composant une fonction d'enregistrement de message,
      qui fonctionne parfaitement bien mis à part un bémols, j'effectue ma requette depuis la" vue finale" ("list/tmpl/default.php"),
      de ce fait ma requette d'enregistrement est exécutée en aval de la requette récupérant les messages, et du coup l'enregistrement
      n'est pas affiché dans le résultat de la recherche.

      Donc je pense que je dois dire au contrôleur d’exécuter cette fonction avant de charger la liste des messages...
      comment est ce que je peu faire ??

      Voici le code du contrôleur principal (et unique contrôleur) du composant :
      Code PHP:
      class GuestbookController extends JControllerLegacy
      {

          protected 
      $_viewname 'item';
          protected 
      $_mainmodel 'item';
          protected 
      $_itemname 'Item';    
          protected 
      $_context "com_guestbook";
          
      /**
           * Constructor
           */
          
               
          
      public function __construct($config = array ()) {
              
              
      parent :: __construct($config);

              if(isset(
      $config['viewname'])) $this->_viewname $config['viewname'];
              if(isset(
      $config['mainmodel'])) $this->_mainmodel $config['mainmodel'];
              if(isset(
      $config['itemname'])) $this->_itemname $config['itemname']; 

              
      JRequest :: setVar('view'$this->_viewname);

          }

          public function 
      display() {
              
              
      $document =& JFactory::getDocument();
          
              
      $viewType    $document->getType();
              
      $view = & $this->getView($this->_viewname,$viewType);
              
      $model = & $this->getModel($this->_mainmodel);
              
      $view->setModel($model,true);
              
      $view->display();
          }


      Commentaire


      • #4
        Re : Probleme Parametrage requette SQL

        je pense qu'il faut qu'à la fin de ta fonction d'enregistrement, tu demandes de recharger la page...
        Christophe
        http://www.webcrea.fr

        Commentaire


        • #5
          Re : Probleme Parametrage requette SQL

          C'est ce que je fais actuellement avec un header, mais je pense qu'il y a plus propre et "conventionnelle" comme méthode non ??

          Commentaire


          • #6
            Re : Probleme Parametrage requette SQL

            si tu veux un minimum de transaction et pas de rafraîchissement, tu peux opter pour une requête ajax qui
            1 mais à jour la base
            2 ajoute le html si la réponse est ok
            Christophe
            http://www.webcrea.fr

            Commentaire


            • #7
              Re : Probleme Parametrage requette SQL

              Oui c'est pas bête, mais moi j'aimerais surtout savoir comment dire à Joomla "enregistre les données que tu reçois via $_POST", autrement dit comment programmer la requete et à quel moment celle-ci sera effectué ??

              Commentaire


              • #8
                Re : Probleme Parametrage requette SQL

                Les variables se récupèrent via JRequest::getVar('maVar');
                Christophe
                http://www.webcrea.fr

                Commentaire

                Annonce

                Réduire
                Aucune annonce pour le moment.

                Partenaire de l'association

                Réduire

                Hébergeur Web PlanetHoster
                Travaille ...
                X