Trabalhando com Formulários =========================== Nesta seção descreve como se cria uma nova página com um formulário para obter dados a partir dos usuários. A página exibirá uma formulário com um campo para o nome e uma para o e-mail. Depois de obter essas duas informações a partir do usuário, a página exibirá os valores inseridos de volta para a confirmação. Para atingir este objetivo, além de criar uma [ação](structure-controllers.md) (action) e duas [visões](structure-views.md) (view), você também criará uma [modelo](structure-models.md) (model). Através deste tutorial, você aprenderá como: * Criar um [modelo](structure-models.md) (model) para representar os dados inseridos pelo usuário por meio de um formulário * Declarar regras (rules) para validar os dados inseridos * Criar um formulário HTML em uma [visão](structure-views.md) (view) Criando uma Modelo (Model) ---------------- Os dados a serem solicitados pelo usuário será representados por uma classe modelo `EntryForm` como mostro a seguir e salvos no arquivo `models/EntryForm.php`. Por favor consulte a seção [Autoloading de Classes](concept-autoloading.md) para mais detalhes sobre convenção de nomenclatura dos arquivos de classes. ```php Informação: O [[yii\base\Model]] é usado como pai das classes modelos que *não* são associadas com tabelas do banco de dados. O [[yii\db\ActiveRecord]] é normalmente usado como pai das classes modelos que correspondem a tabelas do banco de dados. A classe `EntryForm` contém dois atributos públicos, `name` e `email`, que são usados para guardar os dados fornecidos pelo usuário. Ele também contém um método chamado `rules()`, que retorna um conjunto de regras para validação dos dados. As regras de validação declaradas no código acima permitem que: * tanto os valores do `name` quanto do `email` sejam obrigatórios * os dados do `email` devem ser um e-mail válido sintaticamente Se você tiver um objeto `EntryForm` populado com dados fornecidos pelo usuário, você pode chamar o [[yii\base\Model::validate()|validate()]] para iniciar as rotinas de validação dos dados. A validação dos dados falhar, a propriedade [[yii\base\Model::hasErrors|hasErrors]] será definida como *true* e você pode saber quais erros ocorrerão pela validação através de [[yii\base\Model::getErrors|errors]]. ```php name = 'Qiang'; $model->email = 'bad'; if ($model->validate()) { // Bom! } else { // Falha! // Utilize $model->getErrors() } ``` Criando uma Ação ------------------ Em seguida, você precisará criar uma ação `entry` no controlador `site` que será usado no novo modelo. O processo de criação e utilização das ações são explicadas na seção [Como Fazer um "Hello World"](start-hello.md). ```php load(Yii::$app->request->post()) && $model->validate()) { // dados válidos recebidos pelo $model // fazer alguma coisa aqui sobre $model ... return $this->render('entry-confirm', ['model' => $model]); } else { // Ou a página é exibida inicialmente ou existe algum erro de validação return $this->render('entry', ['model' => $model]); } } } ``` A primeira ação cria um objeto `EntryForm`. Ele, então, tenta popular o modelo (model) com os dados vindos do `$_POST`, fornecidos pelo [[yii\web\Request::post()]] no Yii. Se o modelo (model) for populado com sucesso (por exemplo, se o usuário enviar o formulário HTML), a ação chamará o [[yii\base\Model::validate()|validate()]] para certifique-se que os valores fornecidos são válidos. > Informação: A expressão `Yii::$app` representa a instância da [aplicação](structure-applications.md), que é globalmente acessível via singleton. Também é um [service locator](concept-service-locator.md) que fornece componentes tais como `request`, `response`, `db`, etc. para suportar a funcionalidade específica. No código acima, o componente `request` da instância da aplicação é usada para acessar os dados do `$_POST`. Se tudo tiver certo, a ação renderizará a visão chamada `entry-confirm` para confirmar os dados enviados pelo usuário. Se ao enviar o formulário não houver dados ou se os dados tiverem erros, a visão `entry` será renderizada, em que o formulário será exibigo, juntamente com as mensagens de erros da validação. > Nota: Neste exemplo muito simples, acabamos de renderizar um página de confirmação mediante a dados válidos enviados de uma formulário. Em prática, você poderia considerar usar [[yii\web\Controller::refresh()|refresh()]] ou [[yii\web\Controller::redirect()|redirect()]] para evitar [problemas ao reenviar formulários](http://en.wikipedia.org/wiki/Post/Redirect/Get). Criando Visões -------------- Finalmente, crie dois arquivos de visões chamados de `entry-confirm` e `entry`. Estas visões serão renderizados pela ação `entry`, como descrito anteriormente. A visão `entry-confirm` simplesmente exibe os dados dos campos `name` e `email`. Deverá ser salvo no arquivo `views/site/entry-confirm.php`. ```php
You have entered the following information: