Carcleo 4 Denunciar post Postado Julho 8, 2012 Pessoal. Estou precisando mais uma vez da ajuda de vocês. Seguinte: Tenho um script de cálculo de frete com retorno do site dos correios. Aquel que muita gente usa mesmo. // URL de Consulta dos Correios entregue à variavel $correios $correios ="http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?" ."nCdEmpresa=$nCdEmpresa&" ."sDsSenha=$sDsSenha&" ."sCepOrigem=$sCepOrigem&" ."sCepDestino=$sCepDestino&" ."nVlPeso=$nVlPeso&" ."nCdFormato=$nCdFormato&" ."nVlComprimento=$nVlComprimento&" ."nVlAltura=$nVlAltura&" ."nVlLargura=$nVlLargura&" ."sCdMaoPropria=$sCdMaoPropria&" ."nVlValorDeclarado=$nVlValorDeclarado&" ."sCdAvisoRecebimento=$sCdAvisoRecebimento&" ."nCdServico=$nCdServico&" ."nVlDiametro=$nVlDiametro&" ."StrRetorno=xml"; $dados_correios = simplexml_load_file($correios); $erros = $dados_correios->xpath('cServico/Erro'); Nesse sistema que estou desenvolvendo agora, precisava fazer duas implementações e gostaria de saber se são possíveis e como: 1) Gostaria de ter retorno também da cidade e o estado do CEP informado; 2) Gostaria de saber se já existe aqui no fórum alguma arquivo com a relação do início da composição dos números dos CEPs para identificar o estado de um CEP. Alguma coisa do gênero. Outra dúvida é a seguinte: Se esse XML dos correios não entregam dados sobre a cidade e endereço do CEP, então como seria que esses sites grandes ai fazem para que, quando a gente coloca o CEP, ele já completa com a cidade e endereço completos? Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Julho 8, 2012 Outra dúvida é a seguinte: Se esse XML dos correios não entregam dados sobre a cidade e endereço do CEP, então como seria que esses sites grandes ai fazem para que, quando a gente coloca o CEP, ele já completa com a cidade e endereço completos? O próprio correios fornece a base de dados deles, pra consulta ... tem que comprar. Você pode tentar consumir esse serviço pra encontrar o nome da cidade junto ao UF :seta: http://m.correios.com.br/movel/buscaCep.do :seta: http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/ Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Julho 8, 2012 Entendi. Então, de posse dessa base de dados de cep doa correios, ai monto o ajax para autocompletar os campos né? Sem isso, sem chance. Obrigado pela direção. Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Julho 8, 2012 Sim. Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Julho 9, 2012 Mas Andrey, deixa eu te amolar só mais um pouco. Pelo código que eu postei no inicio desse post, o endereço dos correios que eu recebo o valor do frete, tem retorno por xml. Mas não recebo, nem a cidade, nem o estado. Então, pelo que entendi, o código do site pinceladas da web faz tipo uma adaptação para receber os retornos que vem em html para serem usadas pelo php como se fossem retornadas em xml. É isso? Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Julho 9, 2012 Utilizando apenas a função descrita no blog que o Andrey Knupp passou o link function simple_curl($url,$post=array(),$get=array()){ $url = explode('?',$url,2); if(count($url)===2){ $temp_get = array(); parse_str($url[1],$temp_get); $get = array_merge($get,$temp_get); } $ch = curl_init($url[0]."?".http_build_query($get)); curl_setopt ($ch, CURLOPT_POST, 1); curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($post)); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); return curl_exec ($ch); } Você pode trabalhar usando DOMDocument para "extrair" os dados que você quer <?php $cep = '94045330'; $html = simple_curl( 'http://m.correios.com.br/movel/buscaCepConfirma.do', array( 'cepEntrada' => $cep, 'tipoCep' => '', 'cepTemp' => '', 'metodo' => 'buscarCep' ) ); $DOMDocument = new DOMDocument( '1.0', 'UTF-8' ); $DOMDocument->preserveWhiteSpace = false; @$DOMDocument->loadHTML( $html ); $DOMXPath = new DOMXPath( $DOMDocument ); $value = $DOMXPath->query( './/*[@class="respostadestaque"]' ); $key = $DOMXPath->query( './/*[@class="resposta"]' ); foreach( $key as $content ) { foreach( $content->childNodes as $child ) { $keys[ ] = trim( $child->nodeValue ); } } foreach( $value as $content ) { foreach( $content->childNodes as $child ) { $values[ ] = preg_replace( '/[\s]{2,}/', null, $child->nodeValue ); } } var_dump( array_combine( $keys, $values ) ); ?> Saída array 'Logradouro:' => string 'Rua Antônio Carlos Berta' (length=25) 'Bairro:' => string 'Marrocos' (length=8) 'Localidade / UF:' => string 'Gravataí/RS' (length=12) 'CEP:' => string '94045330' (length=8) Pelo menos evita uma porrada de código(gordura) que vem junto com phpQuery Obs.: Não testei o desempenho e tals, mas fica a dica :thumbsup: Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Julho 11, 2012 Mas, nesse mesmo endereço, consigo pegar valor de frete? Ou tenho que fazer com o script que ja tenho e depois, em paralelo, pegar o endereço com este script? Esta dando warning: Warning: DOMDocument::loadHTML(): ID tipoCep already defined in Entity, line: 183 in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\chinelospuff.com.br\webservice-cep\index.php on line 35 Warning: DOMDocument::loadHTML(): ID cepTemp already defined in Entity, line: 184 in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\chinelospuff.com.br\webservice-cep\index.php on line 35 array(2) { ["Localidade / UF:"]=> string(10) "Muriaé/MG" ["CEP:"]=> string(8) "36880000" } O codigo que o Andrey postou funcionou sem erros. Meu problema é mais dificil. Derepente, eu preciso mais de orientação que código. É o seguinte: O sisteminha que eu estou fazendo, terá opções personalizadas por região do Brasil. Então, se a pessoa esta na região SUDESTE, terá opções(já cadastradas em banco) da SUDESTE e assim, por diante. Então, na pagina principal, tem um select option pro cara escolher a região, mas não há como filtrar com segurança se ele escolheu certo sua região. Cheguei a usar um plugin da geoplugin.net mas ele tem hora que falha e não entrega o estado ou vem vazio. Eles requerem o ip do cliente. <?php $link = "http://www.geoplugin.net/php.gp?ip=".$_SERVER["REMOTE_ADDR"]; $data = unserialize(file_get_contents($link)); $estado = $data["geoplugin_region"]; if($estado == "Distrito Federal" ){$regiao = "CENTRO-OESTE";} else if($estado == "Goiás" ){$regiao = "CENTRO-OESTE";} else if($estado == "Mato Grosso" ){$regiao = "CENTRO-OESTE";} else if($estado == "Mato Grosso do Sul" ){$regiao = "CENTRO-OESTE";} else if($estado == "Acre" ){$regiao = "NORTE";} else if($estado == "Distrito Federal" ){$regiao = "NORTE";} else if($estado == "Amapá" ){$regiao = "NORTE";} else if($estado == "Amazonas" ){$regiao = "NORTE";} else if($estado == "Pará" ){$regiao = "NORTE";} else if($estado == "Rondônia" ){$regiao = "NORTE";} else if($estado == "Roraima" ){$regiao = "NORTE";} else if($estado == "Tocantins" ){$regiao = "NORTE";} else if($estado == "Alagoas" ){$regiao = "NORDESTE";} else if($estado == "Bahia" ){$regiao = "NORDESTE";} else if($estado == "Ceará" ){$regiao = "NORDESTE";} else if($estado == "Maranhão" ){$regiao = "NORDESTE";} else if($estado == "Paraíba" ){$regiao = "NORDESTE";} else if($estado == "Pernambuco" ){$regiao = "NORDESTE";} else if($estado == "Piauí" ){$regiao = "NORDESTE";} else if($estado == "Rio Grande do Norte" ){$regiao = "NORDESTE";} else if($estado == "Sergipe" ){$regiao = "NORDESTE";} else if($estado == "Espírito Santo" ){$regiao = "SUDESTE";} else if($estado == "Minas Gerais" ){$regiao = "SUDESTE";} else if($estado == "Rio de Janeiro" ){$regiao = "SUDESTE";} else if($estado == "São Paulo" ){$regiao = "SUDESTE";} else if($estado == "Paraná" ){$regiao = "SUL";} else if($estado == "Santa Catarina" ){$regiao = "SUL";} else if($estado == "Rio Grande do Sul" ){$regiao = "SUL";} else { echo "<table align=\"center\" width=\"600px\" height=\"300px\"><tr><td align=\"center\" valign=\"middle\">"; echo "Desculpe, não conseguimos validar a região do Brasil a qual você se encontra"; echo "<br />"; echo "Tentando outra vez em 10 segundos..."; echo "</td></tr></table>"; header("refresh: 10; url=index.php"); } header ("Location:logon.php?acao=login®iao=$regiao") ?> para ele ver produtos do site, deverá fazer cadastro. Mas não acho uma forma de validar sua região de forma tal que, no cadastro, e no formulario de envio dos produtos comprados, só permita ao cliente entrar com ceps da região a qual ele logou. De repente existe uma logico que abranja todos os logons. Alguma orientação? Estou no caminho certo? O endereço é http://www.dinamicaimoveis.com.br/loja Alguma orientação? Compartilhar este post Link para o post Compartilhar em outros sites