Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
je veux créer un champ autocomplete
le formulaire est dans le module User et le model est dans le module region
js
$(function() { $(".localite").autocomplete({ minLength: 1, source: function(request, response) { $.ajax({ url: "http://tu-navette.com/region/autocomplete", type: "POST", dataType: "json", data: { text: request.term, lan: 'en' }, success: function(data) { response(data); } }); } }); });
/Region/Controller/Region
public function autocompleteAction() { $JsonModel = new JsonModel(array( 'regions' => $this->getRegionTable()->fetchAll(), )); return $JsonModel; }
/Region/Model/Region
public function exchangeArray($data) { $this->id = (isset($data['id'])) ? $data['id'] : null; $this->name = (isset($data['name'])) ? $data['name'] : null; $this->zip_code = (isset($data['zip_code'])) ? $data['zip_code'] : null; } public function setInputFilter(InputFilterInterface $inputFilter) { throw new \Exception("Not used"); } public function getArrayCopy() { return get_object_vars($this); }
/Region/Model/RegionTable
public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet; }
le pb que la liste du jquery ne s'affiche pas.
Dernière modification par zizou86 (11-04-2013 19:14:07)
Hors ligne
voilà le resultat d'un var_dump dans le autocomplete.phtml
Region\Model\Region Object ( [id] => 2 [first_name] => [region_id] => [birth_date] => [publication_date] => [inputFilter:protected] => [name_region] => sfax [zip_code] => 3000 )
vous remarquer qu'il marge le resultat d'un user et le resultat d'une region en un seul tableau
Dernière modification par zizou86 (05-04-2013 10:38:20)
Hors ligne
Dans ton success, peut-être un :
[lang=javascript] function(data) {return(data);}
Sinon depuis la version 1.8 de jquery, il faut plutôt utiliser les méthodes done() et fail() à la place des options "success" et "error". Dans ton cas :
[lang=javascript] source: function(request, response) { $.ajax({ url: "http://tu-navette.com/region/autocomplete", type: "POST", dataType: "json", data: { text: request.term, lan: 'en' } }) .done(function(data){return(data);}) .fail(function(data){return('');}); }
Hors ligne
Merci pour tous qui ont répondu sur ce poste en voulant m'aider.
ce qui manque dans ma solution c'est d'ajouter ce code dans module.config.php :
'strategies' => array( 'ViewJsonStrategy', ),
------------------------------------------------------------------------------------------------
ce qui me bloque la
1- Je recois une resultat json vide
{"regions":{},"success":true}
sachant que l'input est dans le module User mais l'action est dans le module Region
Hors ligne
non, il me retourne rien.
Hors ligne
quand je fais $this->getRegionTable()->getRegion(3);
il me retourne un resultat
Hors ligne
Le problème vient donc de ton fetchAll() s'il ne te retourne rien le json ne le retournera pas non plus.
Hors ligne
j'utilise fetchAll dans indexAction sans ajax et elle marche bien.
public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet; }
Hors ligne
C'est possible que ton objet ne puisse pas être converti en json. Il y a une interface pour ça dans php 5.4 à implémenter (JsonSerializable un truc dans le genre) sinon faudra creuser pour le rendre compatible.
Hors ligne
j'ai resolu mon pb
en rendre fetchAll comme ca
$resultSet = $this->tableGateway->select(); $rows = array(); foreach ($resultSet as$row){ $rows[] = $row; } return $rows;
-----------------------------------------------------------------------
Est ce que c'est normal qu'il me retourne des champs concerne la table user avec les champs de regions ?
{ "id":"2", == champs region "first_name":null, == champs user "last_name":null, == champs user "birth_day":null, == champs user "name_region":"paris", == champs region "zip_code":"3000" == champs region }
Hors ligne
Il faut voir comment tu as renseigné ton tableGateway.
Normalement tu as du lui renseigner une table et un adapter. S'il a été configuré avec la table user, ca te retourne les infos de la table user
Hors ligne
chaque module est configué avec son tableGateway
Region/Module.php
public function getServiceConfig() { return array( 'factories' => array( 'Region\Model\RegionTable' => function($sm) { $tableGateway = $sm->get('RegionTableGateway'); $table = new RegionTable($tableGateway); return $table; }, 'RegionTableGateway' => function ($sm) { $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new Region()); return new TableGateway('regions', $dbAdapter, null, $resultSetPrototype); }, ), ); }
User/Module.php
public function getServiceConfig() { return array( 'factories' => array( 'User\Model\UserTable' => function($sm) { $tableGateway = $sm->get('UserTableGateway'); $table = new UserTable($tableGateway); return $table; }, 'UserTableGateway' => function ($sm) { $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new User()); return new TableGateway('users', $dbAdapter, null, $resultSetPrototype); }, ), ); }
Dernière modification par zizou86 (11-04-2013 16:51:14)
Hors ligne
c'est ma réponse fetchAll en ajax qui me retourne les champs user
0: {id:2, first_name:null,last_name:null, birth_day:null, name_region:"paris",...} 1: {id:3, first_name:null, last_name:null, birth_day:null, name_region:"marseille",…} 2: {id:5, first_name:null, last_name:null, birth_day:null, name_region:"lyon",…} 3: {id:6, first_name:null, last_name:null, birth_day:null, name_region:"nice",…}
Dernière modification par zizou86 (11-04-2013 16:57:24)
Hors ligne
C'est à dire que tu fais un debug sur le retour de ta méthode fetchAll et tu as ces champs ?
Si oui, fait un débug sur $row pour voir quel type d'objet il s'agit
Ex : \Zend\Debug\Debug::dump($row);exit;
De là tu devrais voir les champs provenant de la BDD et en même temps l'objet concerné.
Hors ligne
j'ai fait le var_dump avant le return en Json et ca donne la meme resultat que le JSON
0: {id:2, first_name:null,last_name:null, birth_day:null, name_region:"paris",...} 1: {id:3, first_name:null, last_name:null, birth_day:null, name_region:"marseille",…} 2: {id:5, first_name:null, last_name:null, birth_day:null, name_region:"lyon",…} 3: {id:6, first_name:null, last_name:null, birth_day:null, name_region:"nice",…}
Hors ligne
Je te demande pas de faire un var_dump au niveau de ta réponse JSON car ca ne fait pas avancer le problème.
Ce n'est pas normal que tu ai ces champs supplémentaires. Ca veut dire que tu as un problème ailleurs.
Pour déterminer d'où provient le bug, on est obligé d'aller chercher la source et faire un var_dump sur du JSON mène à rien car on a pas plus d'infos de comment est constitué ce JSON.
Donc, la première des choses c'est de vérifier si le retour du row est correct. Donc place un var_dump dans ta boucle et affiche le contenu de row pour voir si tu as bien ce que tu souhaites...
Hors ligne
meme resultat, des champs user avec champs regions.
$resultSet = $this->tableGateway->select(); $rows = array(); foreach ($resultSet as $row){ \Zend\Debug\Debug::dump($row); $rows[] = $row; } return $rows;
Hors ligne
array(4) { [0] => object(Region\Model\Region)#225 (5) { ['id'] => string(1) '2' ['first_name'] => NULL ['last_name'] => NULL ['birth_day'] => NULL ['name_en'] => string(4) 'paris' } [1] => object(Region\Model\Region)#227 (5) { ['id'] => string(1) '3' ['first_name'] => NULL ['last_name'] => NULL ['birth_day'] => NULL ['name_en'] => string(4) 'paris' } [2] => object(Region\Model\Region)#228 (5) { ['id'] => string(1) '5' ['first_name'] => NULL ['last_name'] => NULL ['birth_day'] => NULL ['name_en'] => string(4) 'paris' } [3] => object(Region\Model\Region)#229 (5) { ['id'] => string(1) '6' ['first_name'] => NULL ['last_name'] => NULL ['birth_day'] => NULL ['name_en'] => string(4) 'paris' } }
Hors ligne
MEERCIIII,
c'est exactement ça, j'ai fait copier coller de la class User et j'ai oublie de changer les propriétés.
ça marche nikel
Hors ligne