2012-09-19 5 views

Répondre

1

Vous pouvez le faire:

créer une classe qui étend Fieldset.

Implémentez la classe InputFilterProviderInterface si vous souhaitez une sorte de validation pour ce champ.

Pour accéder au gestionnaire de services, il faut implémenter ServiceLocatorAwareInterface et deux méthodes, setServiceLocator() et getServiceLocator().

Par défaut, Zend Framework MVC enregistre un initialiseur qui injectera l'instance ServiceManager dans toute classe implémentant Zend \ ServiceManager \ ServiceLocatorAwareInterface. read this

namespace Users\Form; 

use Zend\InputFilter\InputFilterProviderInterface; 
use Zend\ServiceManager\ServiceLocatorAwareInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 
use Zend\Form\Element; 
use Zend\Form\Fieldset; 

class GroupsFieldset extends Fieldset implements InputFilterProviderInterface, 
     ServiceLocatorAwareInterface 
{ 

    /** 
    * @var ServiceLocatorInterface 
    */ 
    protected $serviceLocator; 

    public function __construct() 
    { 
     parent::__construct('groups'); 

     $this->setLabel('Group'); 

     $this->setName('groups'); 

     $sl = $this->getServiceLocator(); 

     $sm = $sl->get('Users\Model\GroupsTable'); 

     $groups = $sm->fetchAll(); 

     $select = new Element\Select('groups'); 

     $options = array(); 

     foreach ($groups as $group) { 
      $options[$group->id] = $group->name; 
     } 

     $select->setValueOptions($options); 
    } 

    /** 
    * Set serviceManager instance 
    * 
    * @param ServiceLocatorInterface $serviceLocator 
    * @return void 
    */ 
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator) 
    { 
     $this->serviceLocator = $serviceLocator; 
     return $this; 
    } 

    /** 
    * Retrieve serviceManager instance 
    * 
    * @return ServiceLocatorInterface 
    */ 
    public function getServiceLocator() 
    { 
     return $this->serviceLocator; 
    } 

    /** 
    * 
    * @return multitype:multitype:boolean 
    */ 
    public function getInputFilterSpecification() 
    { 
     return array(
       'name' => array(
         'required' => true 
       ) 
     ); 
    } 
} 

Que dans module.php

public function getServiceConfig() 
{ 
    return array(
      'factories' => array(
        'Users\Model\UsersTable' => function($sm) { 
         $dbAdapter1 = $sm->get('Zend\Db\Adapter\Adapter'); 
         $table1  = new UsersTable($dbAdapter1); 
         return $table1; 
        }, // Adapter and table groups here 
        'Users\Model\GroupsTable' => function($sm) { 
         $dbAdapter2 = $sm->get('Zend\Db\Adapter\Adapter'); 
         $table2  = new GroupsTable($dbAdapter2); 
         return $table2; 
        }, 
      ), 
    ); 
} 

et enfin dans votre formulaire

$groups = new GroupsFieldset(); 
    $this->add($groups); 
+1

Comment obtenez-vous le gestionnaire de services là-bas? –

+0

Im getting Erreur fatale: Appel à une fonction membre get() sur un non-objet dans $ sm = $ sl-> get ('Dashboard \ Model \ DepTable') ;. DepTable fonctionne bien, je peux lister, ajouter, supprimer, etc –

+0

Je devine que c'est parce que le localisateur de service n'est pas défini. L'interface ServiceLocatorAware provoquera l'injection de ServiceLocator dans l'objet mais cela se produira après l'instanciation de la classe. Un bon article de blog sur cette question - http://www.michaelgallego.fr/blog/?p=205 – DrBeza

Questions connexes