Wir sind es gewohnt, mit ZF2 zu arbeiten, aber für unser letztes Projekt haben wir uns entschieden, mit ZF3 zu beginnen.
Jetzt habe ich ein Problem bei der Formularerstellung.Zend framework 3 benutzerdefinierte Elemente
Was ich tun möchte, ist eine benutzerdefinierte Auswahl erstellen mit Daten aus der Datenbank abgerufen gefüllt.
Was ich in ZF2 tat, war eine Klasse erstellt eine Auswahl erstreckt, mit dem ServiceLocatorAwareInterface
, wie:
class ManufacturerSelect extends Select implements ServiceLocatorAwareInterface {
public function init() {
$manufacturerTable = $this->getServiceLocator()->get('Car\Model\ManufacturerTable');
$valueOptions = [];
foreach ($manufacturerTable->fetchAll() as $manufacturer) {
$valueOptions[$manufacturer->getManufacturerId()] = $manufacturer->getName();
}
$this->setValueOptions($valueOptions);
}
public function getServiceLocator() {
return $this->serviceLocator;
}
public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
$this->serviceLocator = $serviceLocator;
}
}
Dann wird in einer Form zu verwenden, war es genug, um den vollständigen Namen
zu geben$this->add(
array(
'name' => 'manufacturer_id',
'type' => 'Car\Form\Element\ManufacturerSelect'
)
);
Jetzt ist dies nicht mehr möglich, da der Service Locator entfernt wurde und die Verwendung von Fabriken notwendig ist, aber ich habe Mühe zu finden, wie das Gleiche zu tun.
Wenn man bedenkt, Fabriken zu verwenden, habe ich versucht, diese Konfiguration in module.config.php
:
'form_elements' => [
'factories' => [
'Car\Form\Element\ManufacturerSelect' => function ($services) {
$manufacturerTable = $services->get('Car\Model\ManufacturerTable');
return new ManufacturerSelect($manufacturerTable);
},
'Car\Form\CarForm' => function ($services) {
$manufacturerTable = $services->get('Car\Model\ManufacturerTable');
return new CarForm($manufacturerTable, 'car-form');
}
]
]
Ergebnis: Fabrik von CARFORM wird immer dann aufgerufen, aber Fabrik von ManufacturerSelect nicht.
Eine einfache Lösung wäre, die Auswahl direkt in der Formularklasse zu füllen, aber ich würde lieber die Fabrik für das Element verwenden und es überall wiederverwenden, wie ich es in ZF2 gemacht habe.
Hat schon jemand dieses Problem gefunden und eine Lösung gefunden?
Welche Fehler erhalten Sie? Und bitte verwenden Sie keine Closures, da die Fabriken http://zendframework.github.io/zend-servicemanager/migration/#factoryinterface -> Closures nicht cachefähig sind und nicht so wiederverwendbar wie Factory-Klassen sind. – Dymen1
Eigentlich bin ich nicht Bei einem Fehler wird die Fabrik nicht aufgerufen. Ich bin mir 100% sicher, weil ich sogar einen Würfel hineingesteckt habe, ohne Erfolg. Über Verschlüsse habe ich sie nur zur Darstellung hier benutzt, normalerweise benutze ich Klassen. – Matteo
Wie fügen Sie das Formular "Car \ Form \ Element \ ManufacturerSelect" zu Ihrem Formular hinzu? benutze immer noch '$ this-> add (['type' => class])'? – Dymen1