Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ScornInPC

[Resolvido] Deletar registro com chave estrangeira

Recommended Posts

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.