sexta-feira, 31 de julho de 2015

CRUD no Zend Framework 2 - Update

O processo de alteração de registros no banco de dados é sempre o mais burocrático, pois antes de fazer todo o processo de alteração temos de recuperar o registro que queremos alterar. Vamos ver como fazer estes dois processo com usando o Zend Framework 2 e o Doctrine 2.

01 - A rota é o primeiro passo. Temos que criar duas rotas uma para carregar o formulário com os dados vindo do banco de dados (update) e outra para enviar os dados ao banco de dados (edit). Vamos acessar module/Administrador/config/module.config.php.


'adm-edit' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route' => '/adm/edit',
                    'defaults' => array(
                        'controller' => 'Administrador\Controller\Administrador',
                        'action' => 'edit',
                    ),
                ),
            ),
'carro-update' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/adm/update[/:id]',
                    'constraints' => array(
                        'id' => '\d+'
                    ),
                    'defaults' => array(
                        'controller' => 'Administrador\Controller\Administrador',
                        'action' => 'update',
                    ),
                )
            ),

02 - Vamos criar os métodos no controller. A classe do controller fica em module/Administrador/src/Administrador/Controller/AdministradorController.php

public function editAction() {
        $admService = $this->getServiceLocator()->get('Administrador\Service\AdministradorService');
        if ($this->getRequest()->isPost()) {
            $data = $this->getRequest()->getPost()->toArray();
            $up = $admService ->update($data);
            if (is_null($up)) {
                $this->flashMessenger()->addSuccessMessage('Alterado com sucesso.');
            } else {
                $this->flashMessenger()->addErrorMessage('Erro ao alterar.');
            }
            return $this->redirect()->toRoute('adm-home');
        } 
    }

    public function updateAction(){
        $admService = $this->getServiceLocator()->get('Administrador\Service\AdministradorService');
        $admId = $this->params()->fromRoute('id', 0);
        $data['form'] = $admService ->popForm($admId);
        return new ViewModel($data);
    }

03 - Vamos acessar a nossa classe de serviços para criarmos três métodos: um para recuperar os dados do registro do banco de dados, um para popular o formulário com o registro recuperado e o último para efetuar a alteração dos registros. A classe de serviços do módulo está localizada em module/Administrador/src/Administrador/Service/AdministradorService.php

use Carro\Form\CarroForm;

public function getById($adm_id) {
        $admRepository = $this->em->getRepository('Administrador\Entity\Administrador');
        return $admRepository ->get(array('adm_id' => $adm_id));
    }    
    
    //populando o formulario (alterar)
    public function popForm($id){       
        $administrador= $this->getById($id);        
        $array = $this->toArray($administrador);        
        $form = new AdministardorForm();       
        $form->populateValues($array);        
        return $form;
    }
    
    public function update(Array $data){
        $entity = $this->em->getReference($this->entity, $data['adm_id']);
        $obj = $this->toObject($data, $entity);
        $this->em->persist($obj);
        return $this->em->flush();

    }

04 - A nossa classe de repository precisa de mais um método get() onde passamos um array com as condições que queremos fazer a busca (where).

//pegando os registros pelos parametros passados
public function get($where=array()){      
    return $this->findOneBy($where);

}

05 -  O último é acessar module/Administrador/view/administrador/administrador/ e criar o arquivo update.phtml

<?php
$form = $this->form;
$form->setAttribute('action', $this->url('adm-edit'));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formCollection($form);
echo $this->form()->closeTag();

Nenhum comentário:

Postar um comentário