Scaffolding
No momento, o Tor não faz muita coisa. Ele permite que as pessoas se registrem, façam login e vejam quem mais está registrado. Agora o que ele precisa é permitir que os usuários insiram alguns produtos no catálogo ou vejam alguns produtos de outros usuários. Um bom modo de começar isso é usar o scaffolding.
Scaffolding é um conceito que vem do Ruby on Rails (veja os Recursos). É um modo excelente de construir estruturas rapidamente para prototipar o aplicativo, sem ter que escrever um monte de código descartável. Mas o scaffolding, como indica o nome em inglês ("andaime"), é algo que deve ser usado para ajudar a construir o aplicativo, não algo sobre o qual construí-lo. Quando você começar a desejar que o scaffolding agisse diferente, é hora de parar de usá-lo.
Configuração das tabelas de produtos
O scaffolding funciona examinando tabelas de bancos de dados e criando os tipos básicos de elementos normalmente usados com uma tabela: listas, botões acrescentar/excluir/editar, as coisas normalmente chamadas de Criar, Ler, Atualizar, Excluir (CRUD). Para começar, você precisa de algumas tabelas para conter as informações de produto e de vendedor.
Listagem 4. Criando tabelas para conter informações de produto
CREATE TABLE 'products' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,
'title' VARCHAR( 255 ) NOT NULL ,
'dealer_id' INT( 10 ) NOT NULL ,
'description' blob NOT NULL ,
PRIMARY KEY ('id')
) TYPE = MYISAM ;
CREATE TABLE 'dealers' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,
'title' VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ('id')
) TYPE = MYISAM ;
|
Além disso, será útil para esta demonstração inserir alguns dados na tabela de vendedor.
INSERT INTO dealers (title)
VALUES ('Vogon Construction Corp'), ('Bistromathics, Inc')
|
Um comentário importante sobre o scaffolding: Lembra daquele comentário sobre
configuração do banco de dados sobre teclas estrangeiras que seguem o formato
singular_id como
user_id ou
winner_id?
No CakePHP, o scaffold espera que qualquer campo que termine em _id
seja uma tecla estrangeira em uma tabela com o nome do que quer que preceda _id
— por exemplo, o scaffolding esperaria que
dealer_id fosse uma tecla estrangeira da tabela
do vendedor.
Configuração do modelo de produtos
A funcionalidade dos produtos representa um conjunto totalmente novo de modelos, visualizações e controladores. Você terá de criá-los como fez na Parte 1. Crie seu modelo de produto em app/models/product.php.
Listagem 5. Criando um modelo de produto
<?php
class Product extends AppModel
{
var $name = 'Product';
var $belongsTo = array ('Dealer' => array(
'className' => 'Dealer',
'foreignKey'=>'dealer_id')
);
}
?>
|
Você notará a variável $belongsTo. Isso é
conhecido como associação de modelo.
As associações de modelo dizem a um modelo que ele está relacionado de alguma maneira a outro modelo. Configurar associações adequadas entre os seus modelos lhe permitirá lidar com entidades e seus modelos associados como um todo, em vez de individualmente. No CakePHP, há quatro tipos de associações de modelo:
-
hasOne - A associação
hasOnediz ao modelo que cada entidade nele tem uma entidade correspondente em outro modelo. Um exemplo disso seria a entidade de perfil correspondente da entidade do usuário (presumindo-se que só seja permitido um perfil por usuário).
-
hasMany - A associação
hasManydiz ao modelo que cada entidade nele tem várias entidades correspondentes em outro modelo. Um exemplo disso seria um modelo de categoria que tenha muitas coisas que pertençam à categoria (posts, produtos, etc.). No caso do Tor, uma entidade vendedora tem muitos produtos.
-
belongsTo - Isso diz ao modelo que cada entidade dele aponta para uma
entidade em outro modelo. Isso é o oposto de
hasOne, então um exemplo seria uma entidade de perfil que aponte de volta para uma entidade de usuário correspondente.
-
hasAndBelongsToMany - Essa associação indica que uma entidade tem muitas entidades correspondentes em outro modelo e também aponta de volta para muitas entidades correspondentes em outro modelo. Um exemplo disso seria uma receita. Muitas pessoas talvez gostem da receita e ela talvez tenha vários ingredientes.
A variável belongsTo nesse caso indica
que cada produto na tabela de produtos "pertence a" determinado
vendedor.
Como a associação indica, um modelo de vendedor também é necessário.
O modelo de vendedor será usado depois no Tor para construir a
funcionalidade que define as vendas. Enquanto o modelo de produto
tem uma associação de belongsTo apontando
para um vendedor, o modelo de vendedor tem uma associação com o produto
de hasMany.
Listagem 6. O modelo de vendedor tem uma associação com o produto de
hasMany
<?php
class Dealer extends AppModel
{
var $name = 'Dealer';
var $hasMany = array ('Product' => array(
'className' => 'Product',
'foreignKey'=>'dealer_id')
);
}
?>
|
Por enquanto, você pode pular o acréscimo de validação de dados, mas à medida que o aplicativo for se desenvolvendo, você talvez tenha ideias de tipos diferentes de validação para acrescentar.
Criando o controlador de produtos
Você já criou e associou os modelos de produto e vendedor. Agora o Tor sabe
como os dados estão inter-relacionados. A seguir, faça seu controlador em app/controllers/products_controller.php
—, mas desta vez acrescente a variável de classe
$scaffold.
Listagem 7. Acrescentando uma variável de classe ao seu controlador
<?php
class ProductsController extends AppController
{
var $scaffold;
}
?>
|
Salve o controlador e acesse http://localhost/products (sim, sem criar visualizações ou controlador de Vendedor). Você deve ver algo como o mostrado na Figura 1.
Figura 1. Lista de produtos vazia
Simples assim. Assim, você tem uma interface para a tabela de produtos que lhe permite acrescentar, editar, excluir, alistar, dividir e fatiar seus produtos.
Tente acrescentar um produto. Deverá ser pedido que você insira um título e descrição, além de selecionar um vendedor. Essa lista de vendedores lhe parece familiar? Deveria parecer — você a inseriu na tabela de vendedor logo após criá-la. O scaffolding reconheceu as associações da tabela à medida que você as definiu e gerou automaticamente a lista suspensa de vendedores para você.
Agora volte e olhe a quantidade de código que você escreveu para obter toda essa funcionalidade. Ficou bem mais fácil?