Skip to content

Instantly share code, notes, and snippets.

@handrus
Created December 2, 2011 16:43

Revisions

  1. @yourwebmaker yourwebmaker created this gist Nov 30, 2011.
    173 changes: 173 additions & 0 deletions Crud.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,173 @@
    <?php
    /**
    * Classe abstrata para funcionalidade de CRUD
    * @author Daniel Lima <yourwebmaker@gmail.com>
    * @example
    * <code>
    * <?php
    * Module_Foo_Controller extexds Cilens_Controller_Crud
    * {
    * protected $_modelName = 'Foo';
    * }
    * </code>
    */
    abstract class Cilens_Controller_Crud extends Zend_Controller_Action
    {
    /**
    * @var string nome da classe da tabela que deseja manipular
    */
    protected $_modelName = null;

    /**
    * Inicia o controller
    */
    public function init()
    {
    if ($this->_modelName == NULL) {
    throw new Exception('Você deve especificar o nome do Model');
    }
    }

    /**
    * Página inicial do crud
    */
    public function indexAction()
    {
    //conteúdo da index action
    }

    /**
    * Exibe um formulário na tela. Se o formulário for postado, o mesmo é
    * validado. Se a validação passar, o registro é armazenado, senão exibe o
    * mesmo formulário com os valores digitados
    * @return void
    */
    public function addAction()
    {
    $form = $this->getForm();
    $model = new $this->_modelName;
    $data = $this->getRequest()->getParams();

    //post enviado e form inválido
    if ($this->getRequest()->isPost() && !$form->isValid($data)) {
    //populo o form com os dados do request
    $form->populate($data);
    $this->view->form = $form;
    return;
    }

    //popula o model com valores do form
    $model = $this->prepareModel($form->getValues(), $model);
    //executa operações antes de salvar o registro
    $this->executePreSaveOperations();
    //salva o registro no banco
    $model->save();
    //executa ações depois que o registro foi salvo
    $this->executePostSaveOperations();
    //redireciona para a indexAction
    $this->_helper->redirector('index', null, null);
    }

    /**
    * Exibe um formulário na tela. Se o formulário for postado, o mesmo é
    * validado. Se a validação passar, o registro é alterado, senão exibe o
    * mesmo formulário com os valores digitados
    * @return void
    */
    public function editAction()
    {
    $model = $this->_verifyRequestedRecord();
    $form = $this->getForm();
    $form->populate($model->toArray());
    $data = $this->getRequest()->getParams();

    if ($this->getRequest()->isPost() && !$form->isValid($data)) {
    $form->populate($data);
    $this->view->form = $form;
    }

    $model = $this->prepareModel($form->getValues(), $model);
    $this->executePreSaveOperations();
    $model->save();
    $this->executePostSaveOperations();
    $this->_helper->redirector('index', null, null);
    }

    /**
    * Remove um registro do banco e redireciona para a indexAction
    */
    public function deleteAction()
    {
    $model = $this->_verifyRequestedRecord();
    $model->delete();
    $this->_helper->redirector('index');
    }

    /**
    * Visualiza um registro
    */
    public function viewAction()
    {
    $this->view->model = $this->_verifyRequestedRecord();
    }

    /**
    * Verifica se o registro requisitado existe
    * @return Doctrine_Record|Exception
    */
    protected function _verifyRequestedRecord()
    {
    $id = (int) $this->_getParam('id');
    $model = Doctrine::getTable($this->_modelName)->find($id);

    if ($model == null) {
    throw new Exception('Este registro foi deletado');
    }

    return $model;
    }

    /**
    * Retorna o nome da classe do formulário a ser usada.
    * O retorno sempre será: NomeDoModulo_Form_NomeDoModel. Caso essa classe
    * não exista... já viu!
    * @return string
    */
    public function getFormClass()
    {
    $moduleName = $this->getRequest()->getModuleName();
    $formClass = ucwords($moduleName) . '_Form_' . $this->_modelName;
    return $formClass;
    }

    /**
    * Retorna o formulário que será usado pelo controller nas ações edit e add
    * @return Zend_Form
    */
    public function getForm()
    {
    return new $this->getFormClass();
    }

    /**
    * Prepara (popula) um model à partir de um array
    * @param array $data
    * @param Doctrine_Record $model
    * @return Doctrine_Record
    */
    public function prepareModel(array $data, Doctrine_Record $model)
    {
    $model->merge($data);
    return $model;
    }

    /**
    * Método fake para execução de tarefas antes de salvar do registro
    */
    public function executePreSaveOperations();

    /**
    * Método fake para execução de tarefas depois que salvar do registro
    */
    public function executePostSaveOperations();
    }