Silverstripe: отношение членов многие многие нулевые, образуют интерфейс

Неустранимая ошибка: вызов функции-члена Services () в null

класс MemberProfileViewer extends Page_Controller {

// ...

публичная функция Servizi () {
$ source = null;
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)) {
return $ this-> redirect ('/');
}

if (is_null ($ source)) {
return $ this-> httpError (404);
}

}

форма публичной функции () {

$ fields = new FieldList (
CheckboxSetField :: создать (
$ name = "ServiceID",
$ title = "Выбрать",
$ source = $ this-> Servizi ()
),
)

$ actions = FieldList :: create (
FormAction :: create ('form', 'Send')
-> setUseButtonTag (правда)
-> addExtraClass ('btn btn-primary')
);

$ validator = new RequiredFields ('ServiceID');

$ form = новая форма ($ this, 'form', $ fields, $ actions, $ validator);
$ form-> setFormMethod ('POST', true);
вернуть $ форму;
}

публичная функция doform ($ data, $ form) {
$ Форма-> sessionMessage (
«Спасибо, наш консультант свяжется с вами как можно скорее», «хорошо»
);

$ submission = new RequestForm ();
$ Форма-> saveInto ($ представление);
$ Submission-> запись ();

return $ this-> redirectBack ();

}

}

всегда ноль
Я не знаю как решить

Да, это решило проблему!

класс MemberProfileViewer extends 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 () {
$ source = null;
if ($ id = $ this-> currentPageID ()) {
Session :: 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 = new FieldList (
CheckboxSetField :: создать (
$ name = "Сервис",
$ title = "Выбрать",
$ source = $ this-> Servizi ()
),
)

$ actions = FieldList :: create (
FormAction :: create ('form', 'Send')
-> setUseButtonTag (правда)
-> addExtraClass ('btn btn-primary')
);

$ validator = new RequiredFields ('Service');

$ 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 ();
$ Форма-> saveInto ($ представление);
$ Submission-> запись ();

$ Форма-> sessionMessage (
«Спасибо, наш консультант свяжется с вами как можно скорее», «хорошо»
);

Session :: ясно ( "FormData {$ форма-> GetName ()} данных..");
return $ this-> redirectBack ();

}

}

0

Решение

Ваша проблема, вероятно, из-за этой строки

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

Ваш метод Servizi() зависит от некоторой маршрутизации (вы пытаетесь получить идентификатор участника из URL). Метод не всегда верните хорошую карту для вашего CheckboxSetField. Если у вас нет маршрута для вашего Servizi() метод, вы, вероятно, не хотите перенаправить или вернуть ошибку http.

Теперь я не знаю, как вы получили свой идентификатор участника, так что вам решать, как вы получите это. Но вы сможете исправить это так.

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');
}

Код выше не проверен.

0

Другие решения

Я бы сделал:

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

По вопросам рекламы [email protected]