SilverStripe 4中Form::buttonClicked的等效替代方法是什么?
嘿,这个问题我刚好有经验!SilverStripe 4确实移除了buttonClicked()方法,但咱们有几个靠谱的替代方案,我给你详细说说:
方法一:直接检查POST数据(最直接的方式)
表单提交时,被点击按钮的name属性会被包含在POST请求数据里。SilverStripe的表单按钮默认会生成带action_前缀的name(比如你定义按钮FormAction::create('DoSomething', '确认'),对应的name就是action_DoSomething)。你可以直接从Request对象里读取这个值来判断:
public function doSubmit($data, $form) { $request = $this->getRequest(); if ($request->postVar('action_DoSomething')) { // 处理「确认」按钮的逻辑 $form->sessionMessage('确认按钮被点击啦!', 'good'); } elseif ($request->postVar('action_Cancel')) { // 处理「取消」按钮的逻辑 $form->sessionMessage('取消按钮被点击啦!', 'info'); } return $this->redirectBack(); }
方法二:拆分独立处理方法(更优雅的SS4推荐方式)
SilverStripe 4更提倡把不同按钮的逻辑拆成独立的处理方法,这样完全不用手动判断按钮,代码结构也更清晰:
// 在你的Form类里定义表单和按钮 public function getForm() { $fields = FieldList::create( TextField::create('Name', '姓名') // 其他表单字段... ); $actions = FieldList::create( FormAction::create('doConfirm', '确认'), FormAction::create('doCancel', '取消') ); $validator = RequiredFields::create(['Name']); return Form::create($this, __FUNCTION__, $fields, $actions, $validator); } // 「确认」按钮对应的处理方法 public function doConfirm($data, $form) { // 这里直接写确认逻辑 $form->sessionMessage('提交成功!', 'good'); return $this->redirectBack(); } // 「取消」按钮对应的处理方法 public function doCancel($data, $form) { // 这里直接写取消逻辑 $form->sessionMessage('操作已取消', 'info'); return $this->redirectBack(); }
方法三:在通用方法中判断(比如验证阶段)
如果需要在验证、或者某个通用前置方法里判断点击的按钮,可以通过表单的控制器获取Request对象:
public function validate($data, $form) { $request = $form->getController()->getRequest(); $clickedAction = $request->postVar('action'); // 针对特定按钮做额外验证 if ($clickedAction === 'action_doConfirm') { if (empty($data['Name'])) { $form->addErrorMessage('Name', '姓名不能为空!', 'bad'); return false; } } return parent::validate($data, $form); }
内容的提问来源于stack exchange,提问作者PsychoMo
相关产品推荐
相关产品推荐

