 | Usando o gerador de código Bake
Não é necessário descartar totalmente tudo o que o scaffolding lhe
fornecer. Usando o Bake, o gerador de código do CakePHP, você pode
gerar um controlador que contenha funções que representem a funcionalidade
do scaffolding e as visualizações que a acompanham. Para as partes do
Tor relacionadas a produtos, isso economizará muito tempo.
No CakePHP V1.1, o Bake era um script PHP que você chamava diretamente.
No CakePHP V1.2, a funcionalidade do Bake foi movida para o Cake
Console, com o qual você se familiarizará no restante deste tutorial.
Você pode simplificar a vida se acrescentar o caminho
/webroot/cake/console à sua variável de ambiente
PATH. Isso lhe permitirá chamar o Cake
Console sem especificar as informações de caminho. Você não precisa
fazer isso, e o tutorial presumirá que você não fez. Além disso, você
deve executar o Cake Console a partir do seu diretório app de aplicativo,
— no caso: /webroot/app —, ou o Cake Console achará que
você está tentando fazer algo novo.
Antes de continuar, faça uma cópia do seu diretório app existente. O Bake
vai sobrescrever o controlador dos produtos, e é sempre necessário fazer
backup dos seus arquivos quando a operação envolver a palavra "sobrescrever"
(ou as palavras "copiar", "excluir", "formatar" ou "vodu"). Se tiver
problemas para fazer isso funcionar, certifique-se de que o executável php
esteja na sua variável de ambiente PATH.
Usando o Bake no seu controlador
de produtos
Para usar o Bake, cd no diretório /webroot/app
e abrir o Cake Console:
../cake/console/cake bake. Deve aparecer
uma tela que se parece à Figura 2.
Figura 2. Menu do Bake
Para o aplicativo Tor, o modelo que você escreveu deve ser o suficiente,
então vamos começar com o controlador. Pressione C para selecionar
o controlador. O Cake Console vai dar uma olhada no aplicativo como está
e apresentar uma lista de controladores possíveis que você talvez queira
submeter ao Bake.
Figura 3. Nome do controlador
Nesse caso, você está criando o controlador de produtos, que seria o
controlador N° 2. O Bake vai perguntar se você quer construir o
controlador interativamente. Por enquanto, pressione N para
deixar o Bake tomar todas as decisões sozinho, mas, mais tarde, tente
construir o controlador interativamente para entender o que o Bake
pode fazer para você além disso. O Bake vai perguntar então se você
quer incluir alguns métodos de classe básicos (veja a Figura 4). Pressione Y
— porque obter esse código é a principal razão de você estar
aqui. A seguir, o Bake lhe perguntará se você quer criar métodos para administrar
roteamento. Pressione N
— visto que você não precisa deles no momento. O Bake lhe pedirá
para confirmar o controlador antes de continuar. Quando você continuar,
o Bake se certificará se você deseja sobrescrever o controlador existente
(nesse caso, você deseja). O Bake deverá informá-lo então que criou o
arquivo \app\controllers\products_controller.php e lhe perguntará se
você deseja criar alguns arquivos de teste da unidade. Você pode ignorar
isso por enquanto. Quando terminar, você retornará ao menu do Bake.
Figura 4. Controlador
criado
Isso é tudo. Saia do Cake Console, abra
app/controllers/products_controller.php e dê uma olhada no que o
Bake fez para você. Deve ser algo parecido à Listagem 8.
Listagem 8. products_controller.php após o Bake
class ProductsController extends AppController {
var $name = 'Products';
var $helpers = array('Html', 'Form' );
function index() {
$this->Product->recursive = 0;
$this->set('products', $this->paginate());
}
function view($id = null)
{ if (!$id) {
$this->Session->setFlash('Invalid Product.');
$this->redirect(array('action'=>'index'));
}
$this->set('product', $this->Product->read(null, $id));
}
function add() {
if (!empty($this->data)) {
$this->Product->create();
if ($this->Product->save($this->data)) {
$this->Session->setFlash( ('The Product has been saved', true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash('The Product could not be
saved. Please, try again.', true))
}
}
$dealers = $this->Product->Dealer-find('list');
$this->set(compact('dealers'));
}
function edit($id = null){
if (!$id && empty($this->data)) {
$this->Session->setFlash('Invalid Product', true));
$this->redirect(array('action'=>'index'));
}
if (!empty($this->data)) {
if ($this->Product->save($this->data)) {
$this->Session->setFlash('The Product has been saved', true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash('The Product could not be
saved. Please, try again.', true));
}
}
if (empty($this->data)) {
$this->data = $this->Product->read(null, $id);
}
$dealers = $this->Product->Dealer->generateList();
$this->set(compact('dealers'));
}
function delete($id = null) {
if (!$id) {
$this->Session->setFlash('Invalid id for Product', true));
$this->redirect(array('action'=>'index'));
}
if ($this->Product->del($id)) {
$this->Session->setFlash(__('Product deleted', true));
$this->redirect(array('action'=>'index'));
}
}
}
?>
|
Esse controlador que você gerou usando o Cake Console contém a mesma
funcionalidade básica que você obteve pelo scaffolding, mas agora
você pode ajustá-lo às suas necessidades. Bem fácil. Pronto para outra?
Usando o Bake nas suas
visualizações de produtos
Agora que você usou o Bake no seu controlador de produtos, tudo o que o
Tor necessita é algumas visualizações de produtos. O Bake também fará
isso para você. Comece como antes no seu diretório /webroot/app:
../cake/console/cake bake.
O menu inicial do Bake deve ser idêntico a quando você o usou no controlador.
Desta vez, porém, é hora de preparar algumas visualizações. Pressione
V para selecionar visualizações. Aparecerá outra lista de visualizações
possíveis a serem criadas. Os produtos ainda devem ser o N.° 2 da lista.
O Bake lhe perguntará se você deseja criar algumas visualizações de
scaffolding (Sim/Y) e se deseja criar visualizações para administrar
roteamento (Não). Mais tarde você pode voltar e brincar com as diferentes opções do Bake.
Depois dessas duas opções, o Bake deverá lhe informar que criou as
visualizações.
Figura 5. O Bake informa você que
criou as visualizações
Saia do Cake Console, abra a visualização app/views/products/index.ctp
e dê uma olhada. Deve ser algo parecido à Listagem 9.
Listagem 9. O índice
<div class="products">
<h2><?php __('Products');?></h2>
<p>
<?php
echo $paginator->counter(array(
'format' => __('Page %page% of %pages%, showing %current%
records out of %count% total, starting on record %start%, ending on %end%', true)
));
?></p>
<table cellpadding="0" cellspacing="0">
<tr>
<th><?php echo $paginator->sort('id');?></th>
<th><?php echo $paginator->sort('title');?></th>
<th><?php echo $paginator->sort('dealer_id');?></th>
<th><?php echo $paginator->sort('description');?></th>
<th class="actions"><?php __('Actions');?></th>
</tr>
<?php
$i = 0;
foreach ($products as $product):
$class = null;
if ($i++ % 2 == 0) {
$class = ' class="altrow"';
}
?>
<tr<?php echo $class;?>>
<td>
<?php echo $product['Product']['id'] ?>
</td>
<td>
<?php echo $product['Product']['title'] ?>
</td>
<td>
<?php echo $html->link(__($product['Dealer']
['title'], true), array('controller'=> 'dealers', '
action'=>'view', $product['Dealer']['id'])); ?>
</td>
<td>
<?php echo $product['Product']['description'] ?>
</td>
<td class="actions">
<?php echo $html->link(__('View', true),
array('action'=>'view', $product['Product']['id'])); ?>
<?php echo $html->link(__('Edit', true),
array('action'=>'edit', $product['Product']['id'])); ?>
<?php echo $html->link(__('Delete', true),
array('action'=>'delete', $product['Product']['id']),
null, sprintf(__('Are you sure you want to delete
#%s?', true),
$product['Product']['id'])); ?>
</td>
</tr>
<?php endforeach; ?>
</table>
</div>
<div class="paging">
<?php echo $paginator->prev('<< '.__('previous', true),
array(), null, array('class'=>'disabled'));?>
| <?php echo $paginator->numbers();?>
<?php echo $paginator->next(__('next', true).' >>',
array(), null, array('class'=>'disabled'));?>
</div>
<div class="actions">
<ul>
<li><?php echo $html->link(__('New Product', true),
array('action'=>'add')); ?></li>
<li><?php echo $html->link(__('List Dealers', true),
array('controller'=> 'dealers', 'action'=>'index'));
?> </li>
<li><?php echo $html->link(__('New Dealer', true),
array('controller'=> 'dealers', 'action'=>'add')); ?>
</li>
</ul>
</div>
|
Dê uma olhada também nas outras visualizações. É um monte de coisas que
você não precisou escrever. Mais tarde, você vai ajustar essas
visualizações para ajudar a bloquear o Tor.
Faça um
"test drive"
Você criou um controlador e as visualizações necessárias para a
funcionalidade dos produtos. Faça um teste. Comece por
http://localhost/products e passe pelas
várias partes do aplicativo. Acrescente um produto. Edite um. Exclua
outro. Visualize um produto. Deve parecer exatamente como quando você
usava o scaffolding.
Faça mais e
melhor
Isso não chega nem perto de tudo o que o Bake pode fazer por você. Haverá
exercícios no fim do tutorial para deixar que você se aventure sozinho.
Tenha em mente que o código gerado pelo Bake deve ser seu ponto de
partida, não o fim do seu trabalho de desenvolvimento. Mas ajuda a
poupar muito tempo se usado adequadamente.
|  |