Método específico no model para retornar JSON

194 views
Skip to first unread message

Ronaldo Lanhellas

unread,
Jun 3, 2013, 8:44:43 AM6/3/13
to zfbr...@googlegroups.com
Bom, tenho que carregar um SELECT (TAG HTML) dinamicamente em AJAX utilizando JSON. Para isso criei um método chamado selectJSON no meu MODEL, segue abaixo:

public function selectJSON($where = null, $order = null, $limit = null) {
        try {
            $dao = new Cadastros_Model_DbTable_Regiao();
            $select = $dao->select()
                    ->from($dao)
                    ->order($order)
                    ->limit($limit);
            if (!is_null($where)) {
                $select->where($where);
            }
            $dado_retornado = json_encode($dao->fetchAll($select)->toArray());            
            return array('dado' => $dado_retornado, 'msg' => true);
        } catch (Zend_Db_Exception $e) {
            My_Geralog::getInstance()->inserirLog("Erro: Código: " . $e->getCode() . " Mensagem: " . $e->getMessage());
            return array('dado' => $e->getMessage(), 'msg' => false);
        } catch (Zend_Exception $e) {
            My_Geralog::getInstance()->inserirLog("Erro: Código: " . $e->getCode() . " Mensagem: " . $e->getMessage());
            return array('dado' => $e->getMessage(), 'msg' => false);
        }
    }

Eu preciso passar a URL para o AJAX dizendo onde ele irá recuperar esse JSON, então pensei em criar no controller um action que retorna o JSON, código abaixo:

public function retornarRegioesJSONAction()
    {
        $model = new Cadastros_Model_Regiao();
        $retorno = $model->selectJSON();
         if ($retorno['msg'] == true)
             return $retorno['dado'];
    }

E no meu AJAX eu chamaria a url: localhost/meusistema/cadastros/regiao/retornarRegioesJSON, onde cadastros é o modulo e regiao é o controller.

Minha dúvida é: é correto eu usar o action da forma acima ou foge do propósito do MVC ? Se estiver errado, onde eu deveria aplicar esse retorno ?

Jaime Marcelo Valasek

unread,
Jun 3, 2013, 8:51:43 AM6/3/13
to zfbr...@googlegroups.com
Se está correto eu não sei te dizer, mas é o que a maioria das programadores fazem. Lembrando que para retornar um JSON no ZF1 basta usar json_enconde, mas no ZF2 para retornar um JSON tem que usar a classe Json do ZF2:

use Zend/Json/Json;

Json::endoce();

Vamos lá, de repente alguém da comunidade sugere uma solução melhor.

Abraços!



--
--
Essa mensagem faz parte do grupo "zfbrasil" no Google Groups.
Para escrever neste grupo, envie um email para zfbr...@googlegroups.com
Para se desligar do grupo, envie um email para zfbrasil-u...@googlegroups.com
Mais informações, visite o grupo em http://groups.google.com/group/zfbrasil?hl=pt-BR
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Zend Framework Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para zfbrasil+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Ronaldo Lanhellas

unread,
Jun 3, 2013, 8:58:01 AM6/3/13
to zfbr...@googlegroups.com
Certo, JSON_ENCODE já estou utilizando no retorno do MODEL.


Você recebeu esta mensagem porque está inscrito em um tópico do grupo "Zend Framework Brasil" dos Grupos do Google.
Para cancelar a inscrição neste tópico, acesse https://groups.google.com/d/topic/zfbrasil/R6pHhzV75k4/unsubscribe?hl=pt-BR.
Para cancelar a inscrição neste grupo e todos os seus tópicos, envie um e-mail para zfbrasil+u...@googlegroups.com.

Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 



--
Att. Ronaldo Lanhellas
Founder/CEO QueroBuy Solutions

Tel Comercial: (91) 8395-6741 
Facebook: /querobuy
Twitter: @querobuy

Josiel Rocha

unread,
Jun 3, 2013, 9:03:20 AM6/3/13
to Zend Framework Brasil

no Controller:

// Importar a classe:
use Zend\View\Model\JsonModel;

// Retornar um JsonModel com o Array de dados como parametro
return new JsonModel($MyModel->fetchPairs());



____________________
Josiel Rocha

Ronaldo Lanhellas

unread,
Jun 3, 2013, 9:04:33 AM6/3/13
to zfbr...@googlegroups.com
Uso ZEND 1

Josiel Rocha

unread,
Jun 3, 2013, 9:09:23 AM6/3/13
to Zend Framework Brasil
Ok.

De toda forma, eu deixaria o model retornar um Array e o converteria para JSON após o retorno, assim eu poderia utilizar o mesmo método para popular outros campos, por exemplo, um <SELECT>.

Ai não sei se estaria correto, mas retornaria do Controller um:
Zend_Json::encode($Model->fetchPairs())

Outra solução seria:

1. Desabilitar a renderização do layout
2. Adicionar o header "Content-type: application/json"
3. Zend_Json::encode($this->data);

na View, mas aí seria outra discussão, o que vocês acham??? Fariam/fazem desta forma ou trabalham de alguma outra maneira não citada nessa thread?

____________________
Josiel Rocha

Ronaldo Lanhellas

unread,
Jun 3, 2013, 9:14:03 AM6/3/13
to zfbr...@googlegroups.com
O estranho é que fazendo o método no controller Regiao da forma que eu mencionei acima, eu só consigo chamar o retornarRegioesJSONAction se colocar a palavra "action" no fim da URL, coisa que não ocorre com os outros métodos como: new, update, edit..

Wilt::on

unread,
Jun 3, 2013, 10:42:39 AM6/3/13
to zfbr...@googlegroups.com
Sempre utilizo duas formas, ambas desabilitam o layout e rederização da view.
* Dentro da action
$this->_helper->json->sendJson($model->fetchPairs());


e se for algo mais complexo eu crio o contexto ajax no método init do controller:

public function init ()
{
        $ajaxContext = $this->_helper->getHelper('AjaxContext');
        $ajaxContext
            ->addActionContext('cadastrar', 'json')
            ->addActionContext('editar', 'json')
            ->addActionContext('detalhar', 'json')
            ->addActionContext('excluir', 'json')
            ->initContext();
        //$ajaxContext->addActionContext('pesquisar', 'json')
 }

public function myAction()
{
        $model = new Default_Model_My();
        $this->view->dados = $model->fetchPais();
}


Desta forma o que eu passar para a view será enviado como JSON. Isso acontece quando o ZF reconhece que a requisição é AJAX (XmlHttpRequest).







Ronaldo Lanhellas

unread,
Jun 4, 2013, 3:19:42 PM6/4/13
to zfbr...@googlegroups.com
Mas amigo, eu não quero atribuir valores para a view, apenas retornar um JSON. Isso porque eu vou utilizar isso no JSON JQUERY mais tarde.
Att. Ronaldo Lanhellas
Bacharel em Ciência da Computação
Founder/CEO QueroBuy Solutions

Tel: (91) 8395-6741 

Wilt::on

unread,
Jun 4, 2013, 4:45:17 PM6/4/13
to zfbr...@googlegroups.com
Basta utilizar a primeira forma que passei no email anterior:

$this->_helper->json->sendJson($model->fetchPairs());

Daniel Lima

unread,
Jun 5, 2013, 12:22:21 AM6/5/13
to zfbr...@googlegroups.com
A forma mais correta é usando o ContextSwitch ou o AjaxContext que o Wilton mostrou.

Não é da responsabilidade do seu model saber o formato de dados que será retornado. Quem deve converter os dados é o controller e este passar os dados para a view.

Por mais estranho que pareça, o JSON é a view que você está retornando na requisição.

Suponha que você tenha action /cidade/listar/, que lista todas as cidades do Brasil. Se você quer filtrar, você faz /cidade/listar/estado/MG, por exemplo. Mas.. suponha que você quer usar essa mesma action pra ajax ou pra um webservice? Vai criar outra action? Uma action só para retornar JSON? Seria mais simples vc fazer /cidade/listar/estado/MG/format/json =)

Pesquise sobre o ContextSwitch e AjaxContext que você achará a resposta certinha.

Abs,

________________________________________

Daniel Lima 

Web Develope

(33) 9131-9158

Skype: yourwebmaker
Twitter: @yourwebmaker 

Talk: yourwe...@gmail.com

Msn: yourwe...@hotmail.com



2013/6/4 Wilt::on <wilto...@gmail.com>

Ronaldo Lanhellas

unread,
Jun 5, 2013, 6:36:11 AM6/5/13
to zfbr...@googlegroups.com

Daniel,  otima explicação.  Obrigado.

Reply all
Reply to author
Forward
0 new messages