使用需要自定义实现 Field() 的自定义表单上传字段

Upload field with custom form requiring a custom implementation of Field()

我的系统中有一些自定义路由:

---
Name: mysiteroutes
---
Director:
  rules:
    'create//$Action': 'CreateController'

其中有一个自定义控制器来创建一个表单:

class CreateController extends Page_Controller{

    private static $allowed_actions = array(
        'submit'
    );

    public function link($action = null) {
        return $this->join_links('create/', $action);
    }

    public function index() {
        $form = Form::create(
            $this,
            '',
            FieldList::create(
                TextField::create('Name', 'Name'),
                $upload = new UploadField('Upload', 'Upload')
            ),
            FieldList::create(
                FormAction::create('submit', 'Submit')->setAttribute('class', 'btn btn-success')
            ),
            RequiredFields::create('Name')
        );
        if($this->request->isPost()) return $form;
        return $this->customise(array('Form'=>$form))->renderWith(array("Create", "Page"));     
    }

    public function submit($data, $form = null) {
        $params = $this->getRequest()->params();
        var_dump($params);
    }
}

当我尝试上传它在我的控制器上调用 Field() 的东西时,然后因为它不存在而失败。我可以添加它并正确调用它,但我不知道要放入什么。我查看了 UploadField.php 中的 Field() 函数,但是那里有很多代码我可能不应该只是复制。

我应该如何在我的自定义控制器中管理文件的上传,或者我能否以某种方式将它转发到核心框架?

UploadField 期望有一个基于表单名称的路由,在您的例子中 ''。 如果您将表单的名称更改为 form,它将调用 form/field/Upload/upload。它所做的是获取 form,然后获取名称为 Uploadfield,并在 class 上调用方法 upload

不幸的是,您使用表单的方式(我在之前的回答中向您展示过 :( ) 不支持这种方式。

我们可以这样解决;

创建控制器

class CreateController extends Page_Controller
{
    private static $allowed_actions = [
        'form'
    ];

    public function link($action = null) 
    {
        return $this->join_links('create', $action);
    }

    public function index()
    {
        return $this->renderWith(array("Create", "Page"));     
    }

    public function form()
    {
        return UploadForm::create($this, 'form', 'submit');
    }

    public function submit($data, $form = null)
    {
        $params = $this->getRequest()->params();
        var_dump($params);
    }
}

表格

// create an extra class for the form to keep your controller clean
class UploadForm extends Form
{
    public function __construct($controller, $name, $action)
    {
        $fields = FieldList::create(
            TextField::create('Name', 'Name'),
            UploadField::create('Upload', 'Upload')
        );

        $actions = FieldList::create(
            FormAction::create($action, 'Submit')
                ->setAttribute('class', 'btn btn-success')
        );

        $validator = RequiredFields::create('Name');

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