SilverStripe:成员关系许多无效,形成前端



致命错误:null



在null上致电成员函数服务()
类MemberProfileViewer扩展Page_controller {   //...    公共功能servizi(){        $ source = null;        if($ id =(int)$ this-> urlparams ['id']){            $成员=会员:: get() -> byid($ id);            if($成员instance of成员){                返回$ source = $成员 -> services() -> map('title','title');            }        }        如果(is_null($ id)){            返回$ this-> redirect('/');        }        if(is_null($ source)){            返回$ this-> httperror(404);        }    }    公共功能表格(){        $ fields = new FieldList(            checkboxsetfield :: create(                $ name =" serviceid",                $ title =" select",                $ source = $ this-> servizi()            ),        )        $ action = fieldlist :: create(                formaction :: create('form','send')                     -> setuseButtontag(true)                     -> addExtraclass('BTN BTN-PRIMARY')        );        $验证器= new Requireffields('serviceId');        $ form = new Form($ this,'form',$ fields,$ actions,$ validator);        $ form--> setFormMethod('post',true);        返回$表格;    }    公共功能doform($ data,$ form){        $ form-> session message(            "谢谢,我们的顾问将尽快与您联系。",'好'        );        $提交= new requestForm();        $ form--> saveinto($提交);        $提交 -> write();        返回$ this-> redirectback();    }}

始终为null
我不知道如何解决

是的,这解决了问题!

类MemberProfileViewer扩展Page_controller {   //...    公共功能CurrentPageId(){        $ id = 0;        $请求= $ 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(){        $ source = null;        if($ id = $ this-> currentpageId()){            session :: set('id',$ id);            返回$ source = member :: get() -> byid($ id) -> services() -> map('title','title') -> toarray();        } elseif(is_null($ source)){           返回$ source = member :: get() -> byid(session :: get('id''))) -> services() -> map('title','title') -> toarray();        }    }    公共功能表格(){        $ fields = new FieldList(            checkboxsetfield :: create(                $ name ="服务",                $ title =" select",                $ source = $ this-> servizi()            ),        )        $ action = fieldlist :: create(                formaction :: create('form','send')                     -> setuseButtontag(true)                     -> addExtraclass('BTN BTN-PRIMARY')        );        $验证器= new quilterfields('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);        $提交= new requestForm();        $ form--> saveinto($提交);        $提交 -> write();        $ form-> session message(            "谢谢,我们的顾问将尽快与您联系。",'好'        );        session :: clear(" formdata。{$ form-> getName()}。data");        返回$ this-> redirectback();    }}

您的问题可能是因为此行

$fields = new FieldList(
    CheckboxSetField::create(
        $name = "ServiceID",
        $title = "Select",
        $source = $this->Servizi() // <--
    ),
)

您的方法Servizi()取决于一些路由(您尝试从URL获取成员ID)。该方法不始终返回您的CheckboxSet Field的好地图。如果您没有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');
}

上面的代码未测试。

我会做:

$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
}

最新更新