【问题标题】:Custom routing and handling form submission自定义路由和处理表单提交
【发布时间】:2016-11-07 02:52:02
【问题描述】:

我有一些自定义路由:

---
Name: mysiteroutes
---
Director:
  rules:
    'signup//$Action/$Data/$Form': 'SignupController'
---
Name: modelascontrollerroutes
After: '#rootroutes'
---
Director:
  rules:
    '': 'HomePage_Controller'
    '$URLSegment/$Action/$ID': 'BaseController'

还有一个注册控制器:

class SignupController extends Page_Controller {

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

    public function index(SS_HTTPRequest $request) {
        $form = Form::create(
            $this,
            __FUNCTION__,
            FieldList::create(
                EmailField::create('Email', 'Email')
            ),
            FieldList::create(
                FormAction::create('submit', 'Submit')->setAttribute('class', 'btn btn-success')
            ),
            RequiredFields::create('Email')
        );
        return $this->customise(array('Form'=>$form))->renderWith(array("Signup", "Page"));
    }

    public function submit($data, $form = null) {
        $form->addErrorMessage("Test", "Test error message",'bad');
        return $this->redirectBack();
    }
}

显示表单,但没有显示错误消息。当我提交它时,它会转到(当然)SignupController/submit,它返回一个 404。我已将 setFormAction(Controller::join_links(BASE_URL, "signup", 'submit')) 添加到 $form 并且数据通过但 $form 为空,我无法更新它.我可以将其设置为实例变量,但是我可以使用正确的 SS 路由来解决这个问题。我应该更新我的路由以获取 $form 还是有其他问题?

【问题讨论】:

    标签: php routing silverstripe


    【解决方案1】:

    您不需要路由中的$Data$Form 参数,它们将在POST 数据中。

    其次,您不需要在 allowed_actions 中包含 submit 方法,因为它不会被路由触发。

    要解决此问题,您应该; 添加功能链接

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

    所以你会被重定向到signup/...

    然后把你的索引函数改成这个;

    public function index() {
        $form = Form::create(
            $this,
            '', //so it will redirect you to 'signup', instead of 'signup/index'; I think it's prettier :)
            FieldList::create(
                EmailField::create('Email', 'Email')
            ),
            FieldList::create(
                FormAction::create('submit', 'Submit')
                    ->setAttribute('class', 'btn btn-success')
            ),
            RequiredFields::create('Email')
        );
    
        if($this->request->isPost()) 
            return $form; //return the form when it gets posted
    
        return $this->customise(array('Form'=>$form))->renderWith(array("Signup", "Page"));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-02
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多