Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-08-2013 14:18:48

suly
Nouveau membre
Date d'inscription: 04-08-2013
Messages: 3

Sélection des données d'une table (TableGateway)

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 :

Code:

<?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 :

Code:

<?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 :

Code:

<?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 :

Code:

<?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 :

Code:

 <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

 

#2 04-08-2013 16:15:53

suly
Nouveau membre
Date d'inscription: 04-08-2013
Messages: 3

Re: Sélection des données d'une table (TableGateway)

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

 

#3 04-08-2013 22:37:45

suly
Nouveau membre
Date d'inscription: 04-08-2013
Messages: 3

Re: Sélection des données d'une table (TableGateway)

Bon bah j'ai choisis Doctrine pour faire mes mappers ... C'est easy avec ça wink

Hors ligne

 

#4 05-08-2013 10:22:11

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Sélection des données d'une table (TableGateway)

Et tu as bien fait big_smile

Hors ligne

 

#5 05-09-2014 11:38:09

DDUC
Membre
Date d'inscription: 18-07-2014
Messages: 18

Re: Sélection des données d'une table (TableGateway)

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

Code:

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";

Code:

'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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages