Iniciando com YII Framework
   Volmar Machado da Silva Neto
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
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%
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
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.
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ó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.
YII Framework: Logica
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
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
       ...
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
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: 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.*',
    ),
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'=>'webmaster@pampa.com.br
',
     ),
);
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();
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: 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');
    }

    }
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',
     ),
     );
     }
     */
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,
 ));
 }
 }
YII Framework: Layout / Main                                          main.php
                                                                      column1.php
                                                                      column2.php
<!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>
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: View / action1



      <?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 modifying
      the file <tt><?php echo __FILE__; ?></tt>.
      </p>
YII Framework: Pagina gerada
YII Framework: CRUD / Index
YII Framework: CRUD / Create
YII Framework: CRUD / view
YII Framework: CRUD / Manage
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('*'),
 ),
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 / 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.');
 }
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,
   ));
   }
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();
  }
  }
YII Framework: CRUD / Widgets

 <?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 / Partial View
<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: 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');
www.yiiframework.com
        netocame@yahoo.com.br
yii-framework-brasil@googlegroups.com
http://www.yiiframework.com/doc/guide/

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

  • 1.
    Iniciando com YIIFramework Volmar Machado da Silva Neto
  • 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 Onome 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.
  • 6.
  • 7.
  • 8.
  • 9.
    YII Framework: MVC Modelo-Visão-Controle OYii 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.
  • 10.
  • 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: Estrutrade 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: Estrutrade 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: Scriptde 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: Ciclode 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);
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 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, )); } }
  • 30.
    YII Framework: Layout/ Main main.php column1.php column2.php <!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>
  • 31.
    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>
  • 32.
    YII Framework: View/ action1 <?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 modifying the file <tt><?php echo __FILE__; ?></tt>. </p>
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 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(); } }
  • 44.
    YII Framework: CRUD/ Widgets <?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>
  • 45.
    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', ), ), )); ?>
  • 46.
    YII Framework: CRUD/ Partial View <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 -->
  • 47.
    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');
  • 48.
    www.yiiframework.com netocame@yahoo.com.br yii-framework-brasil@googlegroups.com http://www.yiiframework.com/doc/guide/