8.6 – Behaviors
Seja muito bom, que eles não vão ter como ignorar você.
Steve Martin
Criar um aplicativo para controle de receitas e despesas pessoais no CakePHP 3
usando dois behaviors, um para somar as despesas de um mês e outro para somar as receitas de um mês.
Criar o banco financas
Importar o script do capítulo 15.3
Criar o aplicativo padrão usando o composer na pasta financas
Configurar o banco em config/app.php
Configurar a rota default em config/routes.php para Despesas/index
Gerar o código com o bake
bin/cake bake all despesas
bin/cake bake all receitas
Criar os dois behaviors:
bin/cake bake behavior Despesas
bin/cake bake behavior Receitas
Editar o src/ModelBehavior/Despesas e deixar assim:
<?php
namespace App\Model\Behavior;
use Cake\ORM\Behavior;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
class DespesasBehavior extends Behavior
{
protected $_defaultConfig = [];
public function despesasMes($mes){
$despesas = TableRegistry::get('Despesas')->find();
$res = $despesas->select(['total_sum' =>$despesas->func()->sum('Despesas.valor')])->where(['Despesas.mes' => $mes])->first();
$total = $res->total_sum;
return $total;
}
}
Agora edite o behavior Receitas e deixe assim:
<?php
namespace App\Model\Behavior;
use Cake\ORM\Behavior;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
class ReceitasBehavior extends Behavior
{
protected $_defaultConfig = [];
public function receitaMes($mes){
$receitas = TableRegistry::get('Receitas')->find();
$res = $receitas->select(['total_sum' =>$receitas->func()->sum('Receitas.valor')])->where(['Receitas.mes' => $mes])
->first(); //perform the sum operation
$total = $res->total_sum;
return $total;
}
}
Edite o src/Model/Table/DespesasTable.php e adicione logo abaixo do behavior Timestamp:
$this->addBehavior('Despesas');
Também no ReceitasTable.php:
$this->addBehavior('Receitas');
Customizar o controller src/Controller/DespesasController.php, adicionando ao início do arquivo:
use Cake\ORM\TableRegistry;
No início da classe:
public function despesasMes()
{
$mes = $this->request->data('mes');
$despesas = TableRegistry::get('Despesas');
$total = $despesas->despesasMes($mes);
$this->set('total',$total);
$this->set('mes',$mes);
}
public function saldoMes()
{
$mes = $this->request->data('mes');
$this->LoadModel('Receitas');// Como não é o model relacionado com este controller, precisamos usar LoadModel para carregá-lo
$receitas = $this->Receitas->receitaMes($mes);
$despesas = TableRegistry::get('Despesas');
$total = $despesas->despesasMes($mes);
$saldo = $receitas - $total;
$this->set('saldo',$saldo);
$this->set('mes',$mes);
}
Adicionar ao src/Template/Despesas:
despesas_mes.ctp
<?php ?>
<nav class="large-3 medium-4 columns" id="actions-sidebar">
<ul class="side-nav">
<h3><?= __('Despesas') ?></h3>
<?php
print '<b>Mês: </b>'.$mes. '<br><b>Total: </b>'. $total;
?>
<br>
<br>
<br>
<li><?= $this->Html->link(__('Voltar'), ['action' => 'index']) ?></li>
</nav>
saldo_mes.ctp
<?php ?>
<nav class="large-3 medium-4 columns" id="actions-sidebar">
<ul class="side-nav">
<h3><?= __('Despesas') ?></h3>
<?php
print '<b>Mês: </b>'.$mes. '<br><b>Saldol: </b>'. $saldo;
?>
<br>
<br>
<br>
<li><?= $this->Html->link(__('Voltar'), ['action' => 'index']) ?></li>
</nav>
Altere o index.ctp, adicionando ao início:
...
<nav class="large-3 medium-4 columns" id="actions-sidebar">
<ul class="side-nav">
<li class="heading"><?= __('Actions') ?></li>
<li><?= $this->Html->link(__('New Despesa'), ['action' => 'add']) ?></li>
<li><?= $this->Html->link(__('List Receitas'), ['controller' => 'Receitas', 'action' => 'index']) ?></li>
<li><?= $this->Html->link(__('New Receita'), ['controller' => 'Receitas', 'action' => 'add']) ?></li>
<li><b>Despesas de um mês</b>
<?php
echo $this->Form->create("Despesas",['url'=>'/despesas/despesas_mes']);
echo $this->Form->input('mes');
echo $this->Form->button('Submit');
echo $this->Form->end();
?></li>
<li><b>Saldo de um mês</b>
<?php
echo $this->Form->create("Saldo",['url'=>'/despesas/saldo_mes']);
echo $this->Form->input('mes');
echo $this->Form->button('Submit');
echo $this->Form->end();
?></li>
</ul>
</nav>
...
Chame pelo navegador:
http://localhost/financas
Use o pequeno form da esquerda para cálculo das Despesas de um mês. Informe o mês '05/2017'
Observe que o campo mẽs é do tipo string, com o formato mes/ano.
Também teste o Saldo de um mês.
Quando temos um model table com muitos métodos podemos criar behaviors para modular mais o código e mantê-lo mais organizado e de fácil manutenção.
Behavior Timestamp
O behavior Timestamp que irá preencher automaticamente os campos created e modified da nossa tabela.
Mais detalhes:
Comments fornecido por CComment