sexta-feira, 28 de outubro de 2011

Codeigniter 2 + Partials

Partials?

São pedaços de views que facilitam a reutilização de código e diminuem a repetição.

Iniciando pelos Testes (BDD)
Criar a classe de teste em tests/helpers/PartialsHelperTest.php  para guiar o desenvolvimento da classe helper que implementa-rá as funcionalidade de Partials no Codeigniter

Para satisfazer as funcionalidades o helper deve passar pelos dois testes anteriores que são:
- renderizar uma parte de uma view
- renderizar uma parte de uma view n vezes se receber uma collection.

Fixtures
Criar uma view de fixture para os teste em tests/fixtures/_list_people_view_fixt.php
<div class="prepend-1">
<? foreach($people as $person): ?>
    <?= $say_hello ?>, <?= $person->name ?> <br />
<? endforeach; ?>
</div>
Criar um outro arquivo de fixture com a saída html para validar os testes em tests/fixtures/_list_people_view_output.html
<div class="prepend-1">
    Hello World, John <br />
    Hello World, Michael <br />
</div>

Implementado a classe de Helper

Criar a classe  application/helpers/partials_helper.php para implementar as funcionalidades


Alterar o arquivo application/config/autoload.php para carregar o helper
$autoload['helper'] = array('partials');

Utilizando as Partials

Vamos criar uma nova classe de controller que extende MY_Controller para validar o funcionamento. Como estamos extendendo de MY_Controller que utiliza a estratégia de Layouts (veja como configurar layouts) por convenção a view chamada será um arquivo de mesmo nome da action dentro de um diretório de mesmo nome da classe controller.


Criar os três arquivos  dentro do diretório application/views/people/ conforme o conteúdo abaixo.  O arquivo index.php chama as partials que são os arquivos que por convenção iniciam com "_"


Exemplo da organização das pastas do projeto.




Codeigniter 2 + Hooks + Layouts (parte 6)



Habilitar os hooks no arquivo application/config/config.php
$config['enable_hooks'] = TRUE;
Denifir um novo hook no arquivo application/config/hooks.php
$hook['display_override'][] = array('class' => 'Layout',
    'function'  => 'init',
    'filename'  => 'Layout.php',
    'filepath'  => 'hooks'
);
Criar a classe application/hook/Layout.php

Incluir constantes com os caminhos no arquivo application/config/constants.php
define('LAYOUTPATH', APPPATH .'/views/layouts/');
define('JSPATH', APPPATH . '../assets/js/');
define('CSSPATH', APPPATH . '../assets/css/');
Organizar o diretório público para os Assets do projeto
Criar um arquivo que será o template default do site em application/views/layouts/application.php

Criar uma classe centralizada para extender CI_Controller em application/core/MY_Controller.php

Baixar os frameworks css e javascript de sua preferência e colocá-los no diretórios assets/js/libs e assets/css/libs.  No projeto estão sendo usados os seguintes: http://www.blueprintcss.org , http://jquery.com , http://www.modernizr.com


Referências:
http://flaviosilveira.com/2010/habilitando-layouts-no-codeigniter-template-engine-1

quarta-feira, 19 de outubro de 2011

Codeigniter 2 + Fixtures + Relacionamentos (parte 5)

Relacionamento entre Enrollment e Student

Começando step-by-step criar a um método na classe de teste StudentTest
para validar um lado do relacionamento.  Os outros métodos da classe foram omitidos e podem ser consultados no repositório do projeto.

<?php
include_once dirname(__FILE__) . '/../support/enviromment.php';

/**
 * @group models 
 */
class StudentTest extends CIUnit_TestCase
{

   // ..... 
    public function testShouldHaveManyEnrollments()
    {
        $student = Student::find(1);
        $this->assertEquals(2, count($student->enrollments));
    }

  // ....


Rodar os testes e ver o teste quebrar. 
$  phpunit --testdox --color models/StudentTest.php

Um estudante pode ter muitas matrículas durante sua vida acadêmica, uma para cada semestre. Para isso devemos especificar este relacionamento nos modelos envolvidos.
<?php
class Student extends Person {
    
    static $primary_key = 'id';
    static $has_many = array(array('enrollments'));

    public function __construct(array $attributes = array()) {
        parent::__construct(array_merge($attributes,array('type'=> __CLASS__ )));
    }
}

<?php
class Enrollment extends ActiveRecord\Model {
  
   static $belongs_to = array(
     array('student')
   );
}

Nosso teste ainda continuará falhando, agora precisamos fazer nosso método find() do ORM retornar dados para que o método de teste funcione.  Para isso temos duas estratégias que podemos utilizar nesse momento, criar um mock do método ou utilizar fixtures para popular a base de teste.  Vamos abordar as duas alternativas iniciando com as fixtures.

Inicie criando um arquivo que conterá os dados das pessoas em /tests/fixtures/people_fixt.yml.
1:
    name: 'Paola de Oliveira'
    type: 'Student'
2:
    name: 'Gabriela Duarte'
    type: 'Student'
3:
    name: 'Márcia Lima'
    type: 'Teacher'
4:
    name: 'Fernanda Montenegro'
    type: 'Teacher'
5:
    name: 'Virgin Stanford'
    type: NULL
E outro em /tests/fixtures/enrollment_fixt.yml que vai descrever os dados das matrículas.
1:
    student_id: 1
    year: 2010
2:
    student_id: 1
    year: 2011
3:
    student_id: 2
    year: 2011
Pronto, já temos nossas fixtures criadas agora é só instanciálas  nos arquivos de test
<?php
include_once dirname(__FILE__) . '/../support/enviromment.php';

/**
 * @group models 
 */
class StudentTest extends CIUnit_TestCase
{
    # load fixtures
    protected $tables = array(
        'enrollments' => 'enrollments',
        'people' => 'people'
    ); 
   //...

Agora ao rodar os testes eles devem passar
$  phpunit --testdox --color models/StudentTest.php
------------------
Student
 [x] Should be subclass of person
 [x] Should be an instance of student
 [x] Should have many enrollments




Referências:
http://giorgiosironi.blogspot.com/2009/12/practical-php-testing-is-here.html

sábado, 1 de outubro de 2011

Codeigniter 2 + Autotest + Watchr (parte 4)

Automatizando a execução dos testes

Com o Ruby configurado em seu ambiente (veja como fazer) é só instalar a gem https://github.com/mynyml/watchr e criar um arquivo .watchr com o seguinte conteúdo.


Crie o arquivo em my-ci-app/tests/support/enviromment.php.
Este arquivo servirá para centralizar os arquivos de suporte que precisam ser importados para o funcionamento do watchr com o phpunit sendo executado a partir da raiz do projeto.
<?php
include_once dirname(__FILE__) . '/../../application/third_party/CIUnit/bootstrap_phpunit.php';
A cada novo arquivo de teste incluir a linha abaixo:
<?php
include_once dirname(__FILE__) . '/../support/enviromment.php';
O watchr ficará observando os arquivos do projeto e notificará o sistema sobre qualquer alteração.
$  watchr .watchr
Agora ao salvar tanto arquivos de testes ou do sistema uma mensagem será exibida automaticamente.


Referências: