In ZF2 habe ich 2 Helfer. Ein Helfer verfügt über ein Formular und einen Mapper für die Datenbankinteraktion. Ich übergebe diese Helfer mit einer Controller-Fabrik an den Controller. Der Controller behandelt Telefone und Adressen einer Partei, die entweder eine Person oder eine Organisation ist. Da es sich bei einer Partei um eine Person oder eine Organisation handelt, hat sie andere Daten. Die Controller-Factory übergibt also auch das Objekt: PersonObject oder OrganizationObject mit den partysspezifischen Daten an die Steuerung.ZF2: Ansichtsskript von der Controller-Fabrik ändern
Die 2 Helfer sind für beide Partypen gleich. Aber im View-Skript möchte ich die Party-spezifischen Daten anzeigen, und hier ist mein Problem: Ich muss das View-Skript basierend auf dem Objekt ändern, das die Controller-Factory an den Controller übergibt. Ich dachte an zwei verschiedene Controller, aber es ist ein Overkill: Das View-Skript ist zu 90% das gleiche, abgesehen von den 10% Party-spezifischen Informationen, die von der Datenbank in das Party-Objekt kommen.
Wie ändert man das View-Skript von der Controller Factory? Wenn ich hier ändere, meine ich ein etwas anderes HTML-Layout mit den partyspezifischen Daten.
EDIT:
@Saeven vorgeschlagen, einige Code zu veröffentlichen. Im Moment habe ich beschlossen, ViewModel
in der Controller-Fabrik zu erstellen, es entsprechend vorzubereiten und es in den Controller zu injizieren. Aber ich bin mir nicht sicher, ob es gut ist.
Der Helfer:
class ContactMechanismRegistrationViewHelper extends AbstractRegistrationViewHelper
{
public function __construct(
FormInterface $form,
ContactMechanismMapperInterface $contactMechanismMapper
) {
$this->form = $form;
$this->mapper = $contactMechanismMapper;
}
public function saveToDb()
{
$this->mapper->save(
$this->form->get('contactMechanismFieldset')->getObject(),
$this->form->get('partyFieldset')->getObject()
);
}
}
Die Helfer Fabrik:
class ContactMechanismRegistrationViewHelperFactory implements FactoryInterface, MutableCreationOptionsInterface
{
use MutableCreationOptionsTrait;
public function createService(ServiceLocatorInterface $serviceLocator)
{
$serviceManager = $serviceLocator->getServiceLocator();
$formElementManager = $serviceManager->get('FormElementManager');
if (in_array('phone', $this->creationOptions)) {
return new ContactMechanismRegistrationViewHelper(
$formElementManager
->get('Parties\Forms\Forms\ContactMechanisms\PhoneRegistrationForm'),
$serviceManager
->get('Parties\Mappers\ContactMechanisms\PhoneMapper')
);
} elseif (in_array('address', $this->creationOptions)) {
return new ContactMechanismRegistrationViewHelper(
$formElementManager
->get('Parties\Forms\Forms\ContactMechanisms\AddressRegistrationForm'),
$serviceManager
->get('Parties\Mappers\ContactMechanisms\AddressMapper')
);
} else {
throw new ServiceNotCreatedException('wrong option type specified');
}
}
}
-Controller, der die Helfer verwendet:
class PartyDetailsController extends AbstractActionController
{
protected $phoneViewHelper;
protected $addressViewHelper;
protected $partyViewModel;
public function __construct(
ContactMechanismRegistrationViewHelper $phoneViewHelper,
ContactMechanismRegistrationViewHelper $addressViewHelper,
ModelInterface $viewModel
)
{
$this->phoneViewHelper = $phoneViewHelper;
$this->addressViewHelper = $addressViewHelper;
$this->viewModel = $viewModel;
}
public function indexAction()
{
$request = $this->getRequest();
if ($request->isPost()) {
$viewHelperForFormSubmission = $this->getViewHelperForFormSubmission(
$request->getPost('submitButton')
);
$viewHelperForFormSubmission->getForm()->setData($request->getPost());
$viewHelperForFormSubmission->getForm()->setIsSubmitted(true);
if ($viewHelperForFormSubmission->getForm()->isValid()) {
try {
$viewHelperForFormSubmission->saveToDb();
$viewHelperForFormSubmission->getForm()->resetForm();
} catch (\Exception $e) {
die($e->getMessage());
}
} else {
$viewHelperForFormSubmission->getForm()->highlightInvalidElements();
}
}
return $this->viewModel->setVariables([
'phoneForm' => $this->phoneViewHelper->getForm(),
'addressForm' => $this->addressViewHelper->getForm(),
]);
}
protected function getViewHelperForFormSubmission($submitValue)
{
if ($submitValue == 'phone') {
return $this->phoneViewHelper;
} elseif ($submitValue == 'address') {
return $this->addressViewHelper;
} else {
throw new \Exception('invalid submit argument');
}
}
}
Bitte fügen Sie den Code für Ihren Helfer und wie Sie ihn verwenden. – Saeven
@Saeven, hey, danke für die Antwort.Das Problem ist, dass es sehr viel Code ist, dem man nur schwer folgen kann. Deshalb habe ich die Erklärung in Worten gehalten. –
Schreib einfach deinen Helfer und irgendeine Fabrik, die es baut. Dein Code sagt 100x mehr als deine Absätze :) – Saeven