也許我的問題不是很清楚,所以這裏是細節。我已經創建了兩個類「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;
}
則不是空的驗證工作,但這個解決方案好還是壞?或者我需要一個自定義驗證器,如果不是空驗證器不工作?
好的,這也是一個解決方案。 – Fox