Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je développe un site intranet avec ZF2. J'ai différents modules avec plusieurs controllers.
L'index est le module Accueil. J'y ai inclue mon model de table (Table "user") :
Fichier UserTable.php :
<?php namespace Accueil\Model; use Zend\Db\TableGateway\TableGateway; class UserTable { protected $tableGateway; public function __construct(TableGateway $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet; } public function getUser($iduser) { $iduser = (int) $iduser; $rowset = $this->tableGateway->select(array('iduser' => $iduser)); $row = $rowset->current(); if (!$row) { throw new \Exception("Could not find row $iduser"); } return $row; } public function addUser($wwrkc, $matuser, $nomuser, $preuser, $triuser, $emauser, $supuser, $gasuser) { $data = array( 'wwrkc' => $wwrkc, 'matuser' => $matuser, 'nomuser' => $nomuser, 'preuser' => $preuser, 'triuser' => $triuser, 'emauser' => $emauser, 'supuser' => $supuser, 'gasuser' => $gasuser ); $this->insert($data); } public function saveUser(User $user) { $data = array( 'wwrkc' => $user->wwrkc, 'matuser' => $user->matuser, 'nomuser' => $user->nomuser, 'preuser' => $user->preuser, 'triuser' => $user->triuser, 'emauser' => $user->emauser, 'supuser' => $user->supuser, 'gasuser' => $user->gasuser ); $iduser = (int)$user->iduser; if ($iduser == 0) { $this->tableGateway->insert($data); } else { if ($this->getUser($iduser)) { $this->tableGateway->update($data, array('iduser' => $iduser)); } else { throw new \Exception('Form id does not exist'); } } } public function updateUser($iduser, $wwrkc, $matuser, $nomuser, $preuser, $triuser, $emauser, $supuser, $gasuser) { $data = array( 'wwrkc' => $wwrkc, 'matuser' => $matuser, 'nomuser' => $nomuser, 'preuser' => $preuser, 'triuser' => $triuser, 'emauser' => $emauser, 'supuser' => $supuser, 'gasuser' => $gasuser ); $this->update($data, array('iduser' => $iduser)); } public function deleteUser($iduser) { $this->tableGateway->delete(array('iduser' => $iduser)); } }
Fichier User.php :
<?php namespace Accueil\Model; use Zend\InputFilter\Factory as InputFactory; use Zend\InputFilter\InputFilter; use Zend\InputFilter\InputFilterAwareInterface; use Zend\InputFilter\InputFilterInterface; class User { public $iduser; public $wwrkc; public $matuser; public $nomuser; public $preuser; public $triuser; public $emauser; public $supuser; public $gasuser; protected $inputFilter; public function exchangeArray($data) { $this->iduser = (isset($data['iduser'])) ? $data['iduser'] : null; $this->wwrkc = (isset($data['wwrkc'])) ? $data['wwrkc'] : null; $this->matuser = (isset($data['matuser'])) ? $data['matuser'] : null; $this->nomuser = (isset($data['nomuser'])) ? $data['nomuser'] : null; $this->preuser = (isset($data['preuser'])) ? $data['preuser'] : null; $this->triuser = (isset($data['triuser'])) ? $data['triuser'] : null; $this->emauser = (isset($data['emauser'])) ? $data['emauser'] : null; $this->supuser = (isset($data['supuser'])) ? $data['supuser'] : null; $this->gasuser = (isset($data['gasuser'])) ? $data['gasuser'] : null; } public function setInputFilter(InputFilterInterface $inputFilter) { throw new \Exception("Not used"); } public function getInputFilter() { if (!$this->inputFilter) { $inputFilter = new InputFilter(); $factory = new InputFactory(); $inputFilter->add($factory->createInput(array( 'name' => 'iduser', 'required' => true, 'filters' => array( array('name' => 'Int'), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'wwrkc', 'required' => true, 'filters' => array( array('name' => 'Int'), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'matuser', 'required' => true, 'filters' => array( array('name' => 'BigInteger'), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'nomuser', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 50, ), ), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'preuser', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 50, ), ), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'triuser', 'required' => false, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 0, 'max' => 3, ), ), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'emauser', 'required' => false, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 0, 'max' => 100, ), ), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'suppuser', 'required' => true, 'filters' => array( array('name' => 'Bit'), ), ))); $inputFilter->add($factory->createInput(array( 'name' => 'gasuser', 'required' => true, 'filters' => array( array('name' => 'Bit'), ), ))); $this->inputFilter = $inputFilter; } return $this->inputFilter; } public function getArrayCopy() { return get_object_vars($this); } }
A partir d'un module => Administration et du controller => User et de l'Action => Index, je veux faire une sélection de mes utilisateurs en base.
Fichier Module.php du module Administration :
<?php namespace Administration; use Accueil\Model\User; use Accueil\Model\UserTable; use Zend\Db\ResultSet\ResultSet; use Zend\Db\TableGateway\TableGateway; class Module { //chargement auto des resources public function getAutoloaderConfig() { return array( 'Zend\Loader\ClassMapAutoloader' => array( __DIR__ . '/autoload_classmap.php', ), 'Zend\Loader\StandardAutoloader' => array( 'namespaces' => array( __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, ), ), ); } //CONFIGURATION DE BASE DU MODULE public function getConfig() { return include __DIR__ . '/config/module.config.php'; } public function getServiceConfig() { return array( 'factories' => array( 'Accueil\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('user', $dbAdapter, null, $resultSetPrototype); }, ), ); } }
Fichier UserController.php :
<?php namespace Administration\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; use Accueil\Model\User; class UserController extends AbstractActionController { protected $userTable; public function indexAction() { //POUR LA DB return new ViewModel(array( 'title'=>'Liste des utilisateurs', 'users' => $this->getUserTable()->fetchAll(), )); } public function getUserTable() { if (!$this->userTable) { $sm = $this->getServiceLocator(); $this->userTable = $sm->get('Accueil\Model\UserTable'); } return $this->userTable; } public function addAction() { $form = new UserForm(); $form->get('submit')->setValue('Add'); $request = $this->getRequest(); if ($request->isPost()) { $user = new User(); $form->setInputFilter($user->getInputFilter()); $form->setData($request->getPost()); if ($form->isValid()) { $user->exchangeArray($form->getData()); $this->getUserTable()->saveUser($user); return $this->redirect()->toRoute('user'); } } return array('form' => $form); } public function editAction() { $id = (int) $this->params()->fromRoute('iduser', 0); if (!$id) { return $this->redirect()->toRoute('user', array( 'action' => 'add' )); } $user = $this->getUserTable()->getUser($id); $form = new UserForm(); $form->bind($user); $form->get('submit')->setAttribute('value', 'Edit'); $request = $this->getRequest(); if ($request->isPost()) { $form->setInputFilter($user->getInputFilter()); $form->setData($request->getPost()); if ($form->isValid()) { $this->getUserTable()->saveUser($form->getData()); return $this->redirect()->toRoute('user'); } } return array( 'iduser' => $id, 'form' => $form, ); } public function deleteAction() { $id = (int) $this->params()->fromRoute('iduser', 0); if (!$id) { return $this->redirect()->toRoute('user'); } $request = $this->getRequest(); if ($request->isPost()) { $del = $request->getPost('del', 'No'); if ($del == 'Yes') { $id = (int) $request->getPost('iduser'); $this->getUserTable()->deleteUser($id); } return $this->redirect()->toRoute('user'); } return array( 'iduser' => $id, 'user' => $this->getUserTable()->getUser($id) ); } }
Fichier index.phtml de la vue User dans le module Administration :
<h3><?php echo $this->title; ?></h3> <p> <a href="<?php echo $this->url('user', array('action'=>'add'));?>" >Ajouter un utilisateur</a> </p> <div style="width: 98%; margin: 0 0 0 1%" > <ul > <?php foreach ($users as $uti) : ?> <li> <?php echo $this->escapeHtml($uti->nomuser); ?> - <?php echo $this->escapeHtml($uti->preuser); ?> <div> <a href="<?php echo $this->url('user', array('action'=>'edit', 'iduser' => $uti->iduser));?>" >Edit</a> <a href="<?php echo $this->url('user', array('action'=>'delete', 'iduser' => $uti->iduser));?>" >Delete</a> </div> </li> <?php endforeach; ?>
Mon problème est que je n'ai aucune erreure mais je n'affiche pas la liste des utilisateurs.
J'ai fais du debug pas à pas et je me rend compte que mon select ne renvoi aucun résultat (NULL) comme si la table était vide alors qu'il y a des données.
Apparement il voit bien le nombre d'enregistrement puisque j'affiche une liste avec des accès delete et update sur ma vue mais je n'affiche pas le matuser et le nomuser et je ne récupère aucun iduser non plus.
En gros on dirait même que la table est bien mappé mais pas les champs.
J'ai dû oublier une étape je conitnue à chercher en parallèle.
Merci d'avance pour votre aide.
Dernière modification par suly (04-08-2013 14:37:10)
Hors ligne
Je confirme qu'il voit bien mes 136 enregistrements dans la table mais le resultSet est null. Il fait pas le mapping des champs.
Je ne comprend pas ce que j'ai oublié j'ai vérifié et re-vérifié le code mais là je sèche ...
Hors ligne
Bon bah j'ai choisis Doctrine pour faire mes mappers ... C'est easy avec ça
Hors ligne
Et tu as bien fait
Hors ligne
Salut à tous je sais que ce problème est résolu mais moi aussi je suis tombé dessus et en cherchant j'ai trouvé d’où venait le problème. alors j’apporte ma part de pierre au cas où quelqu'un tomberai dessus une nouvelle fois.
le problème est que, qu'on nous appelons la fonction exchangeArray, les index de la table data doit avoir le même nom que l'identifiant du champs du formulaire ainsi que l'attribut de la table de la base de données correspondant. je m'explique par un exemple:
si j'ai une table personne dont les champs sont "id" et "nom" alors mon formulaire devra avoir un champs d'identifiant "id" et un champ d'identifiant "nom". mon model personne sera le suivant
class Personne { public $id; public $nom; protected $inputFilter; public function exchangeArray($data) { $this->id = (isset($data['id'])) ? $data['id'] : null; $this->nom = (isset($data['nom'])) ? $data['nom'] : null; } ... }
En faite le problème est bien compréhensible, vue que lors de l'appel notre fonction reçoit bien le tableau $data avec toute les lignes récupérées. si lors du test de l’existence de la valeur indexé par le fameux index inexistant alors la valeur stockée dans l'attribut de la table sera NULL. Ce qui explique le faite que nous voyons biens le notre d'enrégistrement mais pas le données vu qu'elles sont null.
Explication: Imaginons que dans ma table personne j'avais plutôt les attributs "idpersonne" et "nom". il est bien claire que lors du test dans l'expression $this->id = (isset($data['id'])) ? $data['id'] : null;, Personne::id recevra une valeur null, vue que l'attribut "id" n'existe pas dans ma table personne.
Une autre point où il faudra faire attention est le nom que nous donnons aux propriété de notre model car lors de la récupération des champs lors d'un SELECT avec Zend DB, et bien aulieu que les index prenne les nom des attribut de notre table, elle prendrons plutôt le nom de nos propriétés. Et cela tous simplement parce que lors de l'initialisation du tablegateway dans notre module nous lui disons de prendre pour prototype notre model comme le montre la ligne du code commentée "ici";
'Administration\model\PersonneTable' => function($sm) { $tableGateway = $sm->get('PersonneTableGateway'); $table = new PersonneTable($tableGateway); return $table; }, 'PersonneTableGateway' => function ($sm) { dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new Personne()); //ici return new TableGateway('personne', $dbAdapter, null, $resultSetPrototype); },
J'espère que je me trompe pas car cela fait trois mois de cela que j'ai commencer sur end framework, et j'espère aidé avec cette apport de ma part.
Cordialement.
Hors ligne