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.
Associações 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
hasOne diz 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
hasMany diz 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.
Criando um modelo de
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?
|