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

时间:2016-11-28 04:05:21

标签: php upload silverstripe

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

---
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()然后失败,因为它不在那里。我可以添加它并正确调用它但是我不知道该放入什么。我已查看了Field()中的UploadField.php函数,但是有很多代码我可能不应该复制。

我应该如何在自定义控制器中管理文件的上传,还是可以以某种方式将其转发到核心框架?

1 个答案:

答案 0 :(得分:1)

UploadField期望在您的案例''中拥有基于表单名称的路由。 如果您要将表单的名称更改为form,则会调用form/field/Upload/upload。这样做是获取form,然后获取名为field的{​​{1}}并在该类上调用方法Upload

不幸的是,你使用表单的方式(我在之前的回答中给你看:()不支持这个。

我们可以像这样解决它;

<强> CreateController

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);
    }
}