Don't you speak portuguese? Translate this site with Google Translator

Pensamento do Dia

Uma viagem de mil kilômetros começa com o primeiro passo.(Lao - Tsé)

8.6- Behaviors

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:

https://book.cakephp.org/3.0/pt/orm/behaviors.html

https://book.cakephp.org/3.0/en/orm/behaviors.html

Comments fornecido por CComment

Novo Testamento

E aconteceu isto por três vezes; e o vaso tornou a recolher-se ao céu.
(At, 10:16)

Rotas no Mapa do Google

© 2015 Ribamar FS. All Rights Reserved. Designed By JoomShaper