如何在TYPO3中验证带有绑定对象的选择字段?

时间:2016-05-15 10:26:16

标签: forms validation fluid typo3-7.6.x

也许我的问题不是很清楚,所以这里有详细信息。我创建了两个类"产品"和"提供"并希望将产品对象传递给商品对象的产品属性,该对象代表一个选择字段。

列表视图包含链接到包含商品表单的页面的所有产品。

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

到目前为止效果很好,但是如果你看到我也添加了一个前置选项值。如果有人没有选择价值并尝试提交要约表单,我会收到以下错误消息:

&#34;#1297759968:属性路径中的属性映射异常&#34;&#34;:PHP Catchable致命错误:参数1传递给Fox \ Example \ Domain \ Model \ Offer :: setProduct () 必须是Fox \ Example \ Domain \ Model \ Product的实例,null给定...&#34;

我的商品模型的产品属性拥有非空验证注释:

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

我忘记了什么或者如何解决这个问题?

更新

如果我从

更改商品模型的product属性的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;
}

那么非空的验证器正在工作,但这个解决方案是好还是坏,或者如果没有空验证器不工作我是否需要自定义验证器?

1 个答案:

答案 0 :(得分: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;
}

另外,如果这是必填字段,请将validate annotation设置为notEmpty。

我希望这会对你有所帮助。