Personnaliser barre défilante pour la recherche

Eléphanteau du PHP | 13 Messages

25 juil. 2013, 19:53

Bonjour à tous,

Je souhaiterais personnaliser une page de recherche pour mon site.

En fait le page contient un champ ou saisir le ou les mots a rechercher et deux menus déroulant.

Le premier indique le champ sur lequel on voudrais faire la recherche (Auteur, Titre, Format, Date, etc.) et le deuxième indique le type de recherche (contains, is exactly, do not contains, etc). La valuer par défaut est mise a Null par défaut (aucune valeur sélectionnée par défaut pour les deux listes).

Je voudrais cependant limiter la recherche a certains champs seulement (Auteur et Titre) et un seul type (contains). Je voudrais aussi que les valeurs par défaut soient initialisées Auteur pour le champ et 'Contains' pour la recherche.

Voici le code que je voudrais modifier:

echo $this->formSelect(
"advanced[$i][element_id]",
@$rows['element_id'],
array(),
get_table_options('Element', null, array(
'record_types' => array( 'All'),
'sort' => 'alphaBySet')
)
);
echo $this->formSelect(
"advanced[$i][type]",
@$rows['type'],
array(),
label_table_options(array(
'contains' => __('contains'),
'does not contain' => __('does not contain'),
'is exactly' => __('is exactly'),
'is empty' => __('is empty'),
'is not empty' => __('is not empty'))

Pour le champs de recherche j'ai essayé de changer le 'All' en mettant juste le champ que je voudrais avoir (Auteur, Titre) mais ça ne fonctionne pas.

Pour le type j'ai effacé is exactly, is empty, is not empty, ça marche (ile ne reste que contains) mais ça n'a pas été mis par défaut sur cette valeur.

Je me demandais si quelqu'un du forum pourrait bien m'expliquer comment ça fonctionne.

Merci d'avance.

Eléphanteau du PHP | 13 Messages

29 juil. 2013, 19:04

Des nouvelles sur cette question SVP?

Eléphant du PHP | 96 Messages

29 juil. 2013, 20:27

Quel est le code de cette methode formselect() ?

il faut passer la valeur par defaut
En html ce serait:
<select name="monChamp">
 <option value="" selected="selected">champ par defaut</option>
 <option value="A">champ A</option>
</select>
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 13 Messages

30 juil. 2013, 17:18

Bonjour Imakado,

Merci pour ta réponse.

Le code de la fonction formSelect est le suivant :

class Zend_View_Helper_FormSelect extends Zend_View_Helper_FormElement
{
/**
* Generates 'select' list of options.
*
* @access public
*
* @param string|array $name If a string, the element name. If an
* array, all other parameters are ignored, and the array elements
* are extracted in place of added parameters.
*
* @param mixed $value The option value to mark as 'selected'; if an
* array, will mark all values in the array as 'selected' (used for
* multiple-select elements).
*
* @param array|string $attribs Attributes added to the 'select' tag.
*
* @param array $options An array of key-value pairs where the array
* key is the radio value, and the array value is the radio text.
*
* @param string $listsep When disabled, use this list separator string
* between list values.
*
* @return string The select tag and options XHTML.
*/
public function formSelect($name, $value = null, $attribs = null,
$options = null, $listsep = "<br />\n")
{
$info = $this->_getInfo($name, $value, $attribs, $options, $listsep);
extract($info); // name, id, value, attribs, options, listsep, disable

// force $value to array so we can compare multiple values to multiple
// options; also ensure it's a string for comparison purposes.
$value = array_map('strval', (array) $value);

// check if element may have multiple values
$multiple = '';

if (substr($name, -2) == '[]') {
// multiple implied by the name
$multiple = ' multiple="multiple"';
}

if (isset($attribs['multiple'])) {
// Attribute set
if ($attribs['multiple']) {
// True attribute; set multiple attribute
$multiple = ' multiple="multiple"';

// Make sure name indicates multiple values are allowed
if (!empty($multiple) && (substr($name, -2) != '[]')) {
$name .= '[]';
}
} else {
// False attribute; ensure attribute not set
$multiple = '';
}
unset($attribs['multiple']);
}

// now start building the XHTML.
$disabled = '';
if (true === $disable) {
$disabled = ' disabled="disabled"';
}

// Build the surrounding select element first.
$xhtml = '<select'
. ' name="' . $this->view->escape($name) . '"'
. ' id="' . $this->view->escape($id) . '"'
. $multiple
. $disabled
. $this->_htmlAttribs($attribs)
. ">\n ";

// build the list of options
$list = array();
$translator = $this->getTranslator();
foreach ((array) $options as $opt_value => $opt_label) {
if (is_array($opt_label)) {
$opt_disable = '';
if (is_array($disable) && in_array($opt_value, $disable)) {
$opt_disable = ' disabled="disabled"';
}
if (null !== $translator) {
$opt_value = $translator->translate($opt_value);
}
$opt_id = ' id="' . $this->view->escape($id) . '-optgroup-'
. $this->view->escape($opt_value) . '"';
$list[] = '<optgroup'
. $opt_disable
. $opt_id
. ' label="' . $this->view->escape($opt_value) .'">';
foreach ($opt_label as $val => $lab) {
$list[] = $this->_build($val, $lab, $value, $disable);
}
$list[] = '</optgroup>';
} else {
$list[] = $this->_build($opt_value, $opt_label, $value, $disable);
}
}

// add the options to the xhtml and close the select
$xhtml .= implode("\n ", $list) . "\n</select>";

return $xhtml;
}

Eléphant du PHP | 96 Messages

30 juil. 2013, 17:42

En lisant le code du formulaire générant le html du select, c'est le deuxieme paramètre contenant la valeur qui permettra de pré-sélectionnez la valeur dans le menu déroulant

Essayer d'afficher avant chaque menu déroulant la valeur pour verifier sil vous récupérez correctement vos valeurs, ensuite faites attention: dans un menu déroulant, il faut distinguer la clé de la valeur affichée, c'est l'id qu'il faut passer au menu déroulant pour qu'il puisse la pré-sélectionner :)
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 13 Messages

31 juil. 2013, 18:06

Salut imikado,

Si je vous ai bien compris donc le 2e paramètre qui sélectionne les valeurs dans ma barre défilante. C'est à dire @$rows['element_id'] pour ma première barre et
@$rows['type'] pour la deuxième?

Pour la première barre, je veux ne veux sélectionner que 4 éléments dont les ID dans la BD sont (39, 40. 45,50) -l'id de l'élément que je veux par défaut est le 39-
Comment procéder?


Pour la deuxième barre, j'ai simplement supprimé quelques lignes pour avoir le code suivant

echo $this->formSelect(
"advanced[$i][type]",
@$rows['type'],
array(),
label_table_options(array(
'contains' => __('contains')))

J'obtient donc une barre ou il y'a juste "contains" mais dont la valeur par défaut est vide (NULL).

Comment faire pour avoir "contains" par défaut?



Merci d'avance...

Eléphant du PHP | 96 Messages

01 août 2013, 08:34

D'après la classe que vous avez posté, la liste des champs est le 4ème paramètre
formSelect($name, $value = null, $attribs = null, $options = null, $listsep = "\n")
Dans votre cas
echo $this->formSelect("advanced[$i][type]",@$rows['type'],array(),label_table_options(array('contains' => __('contains')))
La liste des valeurs c'est
label_table_options(array('contains' => __('contains'))
je connais pas cette fonction :(, elle doit etre propre à Zend

il serait pas plus simple pour vous de construire vous meme votre menu déroulant ?
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 13 Messages

01 août 2013, 19:01

Quel serait le code pour ma propre barre défilante svp?

Comment être sur qu'elle aille chercher les bonne valeur de la BD?

Eléphant du PHP | 96 Messages

01 août 2013, 20:11

Dans un premier temps faites une requete qui vous recupère le couple clé/valeur
Ensuite faites une boucle pour créer un tableau php par exemple
$tSelect=array();
//boucle sur la requete $oRow=marequete
  $tSelect[ $oRow->macle ]=$oRow->valeur;
//fin boucle
Enfin pour l'html
Faites une boucle pour construire le menu déroulant
<select name="nomChamp">
<?php foreach($tSelect as $key => $value):?>
  <option value="<?php echo $key?>"><?php echo $value?></option>
<?php endforeach;?>
</select>
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 13 Messages

01 août 2013, 20:42

C'est encore un peu flou pour moi :)

Donc supposons que dans ma barre défilante, je veux avoir deux choix (date et auteur) dont le nom et l'ID dans la BD sont respectivement (Date, Creator) et (40,39).

Donc le code serait le suivant?
$tSelect=array();
  $tSelect[ $oRow->40 ]=$oRow->Date;
  $tSelect[ $oRow->39]=$oRow->Creator;
<select name="Date">
<?php foreach($tSelect as $key => $value):?>
  <Date="<?php echo $key?>"><?php echo $value?></option>
<?php endforeach;?>
</select>

<select name="Auteur">
<?php foreach($tSelect as $key => $value):?>
  <Creator="<?php echo $key?>"><?php echo $value?></option>
<?php endforeach;?>
</select>

Eléphant du PHP | 96 Messages

01 août 2013, 21:05

Reprenons: vous voulez un menu déroulant pour la date ? quel format de date ? de quel date à quel date ?
Et un autre menu déroulant pour l'auteur ?

Imaginons la table auteur contenant

Code : Tout sélectionner

AUT_PKEY AUT_Nom 1 Victor hugo 2 Alan Poe

Dans un premier temps construisez les tableau
//pour les auteurs
//recuperation des auteurs
//bouclez sur les auteurs
$tSelectAuteur=array();
foreach($tAuteurs as $oAuteur){
 $tSelectAuteur[ $oAuteur->AUT_PKEY ]=$oAuteur->AUT_Nom;
}

//boucle sur les date
$tSelectDate=array();
$tSelectDate['20121225']='25 dec 2012';
$tSelectDate['20120714']='14 juillet 2012';

<select name="Date">
<?php foreach($tSelectDate as $key => $value):?>
  <Date="<?php echo $key?>"><?php echo $value?></option>
<?php endforeach;?>
</select>

<select name="Auteur">
<?php foreach($tSelectAuteur as $key => $value):?>
  <Creator="<?php echo $key?>"><?php echo $value?></option>
<?php endforeach;?>
</select>
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 13 Messages

08 août 2013, 20:01

En fait, je ne peux pas construire a ma propre barre défilante puisque le code de la barre fait appel a des fonctions définies ailleurs et dont nous avons besoin.

Par exemple si je mets la valeur "Auteur" et je fais la recherche, la fonction de recherche doit être capable de reconnaitre le champs 'Titre' du Dublin Core.

Je suis entrain de voir comment faire cela.

J'ai essayé le code suivant
 echo $this->formSelect(
                    "advanced[$i][element_id]",
                    @$rows['element_id'],
                    array(),
                    array(
                        'Dublin Core' => array(
                            'Title',
                            'Creator',
                            'Date',
                        ),
                    )
                );
Ça me permet d'avoir les champs Title, Creator et Date dans le formulaire mais quand je lance la recherche (en fait la barre défilante c'est pour chosir le champs sur lequel on veut faire la recherche), les résultats retournées ne sont pas exactes.

J'ai aussi essayé ça mais toujours sans sucés.

echo $this->formSelect(
                    "advanced[$i][element_id]",
                    @$rows['element_id'],
array (),
                     get_table_options('Element', null, array(
                        'record_types' => array(
                        'Title',
                        'Creator',
                        'Date',
                   )
)
                        
                    )
                );
echo $this->formSelect(
                    "advanced[$i][element_id]",
                    @$rows['element_id'],
array (),
                     get_table_options('Element', null, array(
                        'record_types' => array('Item',array(
                        'Title',
                        'Creator',
                        'Date',
                   )),
                        'sort' => 'alphaBySet'
)
                        
                    )
                );
Si quelqu'in pourrait avoir une idée sur la réponse, ça m'aiderait beaucoup.

Merci.