48
Iniciando com YII Framework Volmar Machado da Silva Neto

Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Comunicação)

Embed Size (px)

Citation preview

Iniciando com YII FrameworkVolmar Machado da Silva Neto

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

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.

Atualizações constantes.

Documentação.

Estatisticas Linguagem Sites Porcentagem

PHP 3.9984.25 59%ASP.NET 2.294.166 34%Perl 259.931 4%Python 159.475 2%Java 18.065 0%

PHP: Linguagem, aplicabilidades, porque php?

É usado por muitas empresas de sites institucionais, a aplicações de intranet e extranet. Temos como exemplo, facebook, milharesde sites e blogs com wordpress, temos ainda outros que usamjoomla e drupal, e também Yii framework.

PHP: Linguagem, aplicabilidades, porque php?

file:///C:/Users/Internet/Desktop/drupal.jpeg

file:///C:/Users/Internet/Desktop/joomla.jpeg

file:///C:/Users/Internet/Desktop/images.jpg

file:///C:/Users/Internet/Desktop/magento.jpg

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 componentespara 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.

http://nomedoservidor/caminho/do/yii/requirements/index.php

YII Framework: Estrutura

YII Framework: Logica

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ógicade negócio da interface com o usuário, assim os programadores podem mudarfacilmente cada parte, sem afetar as outras. No padrão MVC, o modelorepresenta as informações (os dados) e as regras de negócio, a visão contémelemento de interface com o usuário, como textos, formulários, e o controlegerencia a comunicação entre o modelo e a visão. Além MVC, o Yii tambémintroduz um controle de frente, chamado aplicação (application), que representao 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 serprocessada.

YII Framework: Logica

YII Framework: YIIC

% cd WebRoot% php YiiRoot/framework/yiic.php webapp nomeapp

Ferramenta de linha de comando para automação

comandos:- controller- crud- form- help- model- module

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...

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

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'

YII Framework: Estrutra de diretorio da aplicaçã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.*',),

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',),*/

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'=>'[email protected]

',),

);

YII Framework: Configuração

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 modedefined('YII_DEBUG') or define('YII_DEBUG',true);// specify how many levels of call stack should be shown in each log messagedefined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);

require_once($yii);Yii::createWebApplication($config)->run();

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);

YII Framework: GII

YII Framework: GII

YII Framework: GII

YII Framework: GII

YII Framework: GII

YII Framework: Controllerclass 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');}

}

// 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',),);}*/

YII Framework: Controller

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';}

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();}

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,));}}

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="language" content="en" />

<!-- blueprint CSS framework --> <link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/screen.css" media="screen, projection" /> <link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/print.css" media="print" /> <!--[if lt IE 8]><link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/ie.css" media="screen, projection" /><![endif]-->

<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/main.css" /> <link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/form.css" /> <script language="javascript" src="<?php echo Yii::app()->request->baseUrl; ?>/js/js/jquery.js" ></script> <script language="javascript" src="<?php echo Yii::app()->request->baseUrl; ?>/js/start.js" ></script> <title><?php echo CHtml::encode($this->pageTitle); ?></title> </head>

main.phpcolumn1.phpcolumn2.php

YII Framework: Layout / Main

<body> <div class="container" id="page"> <div id="header"> <div id="logo"><?php echo CHtml::encode($this->pageTitle); ?></div> </div><!-- header --> <?php if(!Yii::app()->user->isGuest){ ?> <div id="alert_header" class="alert_header"> </div> <?php } ?> <?php $this->widget('zii.widgets.CBreadcrumbs', array( 'links' => $this->breadcrumbs, )); ?><!-- breadcrumbs -->

<?php echo $content; ?>

<div id="footer">Copyright &copy; Rede Pampa - <?php echo date('Y'); ?>. </div><!-- footer -->

</div><!-- page -->

</body></html>

YII Framework: Layout / Main

<?php$this->breadcrumbs=array('Exemplo'=>array('/exemplo'),'Action1',);?><h1><?php echo $this->id . '/' . $this->action->id; ?></h1>

<p>You may change the content of this page by modifyingthe file <tt><?php echo __FILE__; ?></tt>.</p>

YII Framework: View / action1

YII Framework: Pagina gerada

YII Framework: CRUD / Index

YII Framework: CRUD / Create

YII Framework: CRUD / view

YII Framework: CRUD / Manage

YII Framework: CRUD / Controllerclass 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('*'),),

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),));}

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);

YII Framework: CRUD / Controllerif(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 browserif(!isset($_GET['ajax']))$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));}elsethrow new CHttpException(400,'Invalid request. Please do not repeat this request again.');}

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 valuesif(isset($_GET['Entidade']))$model->attributes=$_GET['Entidade'];

$this->render('admin',array('model'=>$model,));}

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();}}

<?php$this->breadcrumbs=array('Entidades'=>array('index'),'Manage',);

$this->menu=array(array('label'=>'List Entidade', 'url'=>array('index')),array('label'=>'Create Entidade', 'url'=>array('create')),);

Yii::app()->clientScript->registerScript('search', "$('.search-button').click(function(){$('.search-form').toggle();return false;});$('.search-form form').submit(function(){$.fn.yiiGridView.update('entidade-grid', {data: $(this).serialize()});return false;});");?>

<h1>Manage Entidades</h1>

YII Framework: CRUD / Widgets

<p>You may optionally enter a comparison operator (<b>&lt;</b>, <b>&lt;=</b>, <b>&gt;</b>, <b>&gt;=</b>, <b>&lt;&gt;</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',),),)); ?>

YII Framework: CRUD / Widgets

<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array('id'=>'entidade-form','enableAjaxValidation'=>false,)); ?>

<p class="note">Fields with <span class="required">*</span> are required.</p>

<?php echo $form->errorSummary($model); ?>

<div class="row"><?php echo $form->labelEx($model,'nome'); ?><?php echo $form->textField($model,'nome',array('size'=>60,'maxlength'=>255)); ?><?php echo $form->error($model,'nome'); ?></div>

<div class="row"><?php echo $form->labelEx($model,'descricao'); ?><?php echo $form->textField($model,'descricao',array('size'=>60,'maxlength'=>255)); ?><?php echo $form->error($model,'descricao'); ?></div>

<div class="row buttons"><?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?></div>

<?php $this->endWidget(); ?>

</div><!-- form -->

YII Framework: CRUD / Partial View

YII Framework: Scripts

Classe CClientScript

$baseUrl = Yii::app()->baseUrl;$cs = Yii::app()->getClientScript();$cs->registerCssFile($baseUrl . '/css/calendarjs.css');$cs->registerCssFile($baseUrl . '/css/drh/principal.css');$cs->registerScriptFile($baseUrl . '/js/calendario/jquery.js');$cs->registerScriptFile($baseUrl . '/js/calendario/mootools.js');$cs->registerScriptFile($baseUrl . '/js/calendario/calendar.js');