Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

Custom Login in SS3.1


Reply


6 Posts   472 Views

Avatar
lozhowlett

Community Member, 146 Posts

15 January 2014 at 2:05am

Hi Everyone

Well I am having a complete nightmare with the Member system and creating a custom login page, who knew it would be nearly impossible to work with and without proper documentation anywhere!

I am simply trying to build a login page for members that have a certain Boolean checked, and then redirect them to a different page. However I am suffering barriers in all directions.

The current ones are:

1. [Strict Notice] Non-static method Controller::redirect() should not be called statically, assuming $this from incompatible context
2. When clicking the logout button it takes me no a white screen

CustomLogin .php

<?php
class CustomLogin extends MemberLoginForm {

// this function is overloaded on our sublcass (this) to do something different
public function dologin($data) {
if($this->performLogin($data)) {
if(!$this->redirectByGroup($data)){
return Controller::redirect("/home");
//echo 'done';
}
} else {
if($badLoginURL = Session::get("BadLoginURL")) {
return Controller::redirect($badLoginURL);

} else {
return Controller::redirectBack();
}
}
}

public function redirectByGroup($data) {
// gets the current member that is logging in.
$member = Member::currentUser();
// gets all the groups.
$Groups = DataObject::get("Group");

//cycle through each group
foreach($Groups as $Group){
//if the member is in the group and that group has GoToAdmin checked
if($member->inGroup($Group->ID) && $Group->GoToAdmin == 1)
{
//redirect to the admin page
return Controller::redirect('/admin');
return true;
}
//otherwise if the member is in the group and that group has a page link defined
elseif($member->inGroup($Group->ID) && $Group->GoToMemberProfile == 1)
{
Controller::redirect('/members/profile');
return true;
}

}
//otherwise if none of the above worked return fase
return false;

}

}
?>

GroupDecorator.php

<?php
class GroupDecorator extends DataExtension {

static $db = array (
"GoToAdmin" => "Boolean",
"GoToMemberProfile" => "Boolean"
);

private static $has_one = array(
);

function updateCMSFields(FieldList $fields) {
$fields->push(new CheckboxField("GoToAdmin", " Go to Admin area"), "Members");
$fields->push(new CheckboxField("GoToMemberProfile", " Go to Member area"), "Members");
}

}

_config.php

Object::useCustomClass('MemberLoginForm', 'CustomLogin');
//Tells silverstripe to add our extention to the group class
Object::add_extension('Group', 'GroupDecorator');

MemberLoginPage.php

...
class MemberLoginPage_Controller extends Page_Controller {

   private static $allowed_actions = array (
      "LoginForm"
   );

   function LoginForm() {
$form = new CustomLogin($this,"LoginForm");
// print_r($_REQUEST);
return $form;
}

}

Any help will be great. I have looked at the SSBits tutorial, I have tried the member profiles extension on GitHub, read hours of documentation and nothing is giving in!

Thanks

Avatar
swaiba

Forum Moderator, 1799 Posts

15 January 2014 at 2:36am

Hi Lawrence,

I've not customized it yet - am hoping to reuse the current code as much as possible. However here is a complete working example in a module - it's what I intend to reference when I add it

https://github.com/axyr/silverstripe-adminlogin

Avatar
lozhowlett

Community Member, 146 Posts

15 January 2014 at 2:40am

I Got this working in the end by changing the dologin into a single function, exact same code, just one function, it then didnt throw a wobbly at me about strict notices!

<?php
class CustomLogin extends MemberLoginForm {

// this function is overloaded on our sublcass (this) to do something different
public function dologin($data) {
if($this->performLogin($data)) {

$member = Member::currentUser();
// gets all the groups.
$Groups = DataObject::get("Group");

//cycle through each group
foreach($Groups as $Group){
//if the member is in the group and that group has GoToAdmin checked
if($member->inGroup($Group->ID) && $Group->GoToAdmin == 1)
{
//redirect to the admin page
return Controller::redirect('/admin');
}
//otherwise if the member is in the group and that group has a page link defined
elseif($member->inGroup($Group->ID) && $Group->GoToMemberProfile == 1)
{
return Controller::redirect('/members/profile');
}

}

return Controller::redirect("/home");

} else {
if($badLoginURL = Session::get("BadLoginURL")) {
return Controller::redirect($badLoginURL);

} else {
return Controller::redirectBack();
}
}
}

}
?>

Not this why SS threw a strict notice before tho?

Avatar
Willr

Forum Moderator, 5513 Posts

16 January 2014 at 8:33pm

As the strict notice says, Controller::redirect() is not static so you cannot call it like that, You'll need to do Controller::curr()->redirect($badLoginURL);

Avatar
lozhowlett

Community Member, 146 Posts

17 January 2014 at 2:23am

Sorry Wiilr, I dont follow - is there anywhere I can read up on "static" to get an understanding of it?

Avatar
Willr

Forum Moderator, 5513 Posts

17 January 2014 at 5:25pm

http://www.php.net/manual/en/language.oop5.static.php