2016-05-15 11 views
0

多分私の質問は本当に明確ではないので、ここに詳細があります。私は2つのクラス「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> 
... 

これは、これまで素晴らしい作品が、あなたが見ることができる場合、私はあまりにも、先頭に追加のオプション値を追加しました。誰かが値を選択せず​​にオファーフォームを送信しようとすると、次のエラーメッセージが表示されます。

"#1297759968:プロパティパスでプロパティマッピング中に例外が発生しました:" PHP Catchable Fatal Error:フォックス\例\ドメイン\モデル\オファー:: setProduct() が

私の申し出モデルの製品特性が所有して「...フォックス\例\ドメイン\モデル\製品、ヌル特定のインスタンスでなければなりません空でない検証注釈:

/** 
* 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($product) 
{ 
    $this->product = $product; 
} 

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

からのオファーモデルの私の製品のプロパティのセッター機能を変更する場合は、空でないバリデータが働いているが、このソリューションは大丈夫か悪いですか?空でないバリデータが機能していない場合、カスタムバリデータが必要ですか?

答えて

0

私は選択ボックスのプレースホルダ値に同じ問題がありました。 私は、ModelパラメータをSetter関数から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

ok、これも解決策です。 – Fox

関連する問題