You are on page 1of 24

Esta uma traduo de uma srie de artigos intitulados "Learning the Yii Framework", originalmente escritos em Ingls e publicados

s por Larry Ullman.

Introduo ao Framework Yii


A primeira coisa que voc precisa para usar o framework Yii acesso a um servidor Web com PHP instalado, claro. Mas se voc est lendo isso, vou assumir que voc tem acesso a um servidor PHP. Note que o framework Yii requer PHP 5.1 ou superior. Felizmente, o framework ir testar a configurao para voc! Comece fazendo o download da ltima verso estvel do Framework Yii. No momento da redao deste texto, a 1.1.4. O arquivo ter um nome como yii-version.release.ext e tem apenas cerca de 2MB. Extraia o contedo do arquivo baixado para criar uma pasta com: documentos de texto CHANGELOG, LICENSE, README, e UPGRADE pasta demos pasta framework pasta requirements

Voc deve ler os documentos README e LICENSE, claro, mas as pastas so mais importantes aqui. A pasta demos contm quatro aplicaes web escritas usando Yii: um blog, o jogo de forca, um "Ol Mundo!" bsico e uma agenda de telefones. As demos so timas para ver cdigo funcional enquanto voc est tentando escrever o seu prprio. A pasta framework o que exigido por qualquer site usando Yii. A pasta de requirements algo simples e brilhante... Presumo tambm que voc j sabe qual o diretrio raiz da Web em seu computador ou servidor: esta a pasta para onde a URL aponta. Em outras palavras, quando voc vai para http://localhost ou http://www.example.com em seu navegador, ele recebe os documentos da pasta raiz da Web. Seguindo as convenes do Yii, eu vou chamar esta de WebRoot. Crie uma nova pasta em seu WebRoot chamada yii, e copie as pastas framework e requirements para l. Ento v para yourURL/yii/requirements em seu navegador da Web (por exemplo: http://localhost/yii/requirements). Voc dever ver um relatrio informado se a sua instalao atende aos requisitos mnimos ou no.

Assumindo que sua configurao passou em todos os requisitos, voc est apto para seguir em frente. Note que voc no precisa necessariamente de todas as extenses: voc s precisa realmente dos requisitos do framework Yii, PDO, e a extenso PDO do banco de dados que voc vai usar. (Se voc no est familiarizado com ele, PDO uma camada de abstrao de banco de dados, fazendo com que os sites sejam agnsticos ao banco de dados.) No prximo captulo, vou mostrar-lhe como usar as ferramentas de linha de comando do Yii para criar a sua primeira aplicao web. uma coisa muito fcil e a coisa mais prxima de Ruby on Rails que eu j vi (o que eu considero uma coisa muito boa). Captulos posteriores iro orient-lo no desenvolvimento de uma aplicao baseada no Yii.

Iniciando com o Framework Yii


Para o exemplo especfico, eu vou usar um aplicativo Web, com uma lista de departamentos e uma lista de empregados, cada empregado estando em apenas um departamento. Este um exemplo fcil de entender, prtico, usa mais de uma tabela de banco de dados, e extensvel de muitas maneiras. Para comear, voc vai usar as ferramentas de linha de comando de Yii para criar a estrutura do aplicativo. Se voc vai colocar o site em um servidor onde no tem acesso a linha de comando, voc deve instalar um servidor Web completo (Apache, PHP, MySQL, etc) em seu computador, executar essas etapas, e em seguida, fazer o upload do projeto finalizado. Se voc ainda no tem um servidor Web no seu computador, eu recomendo usar o XAMPP (para Windows) ou MAMP (para Mac),

pois ambos so gratuitos e extremamente fceis de usar. A primeira coisa que voc precisa fazer certificar-se de que voc tem a verso mais recente do framework Yii. Ento voc vai querer colocar a pasta do framework em um local adequado no servidor. Voc no precisa coloc-lo dentro do diretrio Web (sem dvida, voc no deveria), mas nas proximidades, como no diretrio do exemplo abaixo. Por exemplo, na minha configurao, a pasta htdocs a raiz da Web, o que quer dizer que http://www.example.com aponta para l.

Dica: Se voc vai usar o Yii para vrios sites no mesmo servidor, coloque a pasta do framework em uma estrutura lgica de diretrio relativa a cada site. Dessa forma, quando voc atualizar o framework, voc s precisa substituir os arquivos em um s lugar. Em seguida, voc vai precisar acessar a linha de comando, como uma janela do DOS / console no Windows ou o aplicativo Terminal no Mac OS X (e algumas verses do Linux). Em seguida, v para o diretrio do framework. No meu servidor, isso significa executar esta linha:
cd /Users/larryullman/Sites/YiiBlogSite/framework

Voc vai precisar mudar os dados para corresponder sua configurao. O prximo passo informar ao aplicativo yiic, encontrado na pasta framework, para criar um novo site. A sintaxe
yiic webapp path/to/directory

Mas antes mesmo de comear a usar este comando, deixe-me explicar um pouco, porque muito importante e pode ser complicado. O arquivo yiic um executvel que executado usando PHP de linha de comando do computador e que realmente s chama o script yiic.php. Voc pode cham-lo usando apenas yiic ou usando ./yiic (ou seja, executar o comando yiic encontrado no diretrio atual). Ou voc pode chamar mais explicitamente usando php yiic ou php yiic.php. Ou voc pode precisar para indicar o executvel do PHP ser usado: C:\php\php.exe yiic. Voc deve tentar as variaes sobre este comando, conforme o seu computador, apenas para ter certeza de que voc pode invocar o yiic, antes de tentar criar o aplicativo Web. Alm de executar corretamente o script yiic, outra pegadinha pode surgir se voc tiver mais de uma verso do PHP instalada no seu computador. Para confirmar a verso que est sendo usada, execute o comando php -v (de novo, voc pode precisar fornecer o caminho completo para o executvel do PHP). No Mac OS X e Unix, voc pode usar o which php para revelar o executvel do PHP sendo usado pelo comando php. Estes passos podem ajudar a resolver problemas confusos. Por exemplo, no meu Mac, eu uso o MAMP Pro para desenvolvimento Web com PHP e MySQL, mas quando eu executo o PHP atravs da linha de comando, eu vou realmente invocar o PHP instalado com o sistema operacional. Isso pode ser um problema, como as diferentes verses do PHP podem ou no atender aos requisitos descritos no Yii. Eu sei que quando eu tentei isso, o PHP de linha de comando

(instalado com o sistema operacional) no suporta a extenso PDO necessria, mesmo que a verso Web do PHP (em MAMP Pro) suportasse. Minha soluo foi explicitamente nomear o meu executvel PHP do MAMP ao executar yiic: /Applications/MAMP/bin/php5.3/bin/php yiic. Depois de saber que voc descobriu a sintaxe apropriada para invocar yiic, voc adiciona webapp, que o comando para "criar um novo aplicativo Web". Acrescente o caminho para o aplicativo Web em si. Dada a estrutura de diretrio j indicada (na figura acima), o comando seria apenas
./yiic webapp ../htdocs

ou
php yiic webapp ../htdocs

Ou qualquer variao que voc precise para usar. Voc ser solicitado a confirmar se deseja criar um aplicativo Web no diretrio informado. Digite Y (ou Yes) e pressione Enter. Depois de vrias linhas de informaes, voc deve ver uma mensagem dizendo que o aplicativo foi criado com sucesso. Para confirmar isso, carregar o site no seu navegador (informado a URL adequada, claro):

Quanto funcionalidades, o aplicativo gerado j inclui: uma primeira pgina com informaes adicionais um formulrio de contato, com CAPTCHA um formulrio de login a capacidade de saudar um usurio logado por nome funcionalidade de logout

um comeo muito bom para uma aplicao, especialmente considerando que voc ainda no escreveu uma linha de cdigo. Note que o formulrio de contato s ir funcionar aps voc editar a configurao para fornecer seu endereo de e-mail. Para o login, voc pode usar (usurio/senha): demo/demo ou admin/admin. Por fim, a aparncia exata da aplicao pode variar de uma verso do framework Yii para outra. Em termos de arquivos no servidor, dentro do diretrio do aplicativo (htdocs, para mim), voc vai encontrar: assets

css images index-test.php index.php protected themes

A pasta assets ser utilizada pelo framework Yii principalmente para integrao com jQuery (framework JavaScript). As pastas css e images so bvias. Todo o site tambm ser executado atravs de um dos dois arquivos de ndice (index.php, index-test.php). A pasta protected realmente a mais importante: voc vai editar o cdigo encontrado na pasta para alterar a aparncia e comportamento do site. E themes permite criar variaes sobre o template do site, assim como temas de um blog WordPress. Dica: A pasta assets deve ter permisso de escrita para o servidor Web, ou ento erros estranhos iro ocorrer. Este no deve ser um problema a menos que voc transfira um site Yii de um servidor para outro, e as permisses no estejam corretas, aps o processo. Ento esse o incio de uma aplicao Web baseada no Yii. Para cada site que voc criar usando o Yii, voc provavelmente vai passar por essas etapas. No prximo captulo, eu vou comear a demonstrar como voc pode configurar o aplicativo, e alter-lo para um exemplo com empregados e departamentos.

Configurando o Yii
H algumas maneiras de configurar como sua aplicao Yii se comporta. Para a maioria, voc vai fazer isso atravs do arquivo protected/config/main.php, mas primeiro eu quero falar sobre o arquivo index.php, criado no seu diretrio raiz do aplicativo web. Este um arquivo de "arranque" (bootstrap), o que significa que todas as interaes com o usurio, na verdade, passaro por ele. Por exemplo, mostrar um registro de funcionrio pode ser atravs da URL www.example.com/index.php/employee/show/id/34 e atualizar um registro de departamento pode envolver enviar um formulrio para www.example.com/index.php/department/update/id/3. Ambas URLs solicitam apenas um script PHP. O arquivo index.php gerado quando voc usa o script de linha de comando yiic. H apenas sete linhas de cdigo no comentadas nele. A primeira identifica a localizao do framework Yii:
$yii=dirname(__FILE__).'/../framework/yii.php';

O caminho indicado j deve estar correto (porque ele criado quando o framework usado para criar a aplicao), mas voc pode alterar esse valor se voc mover o framework ou o arquivo de ndice. A segunda linha identifica onde o arquivo de configurao est:
$config=dirname(__FILE__).'/protected/config/main.php';

O comportamento padro colocar o diretrio protected, onde todos os arquivos do aplicativo residem, no mesmo diretrio que o arquivo de ndice. Minha inclinao mov-lo para fora do diretrio da Web, assim:

Nesse caso, eu edito o meu arquivo index.php para termos:


$config= '../protected/config/main.php';

Note-se que perfeitamente razovel mover a localizao dos arquivos de sua aplicao (ou seja, a pasta protected), mas voc no deve alterar os nomes ou a estrutura das pastas encontradas dentro do diretrio protected. Dica: Mover a pasta protected para fora do diretrio raiz da Web apenas uma precauo de segurana extra. No necessrio, e voc pode no querer se preocupar com a mudana, especialmente enquanto voc est apenas comeando. A prxima linha de cdigo liga o modo de depurao:
defined('YII_DEBUG') or define('YII_DEBUG',true);

Voc vai querer a depurao ativada no desenvolvimento de um site, mas desativado, uma vez em produo. Para desativar a depurao, remover ou comentar essa linha. Eu normalmente apenas comento-a, para que eu possa reativar a depurao mais tarde. Ou voc pode alter-la para algo como isso, de modo que voc pode adicionar a depurao para uma pgina sob demanda:
if (isset($_GET['debug'])) define('YII_DEBUG', true);

Se voc fizer isso, ento para depurar qualquer pgina sob demanda, altere a URL, por exemplo, www.example.com/index.php/site/contact para www.example.com/index.php/site/contact/debug/true.

A prxima linha de cdigo determina quantos nveis da "pilha de chamadas" (call stack) so mostrados em uma mensagem de log:
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);

A "pilha de chamadas" uma histria de que arquivos, funes, etc, esto includos, chamadas, e assim por diante. Com um framework, o carregamento simples da pgina inicial poderia facilmente envolver uma dezena de aes. A fim de limitar os dados registrados (isto , logados) com as informaes mais recentes, teis, a pilha de chamadas limitada pela linha a apenas as ltimas trs aes. As duas ltimas linhas do arquivo de inicializao incluem o framework e iniciam o aplicativo. No mexa com estas!
require_once($yii); Yii::createWebApplication($config)->run();

E isso realmente tudo o que h a fazer na pgina index.php. A partir do Yii 1.1, o framework cria outro arquivo bootstrap: index-test.php. exatamente o mesmo que o index.php, exceto que o index-test.php inclui um arquivo de configurao diferente: /protected/config/test.php em vez de /protected/config/main.php. No entanto, o arquivo de configurao de teste inclui apenas o arquivo de configurao principal, em seguida, tambm habilita o componente CDbFixtureManager, que usado para testes de unidade. O arquivo index-test.php tambm omite a limitao da pilha de chamadas. A maior parte da configurao ocorre no arquivo de configurao main.php, encontrado dentro do diretrio protected/config (veja a imagem acima). H tambm um arquivo de configurao console.php, mas isso para uma verso de linha de comando da aplicao. Eu no vou discutir isso aqui, mas voc ir edit-lo se voc tiver scripts de linha de comando associados com o aplicativo. O arquivo de configurao retorna um array multi-dimensional de informaes, algumas das quais so pr-definidas. Voc precisa ter certeza de que a sintaxe apropriada mantida ao editar este arquivo, ento tome cuidado na correspondncia parnteses e vrgulas onde for necessrio. Para comear, voc vai querer mudar o nome do aplicativo, que usado no layout HTML padro, em ttulos da pgina, e assim por diante:
'name'=>'Wicked Cool Yii Site',

Em seguida, na seo modules do array retornado, voc deve habilitar o Gii. Gii uma ferramenta Web que voc vai usar para gerar Models (Modelos), Views (Vises) e Controllers (Controladores) para a aplicao. Para habilitar o Gii, basta remover as tags de comentrio /* e */ que envolvem este cdigo:
'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'SECURE', ),

Tambm introduza uma senha segura no cdigo, uma que s voc saber. Dica: o Gii foi adicionado ao Yii na verso 1.1.2, e substitui a funcionalidade disponvel usando as ferramentas de linha de comando do Yii. Seguindo no arquivo, na seo components do array retornado, voc provavelmente vai querer habilitar o urlManager. Basta remover os cdigos de comentrio que envolvem o seguinte:
'urlManager'=>array( 'urlFormat'=>'path',

'rules'=>array( '<controller:w+>/<id:d+>'=>'<controller>/view', '<controller:w+>/<action:w+>/<id:d+>'=>'<controller>/<action>', '<controller:w+>/<action:w+>'=>'<controller>/<action>', ), ),

Este componente muda as URLs para serem mais amigveis para Search Engines e usurios. Por exemplo, a URL padro para uma pgina poderia ser algo como www.example.com/index.php? r=site/contact, mas o urlManager vai transformar isso em www.example.com/index.php/site/contact. Se voc quiser ir mais longe, possvel configurar o urlManager, juntamente com um arquivo .htaccess do Apache, de modo que index.php no precisa mais ser parte da URL. Em seguida, voc quase sempre vai querer estabelecer a conexo de banco de dados (a menos que voc no esteja usando um banco de dados, claro). Para isso, retornar um array que inclui uma connection string, um nome de usurio e uma senha. Por padro, uma connection string prdefinida para o banco de dados SQLite:
'db'=>array( 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db', ),

Se voc estiver usando SQLite, basta alterar o cdigo para que ele aponte para o local do seu banco de dados SQLite. Se voc no est usando SQLite, comente ou remova essas trs linhas de cdigo. Se voc estiver usando o MySQL, o cdigo apropriado deve ser algo como:
'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=testdrive', 'emulatePrepare' => true, 'username' => 'username', 'password' => 'password', 'charset' => 'utf8', ),

A connection string um DSN (nome da fonte de banco de dados Database Source Name), que tem um formato especfico. Ela comea com uma palavra-chave que indica o aplicativo de banco de dados a ser utilizado, como mysql, pgsql (PostgreSQL), mssql (Microsoft SQL Server), ou OCI (Oracle). Esta palavra-chave seguida por dois pontos, ento, dependendo da aplicao de banco de dados a ser utilizada, e o ambiente de servidor, um certo nmero de parmetros, cada um separado por um ponto e vrgula:
mysql:host=localhost;dbname=test mysql:port=8889;dbname=somedb mysql:unix_socket=/path/to/mysql.sock;dbname=whatever

Indicar a base de dados a ser utilizada o mais importante. Para mim, quando uso o MAMP no Mac OS X, eu tenho que definir o nmero da porta, pois no o padro esperado (3306). No Mac OS X Server, eu tive que especificar o socket, pois o padro esperado no estava sendo utilizado l. Tambm tenha em mente que voc precisa ter as extenses do PHP adequadas instaladas para o banco de dados correspondente, como PDO e PDO MySQL. Voc deve, obviamente, mudar os valores do nome de usurio e senha para os valores adequados para o seu banco de dados. Voc pode ou no querer mudar o conjunto de caracteres (character set). Dentro da seo do componente de log, eu habilito o CWebLogRoute. Esta uma ferramenta de depurao maravilhosamente til que adiciona toneladas de detalhes a cada pgina processada. Aqui est o cdigo para o arquivo de configurao:
'log'=>array(

),

'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error, warning', ), array ( 'class' => 'CWebLogRoute' ) ),

E aqui est um exemplo de sada:

Finalmente, no final do arquivo de configurao padro, voc vai encontrar o parmetro adminEmail. Mude-o para o seu endereo de e-mail, para que voc receba mensagens de erro, envios de formulrios de contato, etc:
'params'=>array( 'adminEmail'=>'whatever@example.edu', ),

Como voc pode perceber, edio e adio de componentes onde muito da configurao ocorre. Os que eu destaquei so apenas os mais imediatamente importantes, na minha opinio, mas certamente h outros, envolvendo cache, segurana, temas e muito mais. Um recurso interessante do Yii que nem todos os componentes nomeados sero carregados para cada solicitao. Alguns, como os componentes de log so, mas outros so carregados apenas quando necessrios, minimizando o impacto no desempenho do uso de muitos componentes. Um parmetro a mais de configurao que costumava estar no arquivo de configurao padro, mas

agora precisa ser adicionado um indicador do controlador padro. Em outras palavras, se nenhum controlador est especificado na URL, qual controlador ir ser chamado? Sem configurao adicional, o "site" controller ser o padro. Para mudar isso para um controlador diferente, acrescente:
'defaultController' => 'login',

Note que esta linha em particular no vai funcionar imediatamente pois s o controlador site existe no momento. Mas voc poderia fazer esta mudana se voc tivesse criado um arquivo protected/controllers/LoginController.php (ou se algum outro arquivo controlador existe e voc quer que ele seja o padro). Note tambm que voc deve adicionar esta linha de modo que seja um elemento de nvel superior do array retornado (ou seja, ele no vai em qualquer outra seo, mais fcil adicion-lo entre os elementos "basePath" e "name", para maior clareza). E isso uma introduo rpida de como configurar seu aplicativo Yii. No prximo captulo, vou discutir um projeto de banco de dados que eu vou usar nos captulos posteriores. Depois disso, eu vou te mostrar a mgica: models, views e controllers gerados automaticamente usando ferramentas do Yii.

Definio de bancos de dados para a aplicao Yii


O objetivo aqui criar uma aplicao Web que permitir voc adicionar, editar, visualizar e apagar os departamentos e funcionrios de uma empresa hipottica. Essas quatro caractersticas so conhecidas como CRUD: Create (ou seja, INSERT), Retrieve (ou seja, SELECT), Update e Delete. Estes quatro atos so a base de todo o sistema de gerenciamento de contedo, e outros sistemas de armazenamento de dados. Para conseguir isso, voc precisa criar uma srie de arquivos para ambos funcionrios e departamentos: Um arquivo de modelo (Model), que define a coisa em si Um arquivo controlador (Controller), que define as aes que podem ser tomadas com a coisa Vrios arquivos de viso (View), que atuam como a interface do usurio, incluindo formulrios para adicionar novos itens e atualizar os j existentes Com alguns frameworks, fazer tudo isso requer um pouco de trabalho repetitivo: escolher um modelo, copiar, colar, editar, criar novos arquivos, etc, etc. Com o Yii, e com outros frameworks como Ruby on Rails, a maioria do trabalho ser feito por voc, fazendo a preparao adequada e em seguida, chamando as ferramentas embutidas. Para comear, ento, eu preciso pensar sobre os modelos, que sero representados atravs de tabelas de banco de dados neste exemplo. As duas tabelas sero bastante simples, com uma relao um-para-muitos entre elas: haver muitos funcionrios em cada departamento, mas cada funcionrio ser de apenas um departamento. Voc pode colocar o que quiser na sua tabela de funcionrios, mas para os objetivos do "Aprendendo Yii com Larry Ullman", o que teremos vai ser definido com o comando SQL
CREATE TABLE Employee ( id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, departmentId TINYINT UNSIGNED NOT NULL COMMENT "CONSTRAINT FOREIGN KEY (departmentId) REFERENCES Department(id)", firstName VARCHAR(20) NOT NULL, lastName VARCHAR(40) NOT NULL, email VARCHAR(60) NOT NULL, ext SMALLINT UNSIGNED NULL, hireDate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

leaveDate DATETIME NULL, INDEX name (lastName, firstName), INDEX (departmentId) )

Por conveno melhor seguir as regras do framework. Por exemplo, eu uso normalmente todas as letras minsculas e sublinhados para meus nomes de coluna (por exemplo, first_name), mas eu estou usando CamelCase aqui para estar em consonncia com o Yii e os padres gerais de programao orientada a objetos (OOP Object Oriented Programming) (quando os valores so recuperados para um empregado individual, colunas especficas sero referenciadas usando, por exemplo, $model->firstName). O mesmo vale para a coluna de chave primria, que deve apenas ter o nome id. A coluna departmentId ser uma chave estrangeira para a tabela de departamentos, para refletir em qual departamento o empregado est. Vou abordar o comentrio adicionado em breve. A coluna ext pretende representar o ramal do telefone do empregado (eu coloquei essa coluna principalmente para demonstrar restries numricas no Model). A hireDate preenchida quando uma linha inserida (se nenhuma data fornecida para ela). Note que estou assumindo MySQL aqui, e como se comporta timestamps muda de verso para verso. E h um ndice no nome da pessoa para fins de classificao, mais um na coluna departmentID j que ela vai ser usada em associaes. A tabela departamentos contm apenas duas colunas. O primeira a chave primria, a segunda o nome do departamento (um ndice nico colocado sobre ela).
CREATE TABLE Department ( id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(40), UNIQUE (name) )

Agora, sobre os comentrios na tabela de funcionrios... o Yii ir reconhecer FOREIGN KEYs que existam e usar essa informao para ajudar a definir o Model. Mas como o MySQL new sempre impe restries de chave estrangeira (dependendo da verso do MySQL e do mecanismo de armazenamento utilizado), voc pode simular esta restrio para o Yii, adicionando um comentrio como aquele associado com a coluna Employee.departmentId. Esse comentrio sugere que a coluna do departmentID uma chave estrangeira que faz referncia a coluna id no Model Departament. Se voc no adicionar este comentrio, no tem problema pois voc mesmo pode escrever o cdigo para indicar a relao, mas bom que o Yii faa isso por voc. Ok, isso! Depois de ter criado as duas tabelas, voc pode voltar para as ferramentas do Yii para criar os modelos, controladores e vises (como eu vou fazer no prximo captulo). Antes de fazer isso, voc deve rever as suas tabelas de banco de dados para se certificar de que elas so exatamente como voc quer que elas sejam. Como o Yii ir gerar automaticamente um monte de cdigo para voc, todas as mudanas feitas aps isso, significa que voc vai precisar editar manualmente o cdigo. Ento procure acertar ao mximo agora!

Criando modelos, vises e controladores no Yii


O Yii, assim como o Ruby on Rails e alguns outros frameworks, tem ferramentas que geram cdigo, arquivos e diretrios para voc. Como voc pode imaginar, este um poupador de tempo tremendo. O Yii originalmente oferecia apenas a ferramenta de linha de comando yiic para esta finalidade (tambm usado para criar o aplicativo Web em si). A partir da verso 1.1.2, h agora a ferramenta web Gii, que roda no navegador. Neste captulo, vou explicar como usar o Gii para criar os arquivos fundamentais de Modelo, Viso, e Controlador necessrios para a aplicao (captulos posteriores vo cobrir como editar o cdigo gerado automaticamente para atender s suas necessidades). Nota: Voc ainda pode usar o yiic de linha de comando, se voc preferir esse ambiente.

Este captulo demonstra o Gii usando um exemplo de departamentos e empregados, com as duas tabelas de banco de dados j criadas (veja o captulo anterior). Algumas observaes antes: Porque o Gii faz parte do trabalho para voc, voc realmente deve ter seu projeto to completo quanto possvel. Se feito corretamente, depois de criar suas tabelas do banco de dados seguindo os passos seguintes, voc no vai usar o Gii novamente para o projeto. Voc deve habilitar o Gii, usando as instrues do terceiro captulo. Porque o Gii uma ferramenta poderosa, melhor no permit-la em um servidor de produo. Idealmente, voc vai permitir o Gii em um servidor de desenvolvimento, us-lo, e desativ-lo, e depois colocar o site em produo. Certifique-se de que as duas tabelas de banco de dados existam. Certifique-se de que voc editou o arquivo de configurao main.php para que a aplicao Yii possa se conectar ao banco de dados. Veja o terceiro captulo para mais detalhes.

Dica: Para maior segurana, o Gii pode ser configurado para funcionar apenas para um endereo IP especfico (ou seja, o seu). Supondo que voc entendeu tudo exposto, e tomou as medidas necessrias, agora voc deve carregar o Gii no seu browser. Assumindo que o seu site encontra-se em www.example.com/index.php, a ferramenta Gii est em www.example.com/index.php/gii/. Isso pressupe que voc est usando o componente de gerenciamento de URL no Yii. Se no, v para www.example.com/index.php?r=gii. Voc deve ser levado para a tela de login, onde voc deve digitar a senha do Gii (estabelecida no arquivo de configurao) e clique em Enter. Supondo que voc digitou a senha correta, voc ver uma pgina inicial e uma lista de opes (com links).

A primeira coisa que voc vai querer fazer gerar os modelos. Clique no link "Model Generator". Na pgina seguinte: 1. Digite Employee como o nome da tabela (Table Name). 2. Digite Employee como a classe de modelo (Model Class). Voc vai perceber que o formulrio copia automaticamente o nome da tabela como o nome do modelo. 3. Clique em Preview. Voc vai ver uma tabela aparecer na parte inferior do formulrio,

indicando os arquivos que sero gerados (apenas um, neste caso). 4. Clique em Generate. Dica: Para criar um modelo automaticamente para cada tabela do banco de dados, basta digitar * para o nome da tabela.

Voc dever ver uma mensagem indicando que o cdigo foi criado (voc pode verificar o novo arquivo para confirmar isso). Se voc vir um erro sobre uma incapacidade de gravar o arquivo, voc ter que modificar as permisses em protected/models para permitir que o servidor da Web escreva l. Uma vez que isso funcione para voc, repita o processo para a tabela Department. Estes passos geram os scripts protected/models/Department.php e protected/models/Employee.php, que agora voc pode abrir e verificar em seu editor de texto ou IDE. Ao usar a verso 1.1.4 do Yii, o arquivo modelo tinha cerca de 110 linhas de cdigo. Eu vou entrar no cdigo especfico em um captulo posterior, mas voc vai ver mtodos que definem as regras de validao para o modelo, relaes que este modelo tem com os outros, e assim por diante. Em seguida, e isto grande, criar as funcionalidades de CRUD. CRUD significa Create, Retrieve, Update e Delete. Em outras palavras, tudo o que voc faria com o contedo do banco de dados. Clique no link "Crud Generator". Na pgina seguinte: 1. Digite Employee como a classe Modelo (Model Class). 2. Digite employee como o ID do Controlador (Controller ID). Voc vai perceber que o formulrio copia automaticamente a classe Modelo, em CamelCase minsculo, como o ID do controlador (controller ID). Assim, Employee torna-se employee, SomeThing se tornaria someThing.

3. Clique em Preview. Voc vai ver uma tabela na parte inferior do formulrio, indicando os arquivos a serem gerados. 4. Clique em Generate. Dica: Se voc sabe que no vai precisar de algumas funcionalidades, tais como a capacidade de criar ou excluir um tipo de modelo, desmarque as caixas de seleo correspondentes. Voc dever ver uma mensagem indicando que o cdigo foi criado. Novamente, se voc vir um erro sobre uma incapacidade de gravar o arquivo, voc ter que modificar as permisses dos diretrios protected/controllers e protected/views para permitir que o servidor da Web escreva l. Uma vez que isso funcione para voc, repita o processo para o modelo do Departamento (Department Model). A pgina resultante tambm vai oferecer um link para ir testar os arquivos gerados.

Este nico passo criar o arquivo controlador para cada modelo (DepartmentController.php e

EmployeeController.php), alm de um diretrio de vises para cada um, com oito arquivos de viso por modelo: _form.php _search.php _view.php admin.php create.php index.php update.php view.php

O arquivo de formulrio usado tanto para criar, como para atualizar registros. O script de busca (search) um formulrio de busca personalizado. O arquivo _view.php um template para mostrar um registro individual. O script admin cria uma lista tabular do modelo, com links para as funcionalidades de CRUD. O script index usado para criar uma lista pblica dos registros. O script view usado para mostrar os detalhes de um registro individual. E os arquivos create e update so cascas (wrappers) para a pgina de formulrio, com ttulos apropriados e outras coisas. Para o Yii 1.0: Em verses anteriores do Yii, antes da 1.1, o arquivo view.php era chamado show.php e o index.php era chamado list.php. Tambm eram criados menos arquivos de viso. Nota: Voc vai ter situaes em que voc tem um modelo de alguma coisa, mas no quer a funcionalidade CRUD, ento no assuma que voc vai sempre efetuar as duas etapas. Ento isso! Voc pode clicar em "logout", clique em "webapp" para voltar pgina inicial. Voc pode confirmar que o que voc fez funcionou verificando os novos diretrios e arquivos ou indo para uma URL. Dependendo se voc adicionou o urlManager para a configurao do aplicativo ou no, a URL seria algo como www.example.com/index.php/employee/ ou www.example.com/index.php?r=employee. Voc vai ver que no h funcionrios ou departamentos na lista e tambm que voc no pode adicionar novos registros sem login (o padro admin/admin). No prximo captulo, vou discutir a forma de comear a editar o cdigo gerado para fazer a aplicao se comportar mais como voc quer ela no mundo real. Mas, graas ferramenta Gii do Yii, cerca de 80% do trabalho foi feito para voc!

Edies bsicas nos modelos no Yii


O modelo representa os dados usados por um aplicativo. Normalmente, os dados vem de um banco de dados, mas tambm podem vir de uma submisso de formulrio (para serem enviados por e-mail, no armazenados, como o modelo ContactForm na aplicao base do Yii). No Yii, um modelo baseado em uma tabela do banco de dados definido como uma classe que estende (ou seja, herda) do Active Record. Active Record um padro comum e popular, tambm usado pelo framework Ruby on Rails. Isto significa que a maior parte da funcionalidade do modelo no est definida no seu modelo, mas sim na classe ActiveRecord pai. Ento, quando olhar para o seu cdigo de modelo, no se surpreenda pois voc no vai encontrar mtodos para a criao e atualizao de registros (ou seja, salvar o modelo) dentre outros, isso tudo herdado. Desde que a funcionalidade j est definida para voc, o objetivo do seu modelo deve ser o de ampliar e ajustar essa funcionalidade, conforme necessidade. Dentro de um modelo, h certos mtodos especficos do Yii (funes de classe) que voc

normalmente usa. Alguns deles sero criados quando voc usar a ferramenta Gii do Yii para gerar o modelo, outros podem sempre ser adicionados. Quero concentrar nos mtodos especficos do Yii aqui, como eles sero comuns maioria dos modelos. (Em captulos posteriores, vou escrever exemplos de mtodos personalizados que podem ser adicionados ao modelo.) Um dos mtodos mais importantes o rules(), que lista as regras pelas quais os dados do modelo devem obedecer. Grande parte da segurana de sua aplicao e confiabilidade decorre deste mtodo. Na verdade, este mtodo representa um dos principais benefcios do uso de um framework: validao de dados. Se um registro novo est sendo criado ou um j existente atualizado, voc no ter que escrever, replicar e testar as rotinas de validao de dados: o Yii ir fazer isso para voc. Como um comentrio no modelo indica, voc s estabelece regras para os campos (ou seja, atributos do modelo), cujos dados podem ser fornecidos pelos usurios. Voc no vai, por exemplo, declarar uma regra para o campo Employee id, que a chave primria gerada pelo MySQL. O mtodo rules(), como a maioria dos mtodos do Yii, retorna uma matriz de dados:
public function rules() { return array(/* actual rules */); }

Para as regras efetivamente, a documentao do Yii cobre na ntegra (veja esta e esta), mas vou destacar as principais. Como voc vai ver, cada regra escrita de forma que ela retorna um array. A primeira, mais bvia restrio, serve para indicar que um campo requerido. Basta usar uma string separada por vrgulas com os nomes de campos como o primeiro valor retornado e a palavra required como o segundo:
array('name, email, subject, body', 'required'),

Voc tambm pode especificar que um valor deve ser um nmero ou, mais especificamente, um nmero inteiro. Esta sintaxe um pouco diferente. Aqui, eu indico que o campo ext deve ser um inteiro:
array('ext', 'numerical', 'integerOnly'=>true),

Para strings, voc pode restringir o comprimento mximo de um valor:


array('name','length','max'=>40),

Ou um comprimento mnimo:
array('name','length','min'=>6),

Ou ambos:
array('name','length','min'=>6, 'max'=>40),

Outra rotina de validao til para verificar se uma string um endereo de e-mail. Eu fao isso aqui, num campo userEmail:
array('userEmail', 'email'),

Para indicar que uma string deve ser uma URL, use:
array('link', 'url'),

Outra regra til a para comparaes, como quando um usurio se registra e voc tem que ter certeza que a confirmao de senha coincida com a senha:
array('password1', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),

H tambm a regra de "seguro" (safe). Essa regra usada para fornecer acesso a dados que no so de outra forma validados. Por exemplo, um endereo de e-mail j considerado "seguro", porque tem de cumprir a regra de e-mail, mas o modelo Employee tem o campo leaveDate que no ter quaisquer regras aplicadas a ele (em parte, porque no h regras de data especficas e tambm porque o campo pode ser NULL). Para ser capaz de se referir a esse valor, ele deve ser declarado como seguro:
array('leaveDate', 'safe'),

Se h vrios campos para torn-los seguros, apenas separe-os com vrgulas. H tambm uma regra para indicar quais campos devem ser seguros para a busca. Por padro, todos os campos so seguros em uma busca, mas voc pode querer mudar esse comportamento, removendo campos da lista:
array('id, departmentId, firstName, lastName, email, ext, hireDate, leaveDate', 'safe', 'on'=>'search'),

Assim, usando essas informaes, o mtodo completo rules() para o meu modelo Employee :
public function rules() { return array( array('departmentId, firstName, lastName, email, hireDate', 'required'), array('departmentId, ext', 'numerical', 'integerOnly'=>true), array('firstName', 'length', 'max'=>20), array('lastName', 'length', 'max'=>40), array('email', 'length', 'max'=>60), array('email', 'email'), array('leaveDate', 'safe'), array('id, departmentId, firstName, lastName, email, ext, hireDate, leaveDate', 'safe', 'on'=>'search'), ); }

Seguindo em frente, outro mtodo chave do modelo o relations(), que indica a relao entre os modelos. Se o seu banco de dados foi projetado corretamente, este mtodo j estar devidamente preenchido, novamente graas ao Gii. Veja como o mtodo relations() no modelo Employee se parece:
public function relations() { return array('department' => array(self::BELONGS_TO, 'Department', 'departmentId') ); }

Para a relao dado um nome, aqui department. A relao indica que a coluna departmentId no modelo Employee (por exemplo, o presente) pertence ao modelo Department. Aqui est como isso funciona: Ao carregar as informaes de um funcionrio, voc tambm pode carregar qualquer de suas relaes. Ao fazer isso, as referncias a department iro igualar ao modelo Department relativo ao departamento do empregado. Ento, se o objeto $model representa o funcionrio (Employee) que est sendo visualizado, ento $model->department->nome seria o nome do departamento que o empregado est associado. No Modelo Department, esta relao definida assim:
public function relations() { return array('employees' => array(self::HAS_MANY, 'Employee', 'departmentId') ); }

Ento, se $model representa um departamento (Department) especfico que est sendo visualizado, ento $model->employees um array de objetos Employee, cada um dos quais representando um funcionrio (Employee) do departamento. As relaes entre os modelos essencial em sites MVC complexos. Atravs de relaes devidamente definidas, o contedo associado pode ser recuperado. Voc aprender mais sobre isso nos prximos captulos. Seguindo em frente, um mtodo mais trivial, mas ainda assim interessante, o attributeLabels(). Este mtodo retorna uma matriz associativa de campos e os rtulos utilizados para esses campos em formulrios, mensagens de erro e assim por diante. O framework Yii faz um grande trabalho de fazer converses automaticamente, como tornar firstName em First Name e tornar departmentID em apenas Department. Mas voc pode querer personalizar ainda estes. Para o modelo Employee, aqui est o meu cdigo:
public function attributeLabels() { return array( 'id' => 'Employee ID', 'departmentId' => 'Department', 'firstName' => 'First Name', 'lastName' => 'Last Name', 'email' => 'Email', 'ext' => 'Ext', 'hireDate' => 'Hire Date', 'leaveDate' => 'Leave Date', ); }

Portanto, h um pouco de personalizao que voc vai querer fazer em seus modelos para comear. Como eu disse, voc tambm adicionar seus prprios mtodos mais tarde. E h algumas outros mtodos Yii especficos que uso frequentemente, como beforeSave(), que o cdigo a ser executado antes de um modelo ser salvo, e beforeValidate(), que executado antes da validao ocorrer. Este ltimo mtodo til se h alguma manipulao de dados que voc quer fazer nos bastidores antes do modelo ser processado atravs de todos os requisitos de validao. E h o mtodo search(), que eu vou ter que enderear em um captulo separado. Mas, os mtodos mais importantes do Modelo so os rules() e relations().

Edies bsicas nas vises no Yii


Quando voc usa a linha de comando e ferramentas do Gii para criar um novo aplicativo Web, o framework Yii gera uma srie de arquivos e pastas para voc, de arquivos de configurao at controladores e vises. As vises so uma srie de scripts PHP, organizado por pastas. O primeiro que voc vai querer editar protected/views/layouts/main.php (onde protected o diretrio raiz do aplicativo). Este o template para cada pgina dentro do aplicativo. provvel que voc deseje alterar a maior parte do arquivo para criar o seu prprio visual, mas quero destacar alguns pontoschave. Para iniciar no cabealho (HEAD), voc ver que os arquivos externos so ligados utilizando
<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request>baseUrl; ?>/css/main.css" />

Sempre que voc v Yii::app(), que se refere ao aplicativo Web como um todo. Voc pode acessar as informaes sobre o usurio visualizando uma pgina, sobre a pgina atual ou vistas previamente, etc. Yii::app()->request especificamente faz referncia a pgina atual que est sendo

acessada (ou solicitada). A parte ->baseUrl refere-se URL raiz do aplicativo, como http://www.example.com. Voc deve usar Yii::app()->request->baseUrl para referenciar arquivos externos, CSS, JavaScript, imagens, e assim por diante, pois o caminho relativo a eles pode se tornar confuso com as URLs modificadas do Yii (como www.example.com/index.php/site/login). Em seguida, voc ver o ttulo da pgina configurado dinamicamente:
<title><?php echo CHtml::encode($this->pageTitle); ?></title>

Por padro, o valor pageTitle ser o nome do aplicativo (definido no arquivo de configurao), mais alguma coisa relativa a pgina atual. Mais tarde, eu vou lhe mostrar como mudar isso. O mtodo CHtml::encode() usado apenas para proteger contra Cross-Site Scripting (XSS). Voc vai v-lo usado constantemente (e apropriadamente) nos arquivos de viso. Voc tambm vai ver no arquivo de layout principal:
<div id="logo"><?php echo CHtml::encode(Yii::app()->name); ?></div>

Yii::app()->name o nome do aplicativo Web, conforme estabelecido no arquivo de configurao config/main.php. Voc pode ou no querer us-lo em suas vises, mas da que o valor vem. Em seguida, o layout padro usa um widget:
<?php $this->widget('zii.widgets.CMenu',array(...

Widgets so uma maneira de incluir cdigo PHP em uma viso usando um arquivo externo. Eles so melhores para as coisas que no esto ligadas a vises especficas e que voc pode querer incluir em qualquer lugar. Alm disso, ele permite que voc separe cdigo em pedaos para facilitar o gerenciamento e portabilidade. O cdigo acima diz que o widget CMenu deve ser inserido aqui. Ele faz parte da extenso Zii (para o framework Yii). Para saber mais sobre widgets, consulte a documentao do Yii. Para o Yii 1.1: o Yii 1.1 pegou um monte das melhores extenses e colocou-as em seu prprio namespace, zii. Enquanto em verses anteriores do Yii havia um componente MainMenu, no Yii 1.1 h o widget CMenu. O layout padro tambm faz uso do widget CBreadcrumbs, includo nas extenses do Zii. Finalmente, o script de layout tem esta linha, que a mais importante:
<?php echo $content; ?>

Agora voc no vai encontrar uma referncia para a varivel $content em qualquer lugar em seu cdigo e note que apenas $content, no $this->content ou $model->content. Esta varivel onde o contedo especfico da pgina inserido no layout. Todo o cdigo HTML e PHP restante define o template para todo o site, o valor de $content o que faz a pginaX diferente da pginaY. Ento, de onde vem isso? Dica: A estrutura exata das URLs depender se voc ativou o urlManager ou no e, se sim, como est configurado. Veja o captulo sobre a configurao do Yii para mais informaes. Se voc est vendo uma pgina como www.example.com/index.php/employee/view/id/1, que se destina a mostrar o empregado com o ID 1, o mtodo actionView() da classe EmployeeController chamado . Esse mtodo carrega o modelo Employee com a chave primria de 1, ento renderiza a viso view, passando o modelo no processo. Esse cdigo (este do protected/controllers/EmployeeController.php):
public function actionView($id) { $this->render('view',array( 'model'=>$this->loadModel($id), ));

O mtodo loadModel() desta classe Controller faz a recuperao do modelo, e no vou me preocupar com isso agora, mas o cdigo $this->render() diz para renderizar a viso informada, neste caso, view. Isso significa que o Yii ir executar o script PHP protected/views/employee/view.php. Esse script usa uma varivel $model (passada no cdigo acima) para exibir informaes sobre o funcionrio dentro de um contexto (especificamente, o script view.php usa zii.widgets.CDetailView para listar os detalhes). O resultado deste script de viso executado , nos bastidores, atribudo para $content, e, portanto, colocado no local apropriado do layout. assim que o sistema funciona. Uma ltima coisa sobre os scripts de layout que voc pode facilmente ter layouts diferentes para diferentes sees do aplicativo. Para isso, no mtodo do Controller, altere o valor do layout antes de renderizar a viso. Fornea o nome do arquivo de layout, sem a extenso. Ento esta linha diz para usar protected/views/layouts/home.php para a ao index:
class SiteController extends CController {... public function actionIndex() {... $this->layout = 'home';

Na verdade, a partir do Y 1.1.?, o framework cria layouts de uma coluna e duas colunas, cada um dos quais utiliza o arquivo de layout main.php. O controlador ento indica qual layout usar para todo o controlador:
class EmployeeController extends Controller { public $layout='//layouts/column2';

Nota: $this->layout dentro de um mtodo de classe equivalente a apenas $layout pblico fora de qualquer mtodo (como no cdigo acima). O primeiro exemplo altera o layout para uma ao especfica, o segundo para o controlador como um todo. Passando para os scripts de viso, uma das primeiras coisas que eu normalmente fao alterar a formatao bsica para o que voc est querendo. Por exemplo, a aparncia padro de uma viso view uma tabela de informaes sobre o modelo: rtulos e valores. Normalmente, voc no vai querer mostrar todos os dados do modelo, e voc vai exibi-los em DIVs ou pargrafos. Estas so alteraes simples. Como mostra o cdigo acima, a informao do modelo ser passada sob o nome model, de modo que voc pode usar $model->whatever para acessar os valores dos diferentes campos. Para o Yii 1.1: Uma srie de alteraes nos arquivos de vises foram feitas, embora nenhuma dramtica: o que antes era list.php agora index.php. A pgina index faz uso de um widget CListView para listar os registros. A pgina de administrao faz uso de um widget CGridView para exibir todos os registros. O arquivo show.php agora chamado de view.php. Ele faz uso do widget CDetailView para mostrar as informaes de um registro especfico. Mltiplos arquivos de viso podem fazer uso do script _view.php, que um modelo para mostrar um registo individual. Cada arquivo de viso identifica informaes contidas no breadcrumb na parte superior, que vai associar ao widget CBreadcrumbs referenciado no arquivo de layout principal. Dica: Se voc entrar no site (usando admin/admin, se voc no tiver alterado o sistema de login) e depois ir para www.example.com/index.php/department/, voc j pode criar alguns registros de departamentos para melhor entendimento do que eu vou escrever abaixo. As vises index e admin mostram mltiplos registros de modelo, usando widgets do Zii. index.php usa o widget CListView, usando o script _view.php como template. Se voc quiser editar o

_view.php ou como o CListView est configurado (no index.php), voc vai alterar as listagens. A pgina admin, acessada clicando em "Manage XXX", usa o widget CGridView. Este elemento cria uma tabela de dados, com links para visualizar, editar ou excluir registros especficos. A tabela pode ser paginada e filtrada, usando Ajax. Esta uma grande demonstrao de quanto o Yii ir fazer por voc. Esta figura mostra a lista de departamentos, sem ter feito qualquer alterao no que o Yii criou:

As vises create e update tem algumas coisas de cabealho da pgina, e incluem a viso do formulrio, usando este cdigo:
<?php echo $this->renderPartial('_form', array('model'=>$model)); ?>

Esse cdigo renderiza uma viso parcial no local, e repassa a informao de modelo para _form.php. Olhando para o cdigo gerado, o formulrio Department ser suficiente, uma vez que apenas fornece uma entrada para o nome do departamento. Para o modelo Employee, no entanto, h alguma personalizao que voc precisa para fazer. Voc pode verific-la indo para www.example.com/index.php/employee/create/. Por padro, os formulrios gerados pelo Gii incluem elementos para cada atributo do modelo, exeto para a chave primria. Mas alguns campos, como as datas de criao (created) ou alterao (modified), podem ser automaticamente preenchidos com data e hora, e, portanto, no so inseridos pelos usurios. E, com os modelos relacionados, como Employee e Department, voc vai acabar precisando de um menu drop-down num para selecionar um valor a partir do outro, como escolher o departamento que um empregado est dentro. O cdigo gerado pelo Yii no faz isso por voc, o formulrio s vai ter um campo de texto criado por este cdigo:
<?php echo $form->textField($model,'departmentId'); ?>

A varivel $form um objeto do tipo CActiveForm. O mtodo textField() cria uma entrada de texto. O primeiro argumento diz que a entrada deve ser para o objeto $model (que a instncia do Model atual, que vem do Controller). O segundo argumento identifica a propriedade no modelo para o qual este elemento . Para criar um drop-down associado com um outro modelo, voc deve substituir o cdigo com:
<?php echo $form->dropDownList($model,'departmentId', CHtml::listData(Department::model()->findAll(), 'id', 'name')); ?>

Primeiro, o mtodo dropDownList() do objeto $form cria uma lista drop-down. Voc precisa amarr-lo ao Model de forma associada, de modo que o primeiro argumento apenas o $model, a mesma varivel passada para a viso quando ela processada. O segundo argumento o nome do

campo de formulrio/Modelo: aqui, o campo departmentID no modelo Employee. Em seguida, voc precisa fornecer ao mtodo a lista de valores para usar no menu drop-down, que obtido chamando CHtml::listData(). Esse mtodo retorna uma lista de valores que so utilizveis em menus. Sua fonte de dados deve ser a lista de Departments. Para recuper-los, use a abordagem do Yii para recuperar todos os registros em um modelo: ModelName::model()->findAll(). Ento, para buscar cada departamento, utilize Department::model()->findAll(). Os dois ltimos argumentos (para o mtodo CHtml::listData()) so os campos a serem usados para o valor do menu drop-down e texto exibido. Esses devem ser id (o ID do departamento) e name. Outra coisa que voc vai querer fazer em todos os seus arquivos de viso remover ou editar os links para as diferentes funcionalidades de administrao. Finalmente, voc pode decidir que quer mudar o ttulo da pgina. Para fazer isso, use um cdigo como:
<?php $this->pageTitle = $model->something; ?>

Observe que voc est atribuindo um valor para $this->pageTitle aqui, e no para $model>pageTitle, mas provavelmente voc vai usar o contedo de $model, como um campo de ttulo ou nome, como o valor do ttulo da pgina. Voc tambm pode ainda adicionar o nome do aplicativo, se voc quiser, concatenando com Yii::app()->name. Ufa! Ento, esse o meu tour relmpago de edies bsicas nas vises que voc vai querer fazer uma nova aplicao Yii. No prximo captulo, vou discutir edies bsicas nos controladores, as quais so surpreendentemente poucas, eu acho. Como sempre, obrigado por ler o que tenho a dizer e deixe-me saber se voc tiver quaisquer perguntas ou comentrios.

Edies bsicas nos controladores no Yii


Para o Yii 1.1: A linha $defaultAction no est mais presente. Alm disso, os nomes de alguns dos mtodos de ao (action) foram alterados para coincidir com os novos nomes dos arquivos de viso correspondentes: actionView() e actionIndex(). O Controlador representa as aes que um usurio faz em um site: visualiza um registro especfico, atualiza um registro, lista todos os registros, etc. Uma solicitao do usurio (ou seja, o carregamento de uma URL) tratada pela aplicao Yii, em seguida, passada para o controlador correspondente. dever do controlador realizar qualquer trabalho necessrio, provavelmente envolvendo o carregamento ou a manipulao de alguns modelos, em seguida, passar dados para a viso. Como acontece com qualquer definio de classe, todas as tarefas so realizadas dentro de mtodos. A primeira coisa que voc vai encontrar dentro de uma classe Controller uma varivel chamada $layout:
public $layout='//layouts/column2';

Como explicado no captulo sobre vises, esta varivel determina qual dos dois layouts pr-criados (de uma coluna ou duas colunas) o controlador utiliza. Voc pode alterar esse valor para alterar o layout de todo o controlador, ou voc pode mudar $this->layout dentro de qualquer um dos mtodos. Outra varivel de classe, que costumava ser escrita para a classe, mas agora tem de ser adicionada :
public $defaultAction='admin';

Assim formulado, controladores so as aes que algum faz, listando informaes, mostrando registros especficos, manipulando envios de formulrios, e assim por diante. Para cada ao, h um mtodo correspondente na classe controladora: actionIndex(), actionView(), actionCreate(), etc. A

linha acima determina qual o mtodo chamado, se no especificado explicitamente. Assim, com essa linha, a URL www.example.com/index.php/employee chama o mtodo actionAdmin() enquanto www.example.com/index.php/employee/create chama actionCreate(). O padro, se voc no usar essa linha, chamar actionIndex(). Seus controladores tambm devem ter vrios mtodos no-ao, incluindo accessRules(). Este mtodo uma parte fundamental da parte de segurana, ditando quem pode fazer o qu. Para as opes do "qu", voc tem suas aes: listar, mostrar, criar, atualizar e excluir. Seu "quem" depende da situao, mas para comear h pelo menos usurios logados e no logados, representados por * (qualquer um) e @ (usurios logados). Dependendo do sistema de login adotado, voc tambm pode ter os nveis de usurios, como administradores. Assim, o mtodo accessRules() usa todas essas informaes e retorna um array de valores. Os valores tambm so arrays, indicando permisses (permitir ou negar), aes, e usurios:
public function accessRules() { return array( array('allow', // allow all users to perform 'index' and 'view' actions 'actions'=>array('index','view'), 'users'=>array('*'), ), array('allow', // allow authenticated user to perform 'create' and 'update' actions 'actions'=>array('create','update'), 'users'=>array('@'), ), array('allow', // allow admin user to perform 'admin' and 'delete' actions 'actions'=>array('admin','delete'), 'users'=>array('admin'), ), array('deny', // deny all users 'users'=>array('*'), ), ); }

Essa a configurao padro, onde qualquer pessoa pode executar as aes index e view, o que significa que qualquer um pode listar todos os registros ou visualizar registros individuais no modelo associado. A prxima seo permite que qualquer usurio logado realize as aes create e update. Em seguida, apenas os administradores podem realizar as aes admin e delete. Finalmente, a regra geral para negar a todos os usurios adicionada, para cobrir qualquer situao que no foi explicitamente definida. Esta apenas uma boa prtica de segurana. Note que estas regras s se aplicam a este controlador, cada controlador tem suas prprias regras. Voc vai querer personalizar as regras para cada controlador e situao. Por exemplo, eu fiz um site com um sistema de assinatura, representado por um modelo Contact. Nesse caso, todos tinham permisso para criar registros novos de contato, mas apenas o administrador foi autorizado a listar ou mostrar registros de contato. Geralmente, porm, acho que a maioria dos controladores deve permitir que todos possam realizar as aes view e index. Voc tambm pode criar condicionais mais sofisticadas para criar permisses, mas isso ser assunto para outro momento. Por exemplo, em um projeto que fiz, qualquer usurio conectado poderia criar certos tipos de contedo, mas eles s poderiam atualizar e excluir registros que eles prprios criaram. Ou voc pode permitir que usurios visualizem apenas o seu prprio registro de contato. Finalmente, voc pode precisar mudar seus controladores, de modo que a recuperao de registros de modelo seja tratada de forma diferente. Existem alguns mtodos que carregam registros para serem utilizados em uma viso. Alguns dos mtodos, como actionView() e actionUpdate(),

chamam um mtodo loadModel() cujo trabalho recuperar um nico registro. Outros mtodos, como actionIndex() e actionAdmin() recuperam todos os registros do modelo (usando uma abordagem diferente). Nestes mtodos, h algumas mudanas que voc pode querer fazer. Para comear, se o modelo em questo est relacionado a um outro modelo, como definido no mtodo relations() da classe de modelo (veja o captulo sobre Modelos), voc pode invocar essa relao quando voc recuperar o registro(s). Por exemplo, este cdigo vai recuperar um funcionrio, alm do departamento daquele empregado:
$model=Employee::model()->with('department')->findByPk((int)$id);

Voc s vai quer fazer isso se voc for usar os registros relacionados, claro. Voc tambm pode ajustar os critrios (criteria) aplicados a estes mtodos, mas esse um grande tema. Ela envolve basicamente a adio da clusula WHERE no SQL de uma consulta. Eu vou enderear isso em outro momento, mas voc tambm pode ver a documentao do Yii, claro. Ento, isso conclu a srie de oito captulos sobre o framework Yii. Eu tenho um monte de temas diversos sobre o assunto para escrever a respeito, mas eu no vou escrever sobre eles aqui, como parte desta srie. Para encontr-los acesse http://www.larryullman.com/tag/yii/. Como sempre, obrigado pela leitura e avise-me se voc tem algum comentrio ou perguntas. Larry

You might also like