Vielleicht ist meine Frage nicht wirklich klar, also hier sind die Details. Ich habe die beiden Klassen "Produkt" und "Angebot" angelegt und möchte ein Produktobjekt an eine Produkteigenschaft eines Angebotsobjekts übergeben, das ein Auswahlfeld darstellt.Wie kann ich ein Auswahlfeld mit einem gebundenen Objekt in TYPO3 validieren?
Die Listenansicht enthält alle Produkte, die mit der Seite mit dem Angebotsformular verknüpft sind.
list.html:
...
<f:for each="{products}" as="product">
<div class="product-block">
<f:link.page additionalParams="{product: product}" pageUid="11" section="form">
<strong>{product.name}</strong>
...
</f:link.page>
</div>
</f:for>
...
So kann ich das Produkt das Angebotsformular übergeben. Das Angebotsformular enthält ein Auswahlfeld, das diese Produktinformationen zur Vorauswahl verwendet.
offer.html:
...
<f:form action="send" method="post" additionalParams="{product: product}" name="offer" object="{offer}">
<fieldset>
<f:render partial="FormErrors" arguments="{field: 'offer.product'}"/>
<f:form.hidden property="product" />
<f:form.select
property="product"
options="{productOptions}"
optionValueField="key"
optionLabelField="value"
prependOptionValue="0"
prependOptionLabel="Choose your product"
/>
</fieldset>
...
<f:form.submit value="Send" />
</f:form>
...
Dies funktioniert gut so weit, aber wenn Sie mich sehen einen prepend Optionswert auch hinzugefügt. Wenn jemand wählt keinen Wert und versuchen, das Angebot Formular abzuschicken ich die follwing Fehlermeldung bekommen:
„# 1297759968: Ausnahme bei Eigenschaftszuordnung auf Eigenschaft Pfad‚‘: PHP Abfangbare Fatal Error: Argument 1 bestanden Fox \ Example \ Domain \ Model \ Offer :: setProduct() muss eine Instanz von Fox sein \ Example \ Domain \ Model \ Product, null gegeben ... "
Die Produkteigenschaft meines Angebotsmodells besitzen eine nicht leere Validierung Anmerkung:
/**
* Stores the product relation
*
* @var \Fox\Example\Domain\Model\Product
* @validate NotEmpty
*/
protected $product = null;
Ich dachte, das nicht leere validat Ion ist genug und wird den Nullwert fangen, aber es scheint nicht so.
Außerdem sieht mein Angebot Aktion wie folgt aus:
public function offerAction(\Fox\Example\Domain\Model\Offer $offer = null)
{
$productId = intval(GeneralUtility::_GP('product'));
$products = $this->productRepository->findAll();
if ($productId > 0 && $this->productRepository->exists($productId)) {
$product= $this->objectManager->get(
'Fox\\Example\\Domain\\Model\\Product'
);
$product = $this->productRepository->findByUid($productId);
$offer->setProduct($product);
}
foreach ($products as $product) {
$option = new \stdClass();
$option->key = $product->getUid();
$option->value = $product->getName();
$productOptions[] = $option;
}
$this->view->assignMultiple([
'offer' => $offer,
'productOptions' => $productOptions
]);
}
Habe ich vergaß etwas oder wie kann ich dieses Problem lösen?
aktualisiert
Wenn ich die Setter-Funktion meiner Produkteigenschaft des Angebots Modells von
ändern/**
* Sets the product
*
* @param \Fox\Example\Domain\Model\Product $product
* @return void
*/
public function setProduct(\Fox\Example\Domain\Model\Product $product)
{
$this->product = $product;
}
zu
/**
* Sets the product
*
* @param \Fox\Example\Domain\Model\Product $product
* @return void
*/
public function setProduct($product)
{
$this->product = $product;
}
dann dem nicht leer Validator funktioniert, aber Ist diese Lösung in Ordnung oder schlecht oder brauche ich einen benutzerdefinierten Validator, wenn der leere Validator nicht funktioniert?
ok, das ist auch eine Lösung. – Fox