如何在 TYPO3 中验证带有绑定对象的 select 字段?
How can I validate a select field with a bound object in TYPO3?
也许我的问题不是很清楚,所以这里是详细信息。我创建了两个 类 "Product" 和 "Offer" 并想将产品对象传递给报价对象的产品 属性,它代表 select领域。
列表视图包含链接到带有报价表的页面的所有产品。
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>
...
所以我可以将产品传递到报价表。报价表包含一个 select 字段,该字段将此产品信息用于 preselection。
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 可捕获的致命错误:参数 1 传递给 Fox\Example\Domain\Model\Offer ::设置产品()
必须是 Fox\Example\Domain\Model\Product 的实例,给定为 null ..."
我的报价模型的产品 属性 拥有一个非空验证注释:
/**
* 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
]);
}
我是不是忘记了什么或者我该如何解决这个问题?
更新
如果我将我的产品 属性 的 setter 功能更改为
/**
* 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;
}
那么非空验证器正在工作,但是这个解决方案是好是坏,或者如果非空验证器不起作用,我是否需要自定义验证器?
我对 select 框中的占位符值有同样的问题。
我所做的是将模型参数从 Setter 函数设置为空。
试试这个代码...
/**
* 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,以防这是必填字段。
希望对您有所帮助。
也许我的问题不是很清楚,所以这里是详细信息。我创建了两个 类 "Product" 和 "Offer" 并想将产品对象传递给报价对象的产品 属性,它代表 select领域。
列表视图包含链接到带有报价表的页面的所有产品。
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>
...
所以我可以将产品传递到报价表。报价表包含一个 select 字段,该字段将此产品信息用于 preselection。
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 可捕获的致命错误:参数 1 传递给 Fox\Example\Domain\Model\Offer ::设置产品() 必须是 Fox\Example\Domain\Model\Product 的实例,给定为 null ..."
我的报价模型的产品 属性 拥有一个非空验证注释:
/**
* 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
]);
}
我是不是忘记了什么或者我该如何解决这个问题?
更新
如果我将我的产品 属性 的 setter 功能更改为
/**
* 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;
}
那么非空验证器正在工作,但是这个解决方案是好是坏,或者如果非空验证器不起作用,我是否需要自定义验证器?
我对 select 框中的占位符值有同样的问题。 我所做的是将模型参数从 Setter 函数设置为空。
试试这个代码...
/**
* 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,以防这是必填字段。
希望对您有所帮助。