Commits

wbraganca committed ad32de7

Inicio

Comments (0)

Files changed (6)

+!.gitignore
+
+# PhpStorm
+.idea
+
+# Eclipse
+*.pydevproject
+.project
+.metadata
+bin/**
+tmp/**
+tmp/**/*
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.classpath
+.settings/
+.loadpath
+.externalToolBuilders/
+*.launch
+.cproject
+.buildpath
+
+# SublimeText
+/*.sublime-project
+*.sublime-workspace
+
+# NetBeans
+nbproject/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+nb-configuration.xml
+
+# Windows system files
+$RECYCLE.BIN/
+Thumbs.db
+ehthumbs.db
+Desktop.ini
+
+# OSX system files
+.DS_?tore
+.AppleDouble
+.LSOverride
+Icon
+._*
+.Spotlight-V100
+.Trashes
+
+# SVN/CVS
+.svn
+/CVS/*
+*/CVS/*
+.cvsignore
+*/.cvsignore
+
+# temporary files/folders
+t*mp
+tmp*
+~*
+*.~*
+*.bak
+*.swp
+<?php
+/**
+ * BuscaPorCep class file
+ *
+ * @category  Extensions
+ * @package   extensions
+ * @author	  Wanderson Bragança <wanderson.wbc@gmail.com>
+ * @copyright Copyright &copy; 2013
+ * @link	  https://bitbucket.org/wbraganca/buscaporcep
+ */
+
+/**
+ * Extensão para buscar por um determinado endereço no website dos correios utlizando
+ * o cep
+ *
+ *
+ * @category  Extensions
+ * @package   extensions
+ * @author	  Wanderson Bragança <wanderson.wbc@gmail.com>
+ * @link	  https://bitbucket.org/wbraganca/buscaporcep
+ * @version   1.0.2
+ */
+class BuscaPorCep extends CWidget
+{
+	/**
+	 * Id ou classe CSS para capturar evento de clique
+	 * @var string $target
+	 */
+	public $target = null;
+	/**
+	 * Modelo que contém os atributos de endereços
+	 * @var object $model
+	 */
+	public $model;
+	/**
+	 * Atributo referente ao CEP
+	 * @var string $attribute
+	 */
+	public $attribute;
+	/**
+	 * Array para mapear os atributos do modelo e da extensão 
+	 * <code>
+	 *	array(
+	 *		'location'=>'exemplo_logradouro',
+	 *		'district'=>'exemplo_bairro',
+	 *		'city'=>'exemplo_cidade',
+	 *		'state'=>'exemplo_estado',
+	 *	);
+	 * </code>
+	 * @var array $config
+	 */
+	public $config = array();
+	/**
+	 * URL para buscar endereço via AJAX
+	 * @var string $url
+	 */
+	public $url = '';
+	/**
+	 * Mapa de campos
+	 * @var array $fieldsMap
+	 */
+	private $fieldsMap = array();
+
+	/**
+	 * Inicializa o Widget
+	 */
+	public function init()
+	{
+		parent::init();
+		$this->fieldsMap = Yii::app()->buscaPorCepApp->getFieldsMap();
+	}
+
+	public function run()
+	{
+		$fieldsMap = array();
+		foreach( $this->config as $field => $attributeName ){
+			if( isset($this->fieldsMap[$field]) && 
+				$field != 'result' && $field != 'restul_text'){
+				$fieldsMap[$field] = CHtml::activeID($this->model, $attributeName);
+			} else {
+				throw new CException(Yii::t('BuscaPorCepApp.correios', 'Invalid parameter.'));
+			}
+		}
+		if( $this->target !== null )
+			$this->registerJS($fieldsMap);
+	}
+
+	/**
+	 * Registra script para busca via AJAX
+	 * @param array $fieldsMap
+	 */
+	protected function registerJS($fieldsMap)
+	{
+		$fieldsMap = CJSON::encode($fieldsMap);
+		$postalCodeID = CHtml::activeID($this->model, $this->attribute);
+		$url = Yii::app()->createAbsoluteUrl($this->url);
+		$script = <<<EOF
+jQuery("{$this->target}").on("click", function(){
+	var fieldsMap = {$fieldsMap};
+	$.each(fieldsMap, function(key, val) {
+		jQuery('#' + val).attr("disabled","true");
+	});
+	$.ajax({
+		dataType: "json",
+		url: "{$url}",
+		data: {'cep':jQuery("#{$postalCodeID}").val()},
+		success: function(json){
+			if( json['result'] == '1'){
+				$.each(fieldsMap, function(key, val) {
+					jQuery('#' + val).removeAttr("disabled","true");
+					jQuery('#' + val).val(unescape(json[key]));
+				});
+			}
+		}
+	});
+	return false;
+});
+EOF;
+		Yii::app()->clientScript->registerScript(__CLASS__ . $this->id, $script, CClientScript::POS_END);
+	}
+}
+<?php
+/**
+ * BuscaPorCepApp class file
+ *
+ * @category  Extensions
+ * @package   extensions
+ * @author	  Wanderson Bragança <wanderson.wbc@gmail.com>
+ * @copyright Copyright &copy; 2013
+ * @link	  https://bitbucket.org/wbraganca/buscaporcep
+ */
+
+/**
+ * Extensão para buscar por um determinado endereço no website dos correios utlizando
+ * o cep
+ *
+ * Para usar adicione no config da sua aplicação conforme exemplo abaixo:
+ * <code>
+ * array(
+ *     ...
+ *     'components'=>array(
+ *		    'buscaPorCep'=>array(
+ *		        'class'=>'ext.correios.BuscaPorCepApp'
+ *          ),
+ *          ...
+ *      ),
+ * );
+ * </code>
+ *
+ * Para realizar a busca de um endereço de um determinado CEP use:
+ * $endereco = Yii::app()->buscaPorCepApp->run('12345-678');
+ *
+ * @category  Extensions
+ * @package   extensions
+ * @author	  Wanderson Bragança <wanderson.wbc@gmail.com>
+ * @link	  https://bitbucket.org/wbraganca/buscaporcep
+ * @version   1.0.2
+ */
+class BuscaPorCepApp extends CApplicationComponent
+{
+	/**
+	 * URL padrão para buscar o endereço de um determinado CEP no website dos correios
+	 * @var string
+	 */
+	public $url = 'http://www.buscacep.correios.com.br/servicos/dnec/consultaLogradouroAction.do?Metodo=listaLogradouro&TipoConsulta=cep&CEP=';
+	/**
+	 * @var array $fieldsMap
+	 */
+	private $fieldsMap = array(
+		'location'=>'',
+		'district'=>'',
+		'city'=>'',
+		'state'=>'',
+		'result'=>0,
+	);
+
+	/**
+	 * Retorna array com mapa de campos
+	 * @return array
+	 */
+	public function getFieldsMap()
+	{
+		return $this->fieldsMap;
+	}
+
+	/**
+	 * Inicializa o componente
+	 */
+	public function init()
+	{
+		parent::init();
+		$this->fieldsMap['restul_text'] = Yii::t('BuscaPorCepApp.correios', 'Address not found.');
+	}
+
+	public function run($postalCode)
+	{
+		$postalCode = str_replace('-', '', $postalCode);
+		if( empty($postalCode) || strlen($postalCode) != 8 ){
+			$out = $this->fieldsMap;
+			$out['restul_text'] = Yii::t('BuscaPorCepApp.correios', 'Invalid postcode.');
+			$out['result'] = 0; 
+			return $out;
+		}else{
+			$url = $this->url . $postalCode;
+			$html = file_get_contents($url);
+			if($html){
+				return $this->parseHTML($html);
+			}
+		}
+		return $out;
+	}
+
+	/**
+	 * Realiza parse do HTML gerado pelo website dos correios.
+	 * @param string $html
+	 */
+	protected function parseHTML($html)
+	{
+		$findBy = '<tr bgcolor="#ECF3F6" onclick="javascript:detalharCep(';
+		$nPos = strpos($html, $findBy);
+		$cleanHTML = '';
+		$out = $this->fieldsMap;
+		if($nPos){
+			$cleanHTML  = substr($html, $nPos);
+			$nPos       = strpos($cleanHTML, '</tr>');
+			$cleanHTML  = substr($cleanHTML, 0, $nPos+5);
+			$doc = new DOMDocument(); 
+			if( $doc->loadHTML($cleanHTML) ) {
+				$tagData = $doc->getElementsByTagName('td');
+				
+				if( $tagData->length > 0 ){
+					$out['location']    = $tagData->item(0)->nodeValue;
+					$out['district']    = $tagData->item(1)->nodeValue;
+					$out['city']        = $tagData->item(2)->nodeValue;
+					$out['state']       = $tagData->item(3)->nodeValue;
+					$out['result']      = 1;
+					$out['restul_text'] = Yii::t('BuscaPorCepApp.correios', 'Address found.');
+				}
+			}
+		}
+		return $out;
+	}
+
+	/**
+	 * Mensagens de Logs.
+	 *
+	 * @param string $message Mensagem a ser registra no arquivo de log
+	 * @param string $level Nível de mensagens (por exemplo, 'trace', 'warning',
+	 * 'error', 'info', veja CLogger constants definitions)
+	 */
+	public static function log($message, $level='error')
+	{
+		Yii::log($message, $level, __CLASS__);
+	}
+}
+Extensão para buscar endereço por CEP para o Yii Framework 
+==========================================================
+
+Versão: 1.0.2
+------------
+
+A busca é realizada diretamente no website dos correios.
+
+Demo
+----
+
+[http://wbraganca.com/yii-ext/demo-yii-correios/](http://wbraganca.com/yii-ext/demo-yii-correios/)
+
+Instação e configuração
+-----------------------
+
+Copie a extensão para o diretório de extensões de sua aplicação: `extensions/correios`
+
+Adicione no arquivo de configuração de sua aplicação o seguinte código.
+
+	:::php
+	<?php
+		array(
+			...
+			'components'=>array(
+				'buscaPorCep'=>array(
+					'class'=>'ext.correios.BuscaPorCepApp'
+				),
+			...
+		);
+	?>
+
+Usando
+------
+
+Crie uma action especifica para realizar a busca e adicione o código a seguir passando o cep
+com parâmetro:
+
+	:::php
+		<?php $endereco = Yii::app()->BuscaPorCepApp->run('12345-678'); ?>
+
+Ou adicione no seu controller:
+
+	:::php
+		<?php
+			public function actions()
+			{
+				return array(
+					'buscaPorCep'=>'ext.correios.actions.BuscaPorCepAction'
+				);
+			}
+		?>
+
+Em seguinda adione na view:
+
+	:::php
+		<?php echo CHtml::button($this->label, array("id"=>"btnBuscarCep")); ?>
+
+
+	:::php
+		<?php $this->widget('ext.correios.BuscaPorCep', array(
+			'target'=>'#btnBuscarCep',
+			'model'=>$modelEndereco,
+			'attribute'=>'cep',
+			'url'=>'/site/buscaPorCep',
+			'config'=>array(
+				'location'=>'logradouro',
+				'district'=>'bairro',
+				'city'=>'cidade',
+				'state'=>'estado',
+			),
+		)); ?>

actions/BuscaPorCepAction.php

+<?php
+/**
+ * BuscaPorCepAction class file
+ *
+ * @category  Extensions
+ * @package   extensions
+ * @author	  Wanderson Bragança <wanderson.wbc@gmail.com>
+ * @copyright Copyright &copy; 2013
+ * @link	  https://bitbucket.org/wbraganca/buscaporcep
+ */
+
+/**
+ * Action responsável para retornar o resultado de uma busca
+ *
+ * @category  Extensions
+ * @package   extensions
+ * @author	  Wanderson Bragança <wanderson.wbc@gmail.com>
+ * @link	  https://bitbucket.org/wbraganca/buscaporcep
+ * @version   1.0.2
+ */
+class BuscaPorCepAction extends CAction
+{
+	public function run()
+	{
+		if( isset($_GET['cep']) ){
+			$cep = $_GET['cep'];
+			echo CJSON::encode( Yii::app()->buscaPorCepApp->run($cep) );
+		}
+	}
+}
+
+

messages/pt_br/correios.php

+<?php
+
+return array (
+	'Invalid postcode.' => 'CEP inválido.',
+	'Address found.' => 'Endereço encontrado com sucesso!',
+	'Invalid parameter.' => 'Parâmetro inválido.',
+);