Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * Controller para busca de CEP utilizando serviço dos correios
- * @author Julio Vedovatto <juliovedovatto@gmail.com>
- * @version 1.0
- *
- */
- class Modulo_BuscaCepController extends Mage_Core_Controller_Front_Action {
- const CORREIOS_URL = 'http://www.buscacep.correios.com.br/servicos/dnec/consultaEnderecoAction.do';
- const CSS_QUERY_RESULT = '.ctrlcontent div table'; //seletor de css é bem limitado
- private $_http;
- public function indexAction() {
- $request = $this->getRequest();
- $output = array('success' => true);
- try {
- if (strlen(preg_replace('#\D#', '', $request->getParam('cep'))) !== 8)
- throw new Exception('CEP Inválido');
- $this->_buildHttpRequest($request->getParam('cep'));
- $output['dados'] = $this->_parseResultCEP();
- } catch (Exception $err) {
- $output['success'] = false;
- $output['error'] = $err->getMessage();
- $output['stack'] = $err->getTraceAsString();
- }
- // Retornar resultado, codificado em JSON
- $this->getResponse()
- ->clearHeaders()
- ->setHeader('Content-Type', 'application/json')
- ->setBody(Mage::helper('core')->jsonEncode($output));
- }
- // PRIVATE FUNCTIONS ----------------------------------------------------------------------------------------------------------
- /**
- * Construir requisicao HTTP.
- * @param string $cep
- */
- private function _buildHttpRequest($cep) {
- $this->_http = new Zend_Http_Client();
- $this->_http->setUri(self::CORREIOS_URL);
- $this->_http->setHeaders('User-agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)');
- // NOTA: Lembrar que os Correios podem mudar os campos a qualquer momento, caso dê problema sempre verifique os campos na url http://www.buscacep.correios.com.br/
- $this->_http->setParameterPost('relaxation', $cep);
- $this->_http->setParameterPost('TipoCep', 'ALL');
- $this->_http->setParameterPost('semelhante', 'N');
- // Hidden
- $this->_http->setParameterPost('cfm', 1);
- $this->_http->setParameterPost('Metodo', 'listaLogradouro');
- $this->_http->setParameterPost('TipoConsulta', 'relaxation');
- $this->_http->setParameterPost('StartRow', 1);
- $this->_http->setParameterPost('EndRow', 10);
- }
- /**
- * Fazer a requisicao e retornar o html necessário.
- * @throws Exception
- * @return Zend_Dom_Query_Result
- */
- private function _makeRequest() {
- $request = $this->_http->request('POST');
- $dom = new Zend_Dom_Query($request->getBody());
- return $dom->query(self::CSS_QUERY_RESULT);
- }
- /**
- * Recuperar informações do logadouro.
- * @throws Exception
- * @return array
- */
- private function _parseResultCEP() {
- $results = $this->_makeRequest();
- if (count($results) === 0)
- throw new Exception('Sem resultados');
- $dados = array(
- 'logadouro' => '',
- 'bairro' => '',
- 'localidade' => '',
- 'UF' => '',
- 'CEP' => ''
- );
- $result = $results->current(); //pegar o primeiro resultado, que contém os dados
- $doc = new DOMDocument();
- $doc->appendChild($doc->importNode($result, true)); //jogar o DomElement num novo DomDocument
- $dom = new Zend_Dom_Query($doc->saveHTML()); //setar novo html na classe Zend_Dom_Query, somente o output do elemento acima
- if (count($result_nodes = $dom->query('td')) !== 5)
- throw new Exception('Sem resultados');
- $dados['logadouro'] = $result_nodes->current()->nodeValue;
- $result_nodes->next();
- $dados['bairro'] = $result_nodes->current()->nodeValue;
- $result_nodes->next();
- $dados['localidade'] = $result_nodes->current()->nodeValue;
- $result_nodes->next();
- $dados['UF'] = $result_nodes->current()->nodeValue;
- $result_nodes->next();
- $dados['CEP'] = $result_nodes->current()->nodeValue;
- return $dados;
- }
- // /PRIVATE FUNCTIONS ---------------------------------------------------------------------------------------------------------
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement