O documento descreve o framework Yii para desenvolvimento web em PHP. O Yii é um framework MVC de alto desempenho que utiliza componentes para acelerar o desenvolvimento de aplicações web complexas. O Yii implementa padrões como MVC e tem estrutura de diretórios e arquivos bem definida para models, views, controllers e configurações.
2. PHP: Linguagem, aplicabilidades, porque php?
Linguagem Dinamica
Linguagem com foco em desenvolvimento Web
- Velocidade e robustez
- Estruturado e orientado a objetos
- Portabilidade
- Tipagem dinamica
- Sintaxe similar ao C/C++ e Perl
- Open-source
3. PHP: Linguagem, aplicabilidades, porque php?
O PHP tem muitas bibliotecas.
Ex: SOAP, XML, DOM, Stream, PDO etc...
Tem uma comunidade gigantesca.
Ex. Listas, grupos, foruns, empresas.
Estatisticas
Linguagem Sites Porcentagem
Atualizações constantes.
PHP 3.9984.25 59%
Documentação. ASP.NET 2.294.166 34%
Perl 259.931 4%
Python 159.475 2%
Java 18.065 0%
4. PHP: Linguagem, aplicabilidades, porque php?
É usado por muitas empresas de sites institucionais, a aplicações
de intranet e extranet. Temos como exemplo, facebook, milhares
de sites e blogs com wordpress, temos ainda outros que usam
joomla e drupal, e também Yii framework.
file:///C:/Users/Internet/Desktop/magento.jpg
file:///C:/Users/Internet/Desktop/images.jpg
file:///C:/Users/Internet/Desktop/drupal.jpeg
file:///C:/Users/Internet/Desktop/joomla.jpeg
5. YII Framework
O nome Yii representa as palavras fácil (easy), eficiente (efficient) e
extensível (extensible)
Yii é um framework de alta performance em PHP que utiliza componentes
para o desenvolvimento de grandes aplicações Web.
Reutilização de códigos.
Aceleração significativa do processo de desenvolvimento.
O Yii é um framework de programação Web genérico.
Caching para o desenvolvimento de aplicações com alto tráfego de dados.
Como a maioria dos frameworks PHP, O Yii é um framework MVC.
Eficiente, rico em recursos e bem documentado.
O Yii é não é nem um subproduto de algum projeto, nem um conglomerado
de trabalho de terceiros.
9. YII Framework: MVC
Modelo-Visão-Controle
O Yii implementa o padrão de desenvolvimento modelo-visão-controle (MVC)
que é amplamente adotado na programação Web. O MVC visa separar a lógica
de negócio da interface com o usuário, assim os programadores podem mudar
facilmente cada parte, sem afetar as outras. No padrão MVC, o modelo
representa as informações (os dados) e as regras de negócio, a visão contém
elemento de interface com o usuário, como textos, formulários, e o controle
gerencia a comunicação entre o modelo e a visão. Além MVC, o Yii também
introduz um controle de frente, chamado aplicação (application), que representa
o contexto de execução dos processos requisitados. A aplicação recebe a
solicitação do usuário e a envia para um controlador adequado para ser
processada.
11. YII Framework: YIIC
Ferramenta de linha de comando para automação
comandos:
- controller
- crud
- form
- help
- model
- module
% cd WebRoot
% php YiiRoot/framework/yiic.php webapp nomeapp
12. YII Framework: YIIC
Create a Web application under '/Webroot/nomeapp? [Yes|No]
Yes
mkdir /WebRoot/nomeapp
mkdir /WebRoot/nomeapp/assets
mkdir /WebRoot/nomeapp/css
generate css/bg.gif
generate css/form.css
generate css/main.css
...
13. YII Framework: Estrutra de diretorio da aplicação
exemplo/
index.php Script único de entrada da aplicação
index-test.php Script de entrada para testes funcionais
assets/ Arquivos de recurso publicados
css/ Folhas de estilo
images/ Diretorio de imagens
themes/ Temas da aplicação
protected/ Diretorio protegido dos arquivos de aplicação
components/ Componentes reusaveis da aplicação
Controller.php Classe base para as controllers
UserIdentity.php Classe usada para autenticação
config/ Diretorio de configuração da aplicação
console.php Configuração do console da aplicação
main.php Configuração da aplicação web
test.php Configuração para os testes funcionais
controllers/ Diretorio das controllers da aplicação
SiteController.php Controller padrão
14. YII Framework: Estrutra de diretorio da aplicação
extensions/ Contem extensões de terceiros
messages/ Mensagens traduzidas
models/ Diretorio de Modelos
LoginForm.php Modelo de formulario para action 'login'
ContactForm.php Modelo de formulario para a action 'contact'
runtime/ Arquivos temporarios
tests/ Scripts de teste
views/ Arquivos de apresentação e layout
layouts/ Layout de apresentação
main.php Layout base da aplicação
column1.php Layout para paginas com uma coluna
column2.php Layout para paginas com duas colunas
site/ Apresentação para a controller Site
pages/ Paginas 'estaticas'
about.php Apresentação para a action 'about'
contact.php Apresentação para a action 'contact'
error.php Apresentação para a action 'error'
index.php Apresentação para a action 'index'
login.php Apresentação para a action 'login'
15. YII Framework: Configuração
<?php
// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
'modules'=>array(
'telemarketing',
),
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'.: Sistema Integrado XP :.',
// preloading 'log' component
//'preload'=>array('log'),
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
'application.models.utils.*',
'application.models.jornal.*',
'application.models.jornal.cliente.*',
'application.models.jornal.telemarketing.*',
'application.models.sistema.*',
),
16. YII Framework: Configuração
'modules'=>array(
// uncomment the following to enable the Gii tool
'gii' =>array(
'class' => 'system.gii.GiiModule',
'password' => '123456',
'ipFilters' => false,
),
),
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
),
// uncomment the following to enable URLs in path-format
/*
'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>',
),
),
*/
/*
'db'=>array(
'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
),
*/
17. YII Framework: Configuração
// uncomment the following to use a MySQL database
'db'=>array(
'connectionString' => 'mysql:host=10.0.1.10;dbname=o_sul',
'emulatePrepare' => true,
'username' => 'dbuser',
'password' => '1234',
'charset' => 'utf8',
),
'errorHandler'=>array(
'errorAction'=>'site/error',
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
array(
'class'=>'CWebLogRoute',
),
),
),
),
'params'=>array(
// this is used in contact page
'adminEmail'=>'webmaster@pampa.com.br
',
),
);
18. YII Framework: Script de entrada
<?php
// change the following paths if necessary
$yii=dirname(__FILE__).'/../../yii-1.1.6.r2877/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';
// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log
message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
require_once($yii);
Yii::createWebApplication($config)->run();
19. YII Framework: Ciclo de vida da aplicação
1. Pré-inicia a aplicação com o método CApplication::preinit();
2. Configura as o auto-carregamento de classes (autoloader) e o
tratamento de erros;
3. Registra os principais componentes da aplicação;
4. Carrega as configurações da aplicação;
5. Inicia a aplicação com o CApplication::init():
1. Registra os comportamentos (behaviors) da aplicação;
2. Carrega os componentes estáticos da aplicação;
6. Dispara o evento onBeginRequest (no início da requisição);
7. Processa a requisição do usuário:
1. Resolve a requisição do usuário;
2. Cria um controle;
3. Executa o controle;
8. Dispara o evento onEndRequest (ao fim da requisição);
25. YII Framework: Controller
class ExemploController extends Controller
{
public function __construct($id) {
$this->layout = 'colunm1';
parent::__construct($id);
}
public function actionAction1()
{
$this->render('action1');
}
public function actionAction2()
{
$this->render('action2');
}
public function actionAction3()
{
$this->render('action3');
}
public function actionIndex()
{
$this->render('index');
}
}
26. YII Framework: Controller
// Uncomment the following methods and override them if needed
/*
public function filters()
{
// return the filter configuration for this controller, e.g.:
return array(
'inlineFilterName',
array(
'class'=>'path.to.FilterClass',
'propertyName'=>'propertyValue',
),
);
}
public function actions()
{
// return external action classes, e.g.:
return array(
'action1'=>'path.to.ActionClass',
'action2'=>array(
'class'=>'path.to.AnotherActionClass',
'propertyName'=>'propertyValue',
),
);
}
*/
27. YII Framework: Model
<?php
/**
* This is the model class for table "entidade".
*
* The followings are the available columns in table 'entidade':
* @property integer $id
* @property string $nome
* @property string $descricao
*/
class Entidade extends CActiveRecord
{
/**
* Returns the static model of the specified AR class.
* @return Entidade the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'entidade';
}
28. YII Framework: Model
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('nome, descricao', 'required'),
array('nome, descricao', 'length', 'max'=>255),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, nome, descricao', 'safe', 'on'=>'search'),
);
}
/**
* @return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the
related
// class name for the relations automatically generated below.
return array(
);
}
29. YII Framework: Model
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id' => 'ID',
'nome' => 'Nome',
'descricao' => 'Descricao',
);
}
/**
* Retrieves a list of models based on the current search/filter conditions.
* @return CActiveDataProvider the data provider that can return the models based
on the search/filter conditions.
*/
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('nome',$this->nome,true);
$criteria->compare('descricao',$this->descricao,true);
return new CActiveDataProvider(get_class($this), array(
'criteria'=>$criteria,
));
}
}
38. YII Framework: CRUD / Controller
class EntidadeController extends Controller
{
/**
* @var string the default layout for the views. Defaults to '//layouts/column2',
* meaning using two-column layout. See 'protected/views/layouts/column2.php'.
*/
public $layout='//layouts/column2';
/**
* @return array action filters
*/
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
);
}
/**
* Specifies the access control rules.
* This method is used by the 'accessControl' filter.
* @return array access control rules
*/
public function accessRules()
{
return array(
array('allow', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
39. YII Framework: CRUD / Controller
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('*'),
),
);
}
/**
* Displays a particular model.
* @param integer $id the ID of the model to be displayed
*/
public function actionView($id)
{
$this->render('view',array(
'model'=>$this->loadModel($id),
));
}
40. YII Framework: CRUD / Controller
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate()
{
$model=new Entidade;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Entidade']))
{
$model->attributes=$_POST['Entidade'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('create',array(
'model'=>$model,
));
}
/**
* Updates a particular model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id the ID of the model to be updated
*/
public function actionUpdate($id)
{
$model=$this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
41. YII Framework: CRUD / Controller
if(isset($_POST['Entidade']))
{
$model->attributes=$_POST['Entidade'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('update',array(
'model'=>$model,
));
}
/**
* Deletes a particular model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id the ID of the model to be deleted
*/
public function actionDelete($id)
{
if(Yii::app()->request->isPostRequest)
{
// we only allow deletion via POST request
$this->loadModel($id)->delete();
// if AJAX request (triggered by deletion via admin grid view), we should not
redirect the browser
if(!isset($_GET['ajax']))
$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
}
else
throw new CHttpException(400,'Invalid request. Please do not repeat this request
again.');
}
42. YII Framework: CRUD / Controller
/**
* Lists all models.
*/
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Entidade');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new Entidade('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Entidade']))
$model->attributes=$_GET['Entidade'];
$this->render('admin',array(
'model'=>$model,
));
}
43. YII Framework: CRUD / Controller
/**
* Returns the data model based on the primary key given in the GET
variable.
* If the data model is not found, an HTTP exception will be raised.
* @param integer the ID of the model to be loaded
*/
public function loadModel($id)
{
$model=Entidade::model()->findByPk((int)$id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
/**
* Performs the AJAX validation.
* @param CModel the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='entidade-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
45. YII Framework: CRUD / Widgets
<p>
You may optionally enter a comparison operator (<b><</b>, <b><=</b>,
<b>></b>, <b>>=</b>, <b><></b>
or <b>=</b>) at the beginning of each of your search values to specify how the
comparison should be done.
</p>
<?php echo CHtml::link('Advanced Search','#',array('class'=>'search-button')); ?>
<div class="search-form" style="display:none">
<?php $this->renderPartial('_search',array(
'model'=>$model,
)); ?>
</div><!-- search-form -->
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'entidade-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'nome',
'descricao',
array(
'class'=>'CButtonColumn',
),
),
)); ?>