No Joomla 3.5.1, quero redirecionar os usuários para uma página específica, como:
https://www.domain.com/login?return=L2YlQzMlQjNydW0tcGVyZ3VudGFzLWUtcmVzcG9zdGFzL2NvbnZlcnNhdGlvbi9yZWFkLmh0bWw/aWQ9MjU=
Onde a string ?return=XXX
No final do URL, deve indicar para onde o usuário deve ir após o login, conforme:
https://docs.joomla.org/How_do_you_redirect_users_after_a_successful_login%3F
No entanto, isso não está funcionando: os usuários estão sendo redirecionados para a página de perfil.
PS: Estou usando uma substituição para com_users
Conforme essa outra pergunta.
NOTA:
base64_decode(L2YlQzMlQjNydW0tcGVyZ3VudGFzLWUtcmVzcG9zdGFzL2NvbnZlcnNhdGlvbi9yZWFkLmh0bWw/aWQ9MjU=)
Retorna a URL para a qual os usuários devem ser redirecionados.
NOTA 2:
Abaixo, você pode encontrar todo o código default_login.php
Usado na substituição. Está funcionando. Observe nas linhas 81-88 na instrução if em que a condição if($_SERVER['QUERY_STRING'])
NÃO está redirecionando para o URL que desejo, embora elseif($_SERVER['HTTP_REFERER']):
esteja funcionando perfeitamente redirecionando para a página em que estavam antes de efetuar login.
<?php
/**
* @package Joomla.Site
* @subpackage com_users
*
* @copyright Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
JHtml::_('behavior.keepalive');
?>
<div class="login<?php echo $this->pageclass_sfx?>">
<?php if ($this->params->get('show_page_heading')) : ?>
<div class="page-header">
<h1>
<?php echo $this->escape($this->params->get('page_heading')); ?>
</h1>
</div>
<?php endif; ?>
<?php if (($this->params->get('logindescription_show') == 1 && str_replace(' ', '', $this->params->get('login_description')) != '') || $this->params->get('login_image') != '') : ?>
<div class="login-description">
<?php endif; ?>
<?php if ($this->params->get('logindescription_show') == 1) : ?>
<?php echo $this->params->get('login_description'); ?>
<?php endif; ?>
<?php if (($this->params->get('login_image') != '')) :?>
<img src="<?php echo $this->escape($this->params->get('login_image')); ?>" class="login-image" alt="<?php echo JText::_('COM_USERS_LOGIN_IMAGE_ALT')?>"/>
<?php endif; ?>
<?php if (($this->params->get('logindescription_show') == 1 && str_replace(' ', '', $this->params->get('login_description')) != '') || $this->params->get('login_image') != '') : ?>
</div>
<?php endif; ?>
<form action="<?php echo JRoute::_('index.php?option=com_users&task=user.login'); ?>" method="post" class="form-validate form-horizontal well">
<fieldset>
<?php foreach ($this->form->getFieldset('credentials') as $field) : ?>
<?php if (!$field->hidden) : ?>
<div class="control-group">
<div class="control-label">
<?php echo $field->label; ?>
</div>
<div class="controls">
<?php echo $field->input; ?>
</div>
</div>
<?php endif; ?>
<?php endforeach; ?>
<?php if ($this->tfa): ?>
<div class="control-group">
<div class="control-label">
<?php echo $this->form->getField('secretkey')->label; ?>
</div>
<div class="controls">
<?php echo $this->form->getField('secretkey')->input; ?>
</div>
</div>
<?php endif; ?>
<?php if (JPluginHelper::isEnabled('system', 'remember')) : ?>
<div class="control-group">
<div class="control-label"><label><?php echo JText::_('COM_USERS_LOGIN_REMEMBER_ME') ?></label></div>
<div class="controls"><input id="remember" type="checkbox" name="remember" class="inputbox" value="yes"/></div>
</div>
<?php endif; ?>
<div class="control-group">
<div class="controls">
<button type="submit" class="btn btn-primary">
<?php echo JText::_('JLOGIN'); ?>
</button>
</div>
</div>
<?php if($_SERVER['QUERY_STRING']):
$retorno=$_SERVER['QUERY_STRING'];
$retorno=(str_replace('return=', '', $retorno)); ?>
<input type="hidden" name="redirect" value="<?php echo urlencode(base64_encode($retorno));?>" />
<?php elseif($_SERVER['HTTP_REFERER']): ?>
<input type="hidden" name="return" value="<?php echo base64_encode($_SERVER['HTTP_REFERER']);?>" />
<?php endif; ?>
<?php echo JHtml::_('form.token'); ?>
</fieldset>
</form>
</div>
<div>
<ul class="nav nav-tabs nav-stacked">
<li>
<a href="<?php echo JRoute::_('index.php?option=com_users&view=reset'); ?>">
<?php echo JText::_('COM_USERS_LOGIN_RESET'); ?></a>
</li>
<li>
<a href="<?php echo JRoute::_('index.php?option=com_users&view=remind'); ?>">
<?php echo JText::_('COM_USERS_LOGIN_REMIND'); ?></a>
</li>
<?php
$usersConfig = JComponentHelper::getParams('com_users');
if ($usersConfig->get('allowUserRegistration')) : ?>
<li>
<a href="<?php echo JRoute::_('index.php?option=com_users&view=registration'); ?>">
<?php echo JText::_('COM_USERS_LOGIN_REGISTER'); ?></a>
</li>
<?php endif; ?>
</ul>
</div>
Primeiro de tudo, o login com_users é gravado para usar o método POST
, portanto, adicionar ?return=
Não oferece nada, não funcionará.
Se não especificarmos o retorno nos dados da postagem, o modelo usará o apontador padrão no perfil.
Retorno deve me um interno. Não redirecione para um URL externo ou ele será substituído por padrão, redirecionamento de perfil.
Em parte de vista, o joomla verifica se você está no menu apontado para o login, se estiver, você pode definir um parâmetro "Login redirect" para apontar o redirecionamento. Descrições de parâmetros:
Depois de tudo isso, o retorno é definido no valor do formulário de retorno.
Portanto, da minha perspectiva do código, a criação de substituição de modelo é boa, mas lembre-se de usar links internos. Isso pode passar na validação JUri::isInternal
.
EDIT: bom uso do retorno: <input type="hidden" name="return" value="<?php echo base64_encode('index.php?option=com_mycomponent&view=myview'); ?>"/>
EDIT 2: Rember nunca usa o JRoute em troca, não é um URL interno válido ... apenas index.php
Exemplo:
<?php
/**
* Return Override - START
*/
// grab old form Return Value
$form_return = $this->form->getValue('return');
$new_return = 'index.php?option=com_mycomponent&view=myview';
?>
<input type="hidden" name="return" value="<?php echo base64_encode($this->params->get('login_redirect_url', $new_return)); ?>" />
<?php
/**
* Return Override - End
*/
?>
Então tente isso em casa, eu te desafio! ; )
Acho que você precisará fornecer um pouco mais de detalhes para obter uma resposta exata, mas sugiro fazer o seguinte.
<input type="hidden" name="return" value="<?php echo base64_encode($_SERVER['HTTP_REFERER']); ?>" />
, em seguida, escreva echo $_SERVER['HTTP_REFERER'];
para tela - verifique se é o URL certo.Se isso não funcionar, eu adicionaria o conteúdo do seu arquivo de substituição à sua pergunta, pois isso pode dar às pessoas mais para continuar.
(Além disso, como um remendo aparte é importante e o 3.4.5 está desatualizado, embora eu não acredite que seja um bug relacionado a isso)
Atualizar:
O problema pode ser que você esteja usando $ _SERVER ['QUERY_STRING']) em vez do JInput do Joomla Framework para obter seus parâmetros de URL.
Veja: https://docs.joomla.org/Retrieving_request_data_using_JInput
Você também não precisa desse código de URL em algo que está sendo codificado em base_64.
Além disso, você disse que queria redirecionar para uma página específica, mas parece estar fazendo isso como se o valor de retorno fosse dinâmico.
Lanah também apontou que $ _SERVER ['HTTP_REFERER'] pode apontar para google.com ou ficar vazio se você acessar a página diretamente. Convém adicionar validação adicional para ocasiões em que esse problema é resolvido.
Eu faço algo semelhante nas seções de administrador. Eu redireciono os usuários para um URL de componente específico após o login: https://github.com/blackbricksoftware/joomla-adminredirect .
Você precisa de um plug-in para se conectar ao método onUserAfterLogin
de um plug-in de usuário. Substitua o arquivo principal no exemplo de plug-in acima por algo como isto:
<?php defined('_JEXEC') or die;
// http://docs.joomla.org/Plugin/Events/System
// http://docs.joomla.org/J2.5:Creating_a_System_Plugin_to_augment_JRouter
// http://docs.joomla.org/J3.x:Creating_a_Plugin_for_Joomla
class PlgUserAdminRedirect extends JPlugin {
public function __construct(&$subject, $config) {
parent::__construct($subject, $config);
}
public function onUserAfterLogin() {
$app = JFactory::getApplication();
$return = $app->input->getBase64('return');
if (empty($return)) return;
$app->redirect(JRoute::_($redirecturl,false));
}
}