Zend FrameWork 2 Erhalten ServiceLocator In Form, und füllen Sie eine Dropdown-Liste
Ich brauche, um den adapter aus der form, aber immer noch nicht.
In meinem controller habe ich wiederherstellen können Sie den adapter mit den folgenden:
//module/Users/src/Users/Controller/UsersController.php
public function getUsersTable ()
{
if (! $this->usersTable) {
$sm = $this->getServiceLocator();
$this->usersTable = $sm->get('Users\Model\UsersTable');
}
return $this->usersTable;
}
In meinem Modul habe ich so:
//module/Users/Module.php
public function getServiceConfig()
{
return array(
'factories' => array(
'Users\Model\UsersTable' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$uTable = new UsersTable($dbAdapter);
return $uTable;
},
//I need to get this to the list of groups
'Users\Model\GroupsTable' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$gTable = new GroupsTable($dbAdapter);
return $gTable;
},
),
);
}
Könnte mir jemand ein Beispiel, wie man den adapter auf die Tabelle, aus der Gruppe bilden?
Habe ich diesem Beispiel gefolgt, um meine form Benutzer:
http://framework.zend.com/manual/2.0/en/modules/zend.form.collections.html
BEARBEITET von hier aus...
Vielleicht drückte ich mich falsch, die Frage zu stellen.
Was ich wirklich tun müssen ist, füllen Sie eine auswählen (Drop-Down) mit Daten aus meiner Tabelle Gruppen.
So, ich brauche, um die Leistungen in meinem userForm-Klasse ServiceLocatorAwareInterface (finden Sie unter diesem link) implementiert, da standardmäßig die Zend Framework MVC verwendet wird, registriert es einen Initialisierer, Spritzen Sie in der Dienste-Verwalter Instanz ServiceLocatorAwareInterface Umsetzung für jede Klasse.
Nach dem abrufen der Werte aus der Tabelle Gruppen und füllen Sie die wählen Sie.
Das problem ist, dass von allen Möglichkeiten, die ich habe versucht, das getServiceLocator() Rückgabe:
Call to a member function get() on a non-object in
D:\WEBSERVER\htdocs\Zend2Control\module\Users\src\Users\Form\UsersForm.php
on line 46
Wollte ich dies in meiner UserForm...
namespace Users\Form;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Form\Element;
use Zend\Form\Form;
class UsersForm extends Form implements ServiceLocatorAwareInterface
{
protected $serviceLocator;
public function getServiceLocator ()
{
return $this->serviceLocator;
}
public function setServiceLocator (ServiceLocatorInterface $serviceLocator)
{
$this->serviceLocator = $serviceLocator;
}
public function __construct ($name = null)
{
parent::__construct('users');
$this->setAttribute('method', 'post');
$sm = $this->getServiceLocator();
$groups = $sm->get('Users\Model\GroupsTable')->fetchAll(); //line 46
$select = new Element\Select('groups');
$options = array();
foreach ($groups as $group) {
$options[$group->id] = $group->name;
}
$select->setValueOptions($options);
$this->add($select);
//and more elements here...
InformationsquelleAutor der Frage JulianoMartins | 2012-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den anderen verschiedenen Antworten hier in der Regel richtig, die für ZF < 2.1.
Einmal 2.1 ist raus, der Rahmen hat eine ziemlich schöne Lösung. Diese mehr oder weniger formalisiert DrBeza Lösung, dh: mit einem Initialisierer, und dann sich jeder form des bootstrapping in eine init () - Methode, die aufgerufen wird nachdem alle Abhängigkeiten initialisiert wurden.
Spiele ich schon mit dem Zweig, es, es funktioniert ganz gut.
InformationsquelleAutor der Antwort timdev
Dies ist die Methode, die ich verwendet, um zu bekommen, dass Problem.
Erstens, Sie wollen Ihre form umzusetzen ServiceLocatorInterface, wie Sie getan haben.
Werden Sie dann trotzdem noch manuell injizieren der service locator, und die ganze form wird erzeugt, innerhalb der contrstuctor werden Sie injizieren müssen über den contructor zu (nicht ideal, um es zu bauen alle in den Konstruktor, wenn)
Module.php
Jetzt in Ihrem controller erhalten Sie Ihr Formular wie dieses:
Nun haben Sie Zugriff auf die full-service-locator in das Formular zu ergattern sonstige Dienstleistungen etc wie:
InformationsquelleAutor der Antwort Andrew
In module.php ich erstelle zwei Dienste. Sehen Sie, wie füttere ich die adapter auf die form.
In der form-code, den ich verwenden, dass Futter, was auch immer:
InformationsquelleAutor der Antwort michaelbn
Behandeln wir diese in das Modell, indem Sie eine Methode akzeptiert eine form
Als die form wird durch Verweis übergeben, können wir etwas tun, wie dieses in den controller, bei dem die form gebaut wird:
Hinweis: Das Beispiel geht von der Basis Formular erstellt über Anmerkungen, aber es spielt keine Rolle, wie Sie erstellen die ursprüngliche form zurück.
InformationsquelleAutor der Antwort dualmon
Eine alternative Methode zu den anderen Antworten wäre eine Dienste-Verwalter Initialisierung.
Ein Beispiel für eine vorhandene Initialisierung ist, wie der Dienste-Verwalter injiziert wird, wenn die Instanz implementiert ServiceLocatorAwareInterface.
Die Idee wäre, eine Schnittstelle zu schaffen, dass Sie überprüfen Sie in Ihrem Initialiser, diese Schnittstelle kann wie folgt Aussehen:
Ein Beispiel von dem, was Ihre Initialisierung kann wie folgt Aussehen:
Alles, was geschieht, in
init()
Zugang zu denServiceManager
. Natürlich würden Sie brauchen, um Ihre Initialisierung zu Ihren SM-Konfiguration.Es ist nicht perfekt, aber es funktioniert gut für meine Bedürfnisse und kann auch angewendet werden, um alle Fieldsets zog aus der Dienste-Verwalter.
InformationsquelleAutor der Antwort DrBeza
Dies ist die Weise, die ich verwendet, um zu bekommen, dass Problem.
Erstens, In Module.php erstellen der service (so wie Sie das getan haben):
Dann in den controller, ich habe einen Verweis auf das Service:
Und viola, die funktionieren.
InformationsquelleAutor der Antwort user3214824