![](/img/trans.png)
[英]TYPO3 | Extbase / Fluid - How can I fill <f:form.select.optgroup> from a domain object / database?
[英]How can I validate a select field with a bound object in TYPO3?
也許我的問題不是很清楚,所以這里是細節。 我已經創建了兩個類“ Product”和“ Offer”,並希望將產品對象傳遞給要約對象的要約對象的產品屬性。
列表視圖包含所有與要約表格鏈接到頁面的產品。
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可捕獲的致命錯誤:傳遞給Fox \\ Example \\ Domain \\ Model \\ Offer :: setProduct()的參數1必須是Fox \\ Example \\ Domain \\ Model \\的實例產品,給定null ...”
我的優惠模型的product屬性擁有一個不為空的驗證注釋:
/**
* Stores the product relation
*
* @var \Fox\Example\Domain\Model\Product
* @validate NotEmpty
*/
protected $product = null;
我認為這種不為空的驗證就足夠了,並且可以捕獲空值,但事實並非如此。
另外,我的要約操作如下所示:
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;
}
至
/**
* Sets the product
*
* @param \Fox\Example\Domain\Model\Product $product
* @return void
*/
public function setProduct($product)
{
$this->product = $product;
}
那么非空驗證程序是否有效,但是這種解決方案好還是不好?如果非空驗證程序不正常,我是否需要自定義驗證程序?
我在選擇框中的占位符值有相同的問題。 我所做的是將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。
希望對您有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.