Created
July 11, 2012 12:57
-
-
Save hugoleodev/3090234 to your computer and use it in GitHub Desktop.
Classe abstrata de crud
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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