Jump to content

Recommended Posts

Posted

I think you can create a simple logout link with

<a href="admin/login/logout">log out</a>

But it redirects to the login form in the admin area. Can I hook into logout and change the redirect? Default redirect home would make sense.

Or is the way to do this still to create a logout template + page with session->logout()  and a redirect?

Posted

You can hook before ProcessLogin::executeLogout and set the desired url.

<?php

wire()->addHookBefore("ProcessLogin::executeLogout", null, "setRedirect");

function setRedirect(HookEvent $event) {
	$event->object->setLogoutURL($pages->get('/')->httpUrl);
}

 

 

  • Like 4
Posted

Thanks BitPoet.

I get server errors when I put this in ready.php.  - should it go there or could you also put it in a functions.php file within the templates folder? This is the error I get on logout:

Error: Uncaught Error: Call to a member function get() on null in /var/www/html/site/ready.php:6
Stack trace:
#0 /var/www/html/wire/core/WireHooks.php(777): setRedirect(Object(ProcessWire\HookEvent))
#1 /var/www/html/wire/core/Wire.php(402): ProcessWire\WireHooks->runHooks(Object(ProcessWire\ProcessLogin), 'executeLogout', Array)
#2 /var/www/html/wire/core/ProcessController.php(244): ProcessWire\Wire->__call('executeLogout', Array)
#3 /var/www/html/wire/core/Wire.php(374): ProcessWire\ProcessController->___execute()
#4 /var/www/html/wire/core/WireHooks.php(698): ProcessWire\Wire->_callMethod('___execute', Array)
#5 /var/www/html/wire/core/Wire.php(402): ProcessWire\WireHooks->runHooks(Object(ProcessWire\ProcessController), 'execute', Array)
#6 /var/www/html/wire/core/admin.php(113): ProcessWire\Wire->__call('execute', Array)
#7 /var/www/html/wire/modules/AdminTheme/AdminThemeReno/controller.php(13): require('/var/www/html/w...')
#8 /var/www/html/site/templates/admin.php(15): require('/ (line 6 of /var/www/html/site/ready.php) 

This error message was shown because: you are logged in as a Superuser. Error has been logged.

This version produces no errors, but doesn't do anything either:

wire()->addHookBefore("ProcessLogin::executeLogout", null, "setRedirect");

function setRedirect(HookEvent $event) {
	$event->object->setLogoutURL('/');
}

Probably unrelated, but does it make any difference if you do wire()->... or wire->... ?

Why is redirect to homepage not default behavior anyway?! The login form in the admin area is the last place you want to be when you log out. Wordpress has the same annoying illogical default behavior. Is there some obscure reason why it makes sense?

Posted

This should work:

    wire()->addHookBefore("ProcessLogin::executeLogout", null, "setRedirect");

    function setRedirect(HookEvent $event) {
        $event->object->setLogoutURL(wire('pages')->get('/')->httpUrl);
    }

 

  • Like 2
Posted

Thanks adrian !

Yes, that does seem to work.

I have seen another hooked function like this:

$wire->addHookAfter ...

Is wire() and $wire and wire-> etc. all the same? What's what? I guess I'll have to study up on that...

And would this work within the templates folder, in a functions.php or something like that? I'll have to try that...  The ready.php file is awkward.

Posted
2 hours ago, modifiedcontent said:

The ready.php file is awkward.

Why? Ready.php is my best friend :)

  • Like 1
Posted
3 hours ago, modifiedcontent said:

Is wire() and $wire and wire-> etc. all the same? What's what? I guess I'll have to study up on that...

Useful posts:

 

  • Like 2
Posted

adrian's solution works well, but causes an internal server error on one page that loads an external script:

2017-04-02 07:06:03	guest	http://mysite.com/http404/	Error: 	Cannot redeclare setRedirect() (previously declared in /var/www/html/site/assets/cache/FileCompiler/site/ready.php:5) (line 5 of /var/www/html/site/assets/cache/FileCompiler/site/ready.php)

Renaming the function did not fix it. Don't have time to dig into this right now. Leaving this note here and will report back...

  • 5 months later...
Posted
On 27/03/2017 at 5:25 PM, BitPoet said:

You can hook before ProcessLogin::executeLogout and set the desired url.


<?php

wire()->addHookBefore("ProcessLogin::executeLogout", null, "setRedirect");

function setRedirect(HookEvent $event) {
	$event->object->setLogoutURL($pages->get('/')->httpUrl);
}

 

Works well if you change null for $this. Was erroring before.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...