0 follower

Criando uma Ação

Uma vez que temos um modelo pronto, podemos começar a escrever a lógica necessária para manipula-lo. Devemos colocar essa lógica dentro de uma ação no controle. Para o exemplo do formulário de login, o código a seguir é necessário:

public function actionLogin()
{
    $form=new LoginForm;
    if(isset($_POST['LoginForm']))
    {
        // coleta a informação inserida pelo usuário
        $form->attributes=$_POST['LoginForm'];
        // valida a entrada do usuário e redireciona para a página anterior, caso valide
        if($form->validate())
            $this->redirect(Yii::app()->user->returnUrl);
    }
    // exibe o formulário de login
    $this->render('login',array('user'=>$form));
}

No código acima, primeiro criamos uma instância de um LoginForm. Se a requisição for do tipo POST (indicando que um formulário de login foi enviado), nós preenchemos o $form com os dados enviados via $_POST['LoginForm']. Em seguida, validamos os dados e, em caso de sucesso, redirecionamos o navegador para a página que requisitou a autenticação. Se a validação falhar, ou se for o primeiro acesso a essa ação, renderizamos o conteúdo da visão 'login', que será descrita na próxima subseção.

Dica: Na ação login, utilizamos a propriedade Yii::app()->user->returnUrl para pegar a URL da página que necessitou a autenticação. O componente Yii::app()->user é do tipo CWebUser (ou de uma classe derivada dele) que representa a sessão com as informações do usuário (por exemplo, nome de usuário, status). Para mais detalhes, veja Autenticação e Autorização.

Vamos dar uma atenção especial para o seguinte trecho de código que aparece na ação login:

$form->attributes=$_POST['LoginForm'];

Como descrevemos em Atribuição Segura de Atributos, essa linha de código preenche um modelo com as informações enviadas pelo usuário. A propriedade attributes é definida pela classe CModel que espera um vetor de pares nome-valor, e atribui cada valor ao atributo correspondente no modelo. Sendo assim, se $_POST['LoginForm'], contém um vetor desse tipo, o código acima seria o equivalente ao código mais longo abaixo (assumindo que todos os atributos necessários estão presentes no vetor):

$form->username=$_POST['LoginForm']['username'];
$form->password=$_POST['LoginForm']['password'];
$form->rememberMe=$_POST['LoginForm']['rememberMe'];

Nota: Para fazer com que a variável $_POST['LoginForm'] nos retorne um vetor em vez de uma string, utilizamos uma convenção ao nomear os campos do formulário na visão. Para um campo correspondente ao atributo a de um modelo da classe C, seu nome será C[a]. Por exemplo, utilizamos LoginForm[username] para nomear o campo correspondente ao atributo username do modelo LoginForm.

O trabalho restante agora é criar a visão login que deve conter um formulário HTML com os campos necessários.