Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je cherche à utiliser la méthode autocomplete avec un appel vers un controleur qui me renvoie les données de la BDD...
dans la vue :
<?=$this->autoComplete("location", "", array('url' => '/moncontroller/recherche', 'dataType' => 'json'));?>
A noter que j'ai essayer avec et sans "dataType" en utilisant le contextswitch mais cela ne change rien?
Dans le controller :
public function init() { Zend_Controller_Action_HelperBroker::addHelper(new ZendX_JQuery_Controller_Action_Helper_AutoComplete()); } public function rechercheAction(){ $db = new Model_Recherches(); $results = $db->recherchelist($_GET['term']); $reponse = array(); foreach ($results as $result) { $reponse[] = $result['nom']; } $this->_helper->autoComplete($reponse); }
Comme dans la doc.
Les données sont bien retourné à chaque frappe mais l'autocomplete ne s'exécute pas... aucune erreur de JS dans le cas d'un renvoie de données.
Lorsqu'aucune donnée n'est renvoyé, j'ai cette erreur dans la reponse :
b is null
[Break on this error] (function(a){a.widget("ui.autocomplete...{item:this.active})}})}(jQuery));;/*
jquery....min.js (ligne 168)
Là j'y comprend pas grand chose ?
Merci de votre aide
Hors ligne
en mettant le résultat à retourner dans une autre action, tu va avoir un temps de latence assez élevé, même en local. Si sa se trouve, tu va voir dans la mauvaise action ou bien une erreur type 500 a lieu dans cette action et tu ne le verra pas.
Hors ligne
voici la réponse en local :
GET /controller/recherche?term=f 200 OK 311ms
Même si il est vrai il y a un temps de latence, je souhaite aller chercher dans la BDD que lorsque c'est nécessaire... Ce code fonctionne très bien,
<?=$this->autoComplete("location", "", array('data' => array("new york","los angeles","miami","vegas","washington")));?>
mais ce qui m'intéresse c'est d'avoir une réponse dynamique.
D'ailleur dans la doc ils disent que la valeur est envoyer dans $_GET['q'] alors qu'elle est dans la variable $_GET['term']... et ne dise rien d'autre que de renvoyer les données de cette facon :
$this->_helper->autoComplete($reponse);
J'aimerais savoir que est le nom/le type et la forme de la variable à renvoyer par une action pour alimenter l'autocomplete?
Hors ligne
Bon merci les cloches !!
J'ai une solution mais je la trouve moyenne....
dans la vue :
<?=$this->autoComplete("location", "", array('url' => '/moncontroller/recherche'));?>
dans le contrôleur:
public function rechercheAction(){ $this->getHelper('layout')->disableLayout(); $this->getHelper('viewRenderer')->setNoRender(); $db = new Model_Recherches(); $results = $db->recherchelist($_GET['term']); $reponse = '['; foreach ($results as $result) { $reponse .= '{ "value":"'.$result['nom'].'"},; } $reponse = rtrim($reponse,',').']'; echo $reponse; }
J'attends vos réactions car je ne trouve pas ca très propre...même si ça fonctionne
Si vous avez une manière plus "Zend" de faire je suis preneur
Hors ligne
Pour ma part je ne passe pas par l'autocomplete jquery de ZendX mais directement par du js jquery. Je fais tout dans la même action. Je te donne la réponse demain, je ne l'ai pas sous la main.
Hors ligne
Merci, toujours bon à prendre.
J'y ai penser à le faire directement en JS mais je voulais comprendre avec ZendX, histoire de rester "Zend"
Ce qui me chagrine c'est que le format [{'value':'reponse'}] ressemble à du json mais en initialisant le contextswitch ça ne fonctionne pas
Hors ligne
utilise Zend_Json_Encode();
Hors ligne
Merci je vais faire les tests et je te dis
Hors ligne
bon, j'ai ressortis la partie où j'ai fais ça. Je pense réaliser un petit tuto sur mon site bientôt.
Je te le met brut de décoffrage par contre.
Bon dans mon cas, je fais une liste avec chaque mot séparé par un ';'
//création de la liste autocomplete $mappeurTag = new Tag_Models_TagMapper(); $liste = $mappeurTag->fetchAll(); $listechar = '['; foreach($liste as $tag) { $listechar .= '"'.$tag->nomtag.'", '; } $listechar .=']'; $listejson = new Zend_Json_Expr($listechar);
Voilà, mon tableau est créer et il est encodé en JSON. Ici, j'utilise l'usine à gaz pour la BDD.
Ensuite j'appelle ma fonction JS (je fournis le code aussi t'en fais pas)
$this->view->jQuery() ->addJavascriptFile(Zend_Controller_Front::getInstance()->getBaseUrl().'/scripts/scriptsadm.js') ->addJavascriptFile(Zend_Controller_Front::getInstance()->getBaseUrl().'/scripts/jquery.autocomplete.js') ->addOnLoad('autocomplete('.$listejson.');') ->enable();
Bon ma fonction autocomplete reçoit en paramètre, mon tableau encodé (sinon sa marchera pas).
Et voici le js associé:
function autocomplete(tableau){ $("#tags").autocomplete(tableau, { width: 320, max: 4, highlight: false, multiple: true, multipleSeparator: "; ", scroll: true, scrollHeight: 300 }); }
Et cette fonction transformera mon input avec comme id="tag" en autocomplete. Simple, Rapide et Efficace
Hors ligne
Effectivement c'est très simple et je pense efficace .
Mais, dans mon cas, l'autocomplete ne sera que très rarement utilisé donc je ne souhaite pas ralentir l'affichage de la vue avec une requête SQL systématique, pour un besoin minime ( 1 sur 15 voir sur 20...)
En tous cas je pense qu'un tuto serait bienvenu car la doc est assez mal documenter .
Ce que je retiendrais de ce weekend Pascal :
- Format des données à renvoyer :
[{"value":"valeur qui s'affiche automatiquement", "id":"id de la valeur sélectionné", "autre":"autre valeurs"}, etc...]
La clé value sera afficher automatiquement et on peut insérer d'autre clés...
<?=$this->view->autoComplete("autocompletion", "", array('url' => '/controller/action', 'select' => new Zend_Json_Expr('function(event,ui){$("#aff").html("Id de cette valeur: "+ui.item.id)}')));?>
quelque soit la clé utilisé, on la récupère de cette manière : ui.item.nomdecle
En tous cas merci throrin19
Hors ligne
elle ne ralenti pas énormément la vue, même beaucoup moins que via une action externe. Ma page s'affiche en 1-2s et derrière il y a une centaine d'éléments.
Les select sont rapides. Fais un select sur une table simple ayant 1000000 d'enregistrements. En moyenne tu l'affiche en 5s
Hors ligne
Pages: 1