簡體   English   中英

如何在TYPO3中使用綁定對象驗證選擇字段?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM