Trier les valeurs d'un menu déroulant dans l'ordre ALPHA

Trier les valeurs d'un menu déroulant dans l'ordre ALPHA - PHP - Programmation

Marsh Posté le 23-02-2010 à 12:30:39    

Bonjour à tous,
 
j'ai un menu déroulant dans une php que je fais remonter de cette manière :

<?php echo $this->getHtmlList('towns', $this->row->town_id) ?>


 
Je souhaite que les infos dans ce menu soient triées par ORDRE ALPHA.
Savez-vous comment faire cela svp? Je ne suis pas expert en dev. et j'ai un peu du mal à comprendre le fonctionnement de sort() s'il s'agit bien de cela.
 
Merci d'avance,


Message édité par kameha le 23-02-2010 à 18:22:05
Reply

Marsh Posté le 23-02-2010 à 12:30:39   

Reply

Marsh Posté le 23-02-2010 à 12:43:19    

Salut,  
 
Peut-on avoir le code de la méthode getHtmlList ?

Reply

Marsh Posté le 23-02-2010 à 12:52:41    

Tirkyth a écrit :

Salut,  
 
Peut-on avoir le code de la méthode getHtmlList ?


 
Le voici :

function getHtmlList($tableName, $default=0, $grid=false )
 {    
     static $lists = null;
     
     if (!is_array($lists)) {
   
   $t_department    = '- ' . JText::_( 'Department' ).' -' ;
      $t_condition     = '- ' . JText::_( 'Condition' ).' -' ;
      $t_area          = '- ' . JText::_( 'Area' ).' -' ;
      $t_slogan        = '- ' . JText::_( 'Slogan' ).' -' ;
      $t_town          = '- ' . JText::_( 'Town' ).' -' ;
      $t_property_type = '- ' . JText::_( 'Property type' ).' -' ;
      $t_heating_type  = '- ' . JText::_( 'Heating type' ).' -' ;
      $t_hotwater_type = '- ' . JText::_( 'Hot water type' ).' -' ;
       
      $lists = array( 'departments' => array( $t_department , 'department_id'),
                      'conditions' => array( $t_condition , 'condition_id' ),
                      'areas' => array( $t_area , 'area_id' ),
                      'slogans' => array( $t_slogan , 'slogan_id' ),
                      'towns' => array( $t_town , 'town_id' ),
                      'types' => array( $t_property_type , 'type_id' ),
                      'heatingtypes' => array( $t_heating_type , 'heating_type' ),
                      'hotwatertypes' => array( $t_hotwater_type , 'hot_water_type' ),
                    );
  }
     
  if ( isset($lists[$tableName]) ) {
   
   $onChange = $grid ? 'onchange="document.adminForm.submit();"' : '' ;
   $featuresModel =& $this->getModel('features');
      $featuresModel->setTableName( $tableName );
       
      return JHTML::_('select.genericlist',  
                      $featuresModel->getListForHtml($lists[$tableName][0]) ,  
                      $lists[$tableName][1],  
                      'class="inputbox" size="1" '.$onChange ,  
                      'value',  
                      'text',  
                      $default );
  }
   
  return 'list Error';  
 }

Reply

Marsh Posté le 23-02-2010 à 13:18:59    

Ah, du joomla !
 
Bon je te propose une solution pour commencer, c'est mettre un asort() de cette façon :
 

Code :
  1. return JHTML::_('select.genericlist',  
  2.                      asort($featuresModel->getListForHtml($lists[$tableName][0])) ,  
  3.                      $lists[$tableName][1],  
  4.                      'class="inputbox" size="1" '.$onChange ,  
  5.                      'value',  
  6.                      'text',  
  7.                      $default );


 
Si ça ne fonctionne pas, il va falloir me transmettre le code qui correspond à l'appel de

Code :
  1. $featuresModel->getListForHtml($lists[$tableName][0])

Reply

Marsh Posté le 23-02-2010 à 14:45:43    

Tirkyth a écrit :

Ah, du joomla !
 
Bon je te propose une solution pour commencer, c'est mettre un asort() de cette façon :
 

Code :
  1. return JHTML::_('select.genericlist',  
  2.                      asort($featuresModel->getListForHtml($lists[$tableName][0])) ,  
  3.                      $lists[$tableName][1],  
  4.                      'class="inputbox" size="1" '.$onChange ,  
  5.                      'value',  
  6.                      'text',  
  7.                      $default );


 
Si ça ne fonctionne pas, il va falloir me transmettre le code qui correspond à l'appel de

Code :
  1. $featuresModel->getListForHtml($lists[$tableName][0])



 
Merci pour ton aide.
J'ai testé mais ça me génère une erreur sur l'ensemble de mes menus déroulants dans le CMS

Warning: Invalid argument supplied for foreach() in /homez.305/toto/www/joomla/libraries/joomla/html/html/select.php


 
Concernant la méthode getListForHtml, voici le code :

function getListForHtml( $first_txt='' ){
   
        $sql = 'SELECT `id` AS value ,`value` AS text FROM ' . $this->getSqlTableName() . ' ORDER BY ordering' ;
        $rows = $this->_getList( $sql );
 
        if ( $this->_db->getErrorNum() ) {
             
            JError::raiseWarning( 200, $this->_db->getErrorMsg() );
        }
   
  //unshift default option
  array_unshift($rows, JHTML::_('select.option', '0', $first_txt ));
   
  return $rows ;
 }

Reply

Marsh Posté le 23-02-2010 à 15:25:50    

OK, alors enlèves le asort.

 

Essaye, sur la première ligne de la dernière méthode getListForHtml, de mettre à la place :

Code :
  1. $sql = 'SELECT `id` AS value ,`value` AS text FROM ' . $this->getSqlTableName() . ' ORDER BY text' ;
 

Ca devrait marcher, par contre du coup c'est un peu dommage car je crois que dans ton interface d'administration normalement tu dois pouvoir ordonner tes entrées. Là le fait de trier par ordre alphabétique fait que tu perds la fonctionnalité d'ordonnancement personnalisé.

Message cité 2 fois
Message édité par Tirkyth le 23-02-2010 à 15:26:24
Reply

Marsh Posté le 23-02-2010 à 16:52:02    

Tirkyth a écrit :

OK, alors enlèves le asort.
 
Essaye, sur la première ligne de la dernière méthode getListForHtml, de mettre à la place :

Code :
  1. $sql = 'SELECT `id` AS value ,`value` AS text FROM ' . $this->getSqlTableName() . ' ORDER BY text' ;


 
Ca devrait marcher, par contre du coup c'est un peu dommage car je crois que dans ton interface d'administration normalement tu dois pouvoir ordonner tes entrées. Là le fait de trier par ordre alphabétique fait que tu perds la fonctionnalité d'ordonnancement personnalisé.


 
Le top !
Un grand merci !

Reply

Marsh Posté le 23-02-2010 à 18:21:49    

Tirkyth a écrit :

OK, alors enlèves le asort.
 
Essaye, sur la première ligne de la dernière méthode getListForHtml, de mettre à la place :

Code :
  1. $sql = 'SELECT `id` AS value ,`value` AS text FROM ' . $this->getSqlTableName() . ' ORDER BY text' ;


 
Ca devrait marcher, par contre du coup c'est un peu dommage car je crois que dans ton interface d'administration normalement tu dois pouvoir ordonner tes entrées. Là le fait de trier par ordre alphabétique fait que tu perds la fonctionnalité d'ordonnancement personnalisé.


 
Excuses-moi de prendre la tête mais je me permet de réouvrir ce topic sachant que c'est complètement lié.
Je souhaite faire la même opération en front dans un module qui fait remonter ces infos également dans un menu déroulant.
J'ai essayé de remplacer  

function getHtmlList($table, $title, $id ){
 
 $sql = "SELECT `id` AS value ,`value` AS text FROM {$table} ORDER BY ordering" ;
 
 $db = & JFactory::getDBO();
 $db->setQuery($sql);
 $rows = $db->loadObjectList();
 
 if ( $db->getErrorNum() ) {
  JError::raiseWarning( 200, $db->getErrorMsg() );
 }
 
 //unshift default option
 array_unshift($rows, JHTML::_('select.option', '0', $title ));
 
 return JHTML::_('select.genericlist', $rows , $id, 'class="inputbox" size="1" ' , 'value', 'text', 0);
}


 
par
 

function getHtmlList($table, $title, $id ){
 
 $sql = "SELECT `id` AS value ,`value` AS text FROM {$table} ORDER BY text" ;
 
 $db = & JFactory::getDBO();
 $db->setQuery($sql);
 $rows = $db->loadObjectList();
 
 if ( $db->getErrorNum() ) {
  JError::raiseWarning( 200, $db->getErrorMsg() );
 }
 
 //unshift default option
 array_unshift($rows, JHTML::_('select.option', '0', $title ));
 
 return JHTML::_('select.genericlist', $rows , $id, 'class="inputbox" size="1" ' , 'value', 'text', 0);
}


 
mais rien n'y fait...j'ai essayé également avec value pour info.
Le code devient comme "commenté" quand je change la valeur c'est assez étrange.

Reply

Marsh Posté le 24-02-2010 à 11:38:56    

Tu ne me prends pas la tête rassure toi ;)
 
Sauf que là je vais avoir un peu de mal à t'aider.
Tu as fait exactement ce qu'il faut faire, mais si ça ne fait rien peut-être que tu n'es pas dans le bon fichier ?
 
Si tu glisses tout au début de la méthode un

Code :
  1. die(var_dump($table, $title, $id));


Qu'obtiens-tu ?

Reply

Marsh Posté le 24-02-2010 à 19:34:06    

Tirkyth a écrit :

Tu ne me prends pas la tête rassure toi ;)
 
Sauf que là je vais avoir un peu de mal à t'aider.
Tu as fait exactement ce qu'il faut faire, mais si ça ne fait rien peut-être que tu n'es pas dans le bon fichier ?
 
Si tu glisses tout au début de la méthode un

Code :
  1. die(var_dump($table, $title, $id));


Qu'obtiens-tu ?


 
Alors, si je le place juste avant la méthode :  
En front --> j'ai une page blanche avec NULL NULL NULL.
 
Et si je le met juste après "function getHtmlList($table, $title, $id ){"
En front --> il ne se passe rien de spécial.
 
Je ne sais pas si cela vient de mon éditeur (Dream) mais il se passe la même chose qu'en changeant la valeur de ORDER BY, la moitié du code de la méthode devient orangé "genre commenté".
 
Au cas où, voici le code entier de la page en question :

defined('_JEXEC') or die('Restricted access');
 
function getHtmlList($table, $title, $id ){
 
 $sql = "SELECT `id` AS value ,`value` AS text FROM {$table} ORDER BY ordering" ;
 
 $db = & JFactory::getDBO();
 $db->setQuery($sql);
 $rows = $db->loadObjectList();
 
 if ( $db->getErrorNum() ) {
  JError::raiseWarning( 200, $db->getErrorMsg() );
 }
 
 //unshift default option
 array_unshift($rows, JHTML::_('select.option', '0', $title ));
 
 return JHTML::_('select.genericlist', $rows , $id, 'class="inputbox" size="1" ' , 'value', 'text', 0);
}
 
//conflict between component searchform and module searchform because both use same id's
$conflict = JRequest::getVar('option') == 'com_jea' && JRequest::getVar('layout') == 'search' ;
 
if(!$conflict){
 require(JModuleHelper::getLayoutPath('mod_jea_search'));
}


 
Et le code de la page qui appel ce menu déroulant que je souhaite afficher en ordre alpha (type, department, area) :

<?php if ( $use_ajax ): ?>
    <p>
    <select id="type_id" name="type_id" onchange="updateList(this)" class="inputbox"><option value="0"> </option></select>
    <select id="department_id"  name="department_id" onchange="updateList(this)" class="inputbox" ><option value="0"> </option></select>
    <select id="area_id" name="area_id" onchange="updateList(this)" class="inputbox"><option value="0"><option value="0"> </option></select>
 </p>
 <p>
 <label for="budget_min"><?php echo JText::_('Prix minimum &euro;') ?> : </label>
    <input id="budget_min" type="text" name="budget_min" size="6" />
    </p>
 <p>
 <label for="budget_max"><?php echo JText::_('Prix maximum &euro;') ?> : </label>
    <input id="budget_max" type="text" name="budget_max" size="6" />
    </p>
<?php else: ?>


Merci

Message cité 1 fois
Message édité par kameha le 24-02-2010 à 19:38:57
Reply

Marsh Posté le 24-02-2010 à 19:34:06   

Reply

Marsh Posté le 25-02-2010 à 18:41:11    

kameha a écrit :


 
Alors, si je le place juste avant la méthode :  
En front --> j'ai une page blanche avec NULL NULL NULL.
 
Et si je le met juste après "function getHtmlList($table, $title, $id ){"
En front --> il ne se passe rien de spécial.
 


Il faut le mettre juste après "function getHtmlList($table, $title, $id ){" en effet.
 
Cela dit c'est très étrange que ça ne fasse rien de spécial. J'avoue que là je n'ai pas trop d'autre idée :(

Reply

Marsh Posté le 25-02-2010 à 21:04:32    

c'était censé faire quoi?

Reply

Marsh Posté le 26-02-2010 à 11:13:10    

Afficher le type et les valeurs des 3 variables qu'on passe en paramètre, et arrêter l'execution du script. Ce qui fait que si ta page s'est affichée correctement, je serais tenté de penser qu'il ne passe pas dans cette fonction.

 

Bon, et si tu mettais, juste au dessus du return :

Code :
  1. JError::raiseError(500, $sql); // A ajouter
  2.  
  3. return JHTML::_('select.genericlist', $rows , $id, 'class="inputbox" size="1" ' , 'value', 'text', 0);


Message édité par Tirkyth le 26-02-2010 à 11:13:20
Reply

Marsh Posté le 03-03-2010 à 21:14:29    

Il ne se passe rien rien non plus :-(
 
Pour info si je supprime cette partie  

defined('_JEXEC') or die('Restricted access');
 
function getHtmlList($table, $title, $id ){
 
 $sql = "SELECT `id` AS value ,`value` AS text FROM {$table} ORDER BY ordering" ;
 
 $db = & JFactory::getDBO();
 $db->setQuery($sql);
 $rows = $db->loadObjectList();
 
 if ( $db->getErrorNum() ) {
  JError::raiseWarning( 200, $db->getErrorMsg() );
 }
 
 //unshift default option
 array_unshift($rows, JHTML::_('select.option', '0', $title ));
 
 return JHTML::_('select.genericlist', $rows , $id, 'class="inputbox" size="1" ' , 'value', 'text', 0);
}


...le module continue de fonctionner
 
Plus rien ne s'affiche par contre si je supprime la 2ème partie, à savoir :

//conflict between component searchform and module searchform because both use same id's
$conflict = JRequest::getVar('option') == 'com_jea' && JRequest::getVar('layout') == 'search' ;
 
if(!$conflict){
 require(JModuleHelper::getLayoutPath('mod_jea_search'));
}


Message édité par kameha le 03-03-2010 à 21:14:56
Reply

Marsh Posté le 04-03-2010 à 09:17:40    

Oui donc si en supprimant le code il continue à fonctionner, c'est qu'en effet il ne passe pas dedans. Mais alors là, pour t'aider sans avoir l'organisation des fichiers, sans voir le code, et sans avoir l'appli pour tester, je suis désolé mais j'en suis incapable :(

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed