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

大前端攻城狮之路JavaScript函数式编程

Silverstripe 4.6 从 url 创建/保存图像对象

冰多多团队Gamma阶段项目展示

技术分享支付宝前端团队整理的《Web前端开发入门手册》

使用 SilverStripe 的计划任务