如何在SilverStripe中为数据对象的每个项目创建表单

时间:2019-03-20 04:24:43

标签: php silverstripe silverstripe-4 silvershop

使用软件包"silvershop/core": "^3@dev",我扩展了名为SilverShop\Page\AccountPageController的类AccountPageControllerExtension

方案:经过身份验证的用户可以将当前订单存储为Quote,然后在帐户页面中编辑项目数量。

将订单另存为报价时,它将订单状态从Cart更改为Quote

现在,要编辑项目,我得到了QuoteForm扩展Form的灵感,该扩展受SilverShop\Forms\CartForm的启发,它可以很好地显示项目。

问题在于表单提交。由于此QuoteForm是每个Order的个人,因此我不知道如何提交表单。

QuoteForm

class QuoteForm extends Form {

    /**
     * @var Order
     */
    protected $quote;

    public function __construct( $controller, $quoteID = null, $name = 'QuoteForm') {

        if( empty($quoteID) ){
            return false;
        }

        $this->quote = Order::get_by_id($quoteID);
        $items = $this->quote->Items();

        $fields = FieldList::create(
        QuoteEditField::create( $items, 'Items')
            ->setTemplate('Shop\FormField\QuoteEditField')
            ->setTitle('')
        );

        $fields->add(HiddenField::create('QuoteID', 'QuoteID', $quoteID));

        $actions = FieldList::create(
            $update_action = FormAction::create('updateQuote', 'Update')
        );

        parent::__construct( $controller, $name, $fields, $actions );
    }

    public function updateQuote($data, $form){
        Debug::dump($data);

        return Controller::curr()->redirectBack();
    }

}

QuoteForm类中的功能AccountPageControllerExtension

public function QuoteForm($order_id){
    $form = QuoteForm::create($this->owner, $order_id);
    return $form;
}

在模板上称为

<% loop $Quotes %>

    ... title, order date, etc..

    $Up.QuoteForm($ID)
<% end_loop %>

提交表单后,这就是收到的错误

[Emergency] Uncaught InvalidArgumentException: SilverStripe\Control\HTTPRequest is not a subclass of DataObject
POST /account/QuoteForm/
Line 155 in /var/www/app/vendor/silverstripe/framework/src/ORM/DataObjectSchema.php

我想知道这是因为函数QuoteForm接受参数$order_id,但是在提交时它将$order_id设置为HTTPRequest的实例,因为我看到了这一行在痕迹 {Redacted}\QuoteForm->__construct(SilverShop\Page\AccountPageController, SilverStripe\Control\HTTPRequest)

如何分别为每个报价单提交表格?

0 个答案:

没有答案