ScornInPC 1 Denunciar post Postado Julho 17, 2011 Pessoal, estou tentando fazer uma mensagem de erro amigavel caso tentarem deletar um registro que tenha relação com outra tabela. O sistema gera um exception e envia para o ErrorController. Tem como pegar isso e só mostrar um erro para o usuário? Minha ação de remover /** * Ação para remover o registro * * @name removeAction */ public function removeAction() { // Desabilita o layout $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(TRUE); // Recupera o id $id = ($this->_request->getParam("id")) ? $this->_request->getParam("id") : 0; // Verifica se existe id if($id > 0) { // Cria o where $where = $this->_model->getAdapter()->quoteInto("idproduto = ?", $id); // Remove o registro $this->_model->delete($where); } // Redireciona $this->_helper->redirector("index", NULL, NULL); } Valeu galera. Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Julho 17, 2011 Vamos começar pelo seguinte: // Recupera o id $id = ($this->_request->getParam("id")) ? $this->_request->getParam("id") : 0; // Verifica se existe id if($id > 0) { // Cria o where $where = $this->_model->getAdapter()->quoteInto("idproduto = ?", $id); // Remove o registro $this->_model->delete($where); } Melhorando estas linhas: $this->_request->getParam("id"); O método getParam() pode receber dois parâmetros, sendo que o segundo é o valor default. Então podemos substituir: $id = ($this->_request->getParam("id")) ? $this->_request->getParam("id") : 0; Por $id = $this->_request->getParam("id", 0); Outra coisa // Cria o where $where = $this->_model->getAdapter()->quoteInto("idproduto = ?", $id); // Remove o registro $this->_model->delete($where); Podemos colocar direto no where. Assim: // Remove o registro $this->_model->delete(array("idproduto = ?" => $id)); Sobre o seu problema, você pode colocar o $this->_model->delete() dentro de um bloco try catch, fazendo o tratamento da mensagem diretamente no controller. Outra opção é sobrescrever o método delete() no seu model, fazendo o tratamento nele (acho melhor). Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
ScornInPC 1 Denunciar post Postado Julho 17, 2011 Nossa rapaz, essas 2 dias ai que voce deu vai li livrar de um monte de código uhauehae Sobre colocar dentro de um try catch eu ja tentei e nao funcionou nao, alias, entrei nos fontes do zend e achei onde executa a query do delete, e la tambem nao tem nada para gerar a exceção. Preciso habilitar alguma coisa antes de poder usar o try catch ai? Valeu pelas dicas =) Compartilhar este post Link para o post Compartilhar em outros sites
ScornInPC 1 Denunciar post Postado Julho 17, 2011 Fiz o teste com outras coisas, por exemplo upload de arquivo, e tambem nao cai no catch // Cria o objeto $file_transfer = new Zend_File_Transfer_Adapter_Http(); // Seta o diretório destino $file_transfer->setDestination("common/uploads/photos"); // faz o upload try { $valid = $file_transfer->receive(); } catch(Exception $e) { die("OK"); } PS: Ja tentei com Zend_Exception também; Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Julho 17, 2011 Então... no seu Model, você faz assim (por exemplo): public function delete($where) { try { parent::delete($where); } catch (Exception $e) { echo 'Opa... algum problema aconteceu.'; } } Tente executar com um erro e veja o que acontece. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
ScornInPC 1 Denunciar post Postado Julho 17, 2011 Rapaz, mas não é que funcionou? =D Mas por que no controlador se eu gero exceptions ele nao entra? Não deveria ser a mesma coisa já que o delete() é o do objeto parent? Que coisa de louco em =) E nos casos como o do upload? Ele deveria disparar um exception tb não deveria? Valeu! Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Julho 17, 2011 Olha, em teoria ele deveria capturar a exceção sempre que for executado um bloco try catch. O código do controller/action é executado dentro de um bloco try catch. Se você executa um método específico dentro de um novo bloco try catch ele deve capturar. O que pode acontecer é que a exceção é enviada antes. Sobre a questão do upload, você pode fazer assim: // faz o upload try { // Cria o objeto $file_transfer = new Zend_File_Transfer_Adapter_Http(); // Seta o diretório destino $file_transfer->setDestination("common/uploads/photos"); $valid = $file_transfer->receive(); } catch(Exception $e) { echo 'Ops... problemas no upload - '.$e->getMessage(); } Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
ScornInPC 1 Denunciar post Postado Julho 17, 2011 Hum rapaz, entendi a essência da coisa. No upload funcionou tambem. Mudei meu update, e desta forma tambem funcionou. Poxa, obrigado de novo pela ajuda enorme. Boa semana Compartilhar este post Link para o post Compartilhar em outros sites
Matias Rezende 50 Denunciar post Postado Julho 17, 2011 Valeu!!! Boa semana!! Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites