2016-05-15 12 views
0

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?

Antwort

0

Ich hatte das gleiche Problem mit Platzhalter-Werten in Auswahlfeldern. Was ich getan habe, war, den Model-Parameter von Setter-Funktion auf null zu setzen.

diesen Code Versuchen ...

/** 
* Sets the product 
* 
* @param \Fox\Example\Domain\Model\Product $product 
* @return void 
* @validate NotEmpty 
*/ 
public function setProduct(\Fox\Example\Domain\Model\Product $product = null) 
{ 
    $this->product = $product; 
} 

Auch gesetzt, Kommentierung als notEmpty validieren, falls dies ein Pflichtfeld ist.

Ich hoffe, dass dies Ihnen hilft.

+0

ok, das ist auch eine Lösung. – Fox