Silverstripe:成员关系多多空,形成前端
Posted
技术标签:
【中文标题】Silverstripe:成员关系多多空,形成前端【英文标题】:Silverstripe: Member relation many many null, form front end 【发布时间】:2018-03-13 17:29:40 【问题描述】:致命错误:在 null 上调用成员函数 Services()
类 MemberProfileViewer 扩展 Page_Controller // ... 公共函数Servizi() $源=空; if ($id = (int)$this->urlParams['ID']) $member = Member::get()->byID($id); if ($member instanceof Member) return $source = $member->Services()->map('Title','Title'); if (is_null($id)) 返回 $this->redirect('/'); if (is_null($source)) 返回 $this->httpError(404); 公共函数形式() $fields = 新的字段列表( CheckboxSetField::create( $name = "服务ID", $title = "选择", $source = $this->Servizi() ), ) $actions = 字段列表::创建( FormAction::create('form', 'Send') ->setUseButtonTag(真) ->addExtraClass('btn btn-primary') ); $validator = new RequiredFields('ServiceID'); $form = new Form($this, 'form', $fields, $actions, $validator); $form->setFormMethod('POST', true); 返回$表格; 公共函数 doform($data, $form) $form->sessionMessage( "谢谢,我们的顾问会尽快联系您。", 'good' ); $submission = new RequestForm(); $form->saveInto($submission); $提交->写(); 返回 $this->redirectBack();总是null 不知道怎么解决
是的,这已经解决了问题!
类 MemberProfileViewer 扩展 Page_Controller // ... 公共函数 currentPageID() $id = 0; $request = $this->getRequest(); if(is_numeric($request->requestVar('ID'))) $id = $request->requestVar('ID'); elseif (is_numeric($request->param('ID'))) $id = $request->param('ID'); $id = (int)$id; 返回$id; 公共函数Servizi() $源=空; if ($id = $this->currentPageID()) 会话::set('ID', $id); return $source = Member::get()->byID($id)->Services()->map('Title','Title')->toArray(); elseif (is_null($source)) return $source = Member::get()->byID(Session::get('ID'))->Services()->map('Title','Title')->toArray(); 公共函数形式() $fields = 新的字段列表( CheckboxSetField::create( $name = "服务", $title = "选择", $source = $this->Servizi() ), ) $actions = 字段列表::创建( FormAction::create('form', 'Send') ->setUseButtonTag(真) ->addExtraClass('btn btn-primary') ); $validator = new RequiredFields('Service'); $form = new Form($this, 'form', $fields, $actions, $validator); $form->setFormMethod('POST', true); $data = Session::get("FormData.$form->getName().data"); 返回 $ 数据? $form->loadDataFrom($data) : $form; 公共函数 doform($data, $form) Session::set("FormData.$form->getName().data", $data); $submission = new RequestForm(); $form->saveInto($submission); $提交->写(); $form->sessionMessage( "谢谢,我们的顾问会尽快联系您。", 'good' ); Session::clear("FormData.$form->getName().data"); 返回 $this->redirectBack();【问题讨论】:
$this->urlParams['ID']
的值是多少?在尝试使用它之前,您应该添加一些错误处理以防找不到该成员
你需要更加防御性地编写代码,你不能总是期望得到一个 Member 实例。如果没有具有该 ID 的成员怎么办?如果 urlParams 数组上没有设置“ID”怎么办?
【参考方案1】:
你的问题可能是因为这条线
$fields = new FieldList(
CheckboxSetField::create(
$name = "ServiceID",
$title = "Select",
$source = $this->Servizi() // <--
),
)
您的方法Servizi()
取决于某些路由(您尝试从 URL 获取成员 ID)。该方法不会总是为您的 CheckboxSetField 返回一个好的地图。如果您没有 Servizi()
方法的路由,您可能不想重定向或返回 http 错误。
现在我不知道您是如何获得会员 ID 的,所以这取决于您如何获得。但是你可以像这样修复它。
public function servizi($memberId = 0)
$array = [];
if(! $memberId && ! ($memberId = Member::currentUserID())) // check current logged in Member
return $array;
if(! $member = Member::get()->byID($memberId))
return $array;
return $member->Services()->map('Title','Title');
以上代码未经测试。
【讨论】:
应该是关系不属于用户登录。从 URL 获取会员 ID,或以其他方式获取 然后想办法在servizi
方法的参数中给出MemberID。您没有提供足够的信息来帮助您解决这个问题。只要确保该方法返回一个数组或映射而不是响应对象...
我需要页面的ID来自动显示表单中可用选项的关系,注意不是currentUserID。我不知道该怎么做。通过使用值提交 $this->get Request()->param('ID') 返回 null。插入数字 ->byId(1) 有效,如何获取表单页面用户 ID 参数。非常感谢@FatalError【参考方案2】:
我愿意:
$source = null;
if ($id = $this->urlParams['ID'])
$member = Member::get()->byId($id);
if ($member instanceof Member)
$source = $member->Services()->map('Title','Title');
if (is_null($source))
//don't show that field, show a LiteralField with an error maybe
else
//show your field with $source
【讨论】:
嗨@BenDubuisson,向前迈出一步,谢谢!但是消息验证请在提供的列表中选择一个值。 value 不是有效选项我尝试使用手动 id 并且它可以工作,因为在动态否? 对不起,我不明白你的问题 示例:byId(7) 有效 | byId($id) return 请在提供的列表中选择一个值。 value 不是一个有效的选项。 对不起,我不知道你在说什么。这些消息是从哪里来的??以上是关于Silverstripe:成员关系多多空,形成前端的主要内容,如果未能解决你的问题,请参考以下文章
Silverstripe类GridFieldConfig_RelationEditor