2016-05-15 51 views
0

也許我的問題不是很清楚,所以這裏是細節。我已經創建了兩個類「Product」和「Offer」,並且想要將產品對象傳遞給要約對象的產品屬性,該要約對象表示選擇字段。如何驗證TYPO3中綁定對象的選擇字段?

列表視圖包含所有使用優惠形式鏈接到頁面的產品。

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> 
... 

所以我可以通過該產品的報價形式。優惠形式包含一個選擇字段,該字段使用此產品信息進行預選。

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> 
... 

這個偉大的工程,到目前爲止,但如果你能看到我添加了一個前面加上期權價值了。如果有人不選擇一個值,並嘗試提交報價的形式我得到follwing錯誤消息:

「#1297759968:異常而屬性映射在屬性路徑‘’:PHP開捕致命錯誤:參數1傳遞給Fox \ Example \ Domain \ Model \ Offer :: setProduct() 必須是Fox \ Example \ Domain \ Model \ Product的一個實例,null給出...「

我的報價模型的product屬性擁有不是空驗證註釋:

/** 
* Stores the product relation 
* 
* @var \Fox\Example\Domain\Model\Product 
* @validate NotEmpty 
*/ 
protected $product = null; 

我認爲這不是空的validat離子是足夠的,並會捕獲空值,但似乎並非如此。

另外我的報價行爲看起來是這樣的:

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 
    ]); 
} 

難道我忘了的東西或者我怎樣才能解決這個問題呢?

更新

如果我改變從

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

報價模型的我的產品屬性的setter函數來

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

則不是空的驗證工作,但這個解決方案好還是壞?或者我需要一個自定義驗證器,如果不是空驗證器不工作?

回答

0

我對選擇框中的佔位符值有同樣的問題。 我所做的是將Setter函數中的Model參數設置爲null。

試試這個代碼...

/** 
* 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; 
} 

此外,設置驗證標註爲notEmpty,如果這是一個必填字段。

我希望這可以幫助你。

+0

好的,這也是一個解決方案。 – Fox