Skip to content

Instantly share code, notes, and snippets.

@hugoleodev
Created July 11, 2012 12:57
Show Gist options
  • Save hugoleodev/3090234 to your computer and use it in GitHub Desktop.
Save hugoleodev/3090234 to your computer and use it in GitHub Desktop.
Classe abstrata de crud
<?php
/**
* Classe abstrata para funcionalidade de CRUD
* @author Daniel Lima <[email protected]>
* @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();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment