Telepieza es un mezcla de ayuda, información, opinión, ocio, negocio y diversión, esperamos que todos vosotros os sintaís en vuestra casa.

En el apartado (buscar de Forma automática el cambio de Divisa (I) , nos quedamos en la instrucción fsockopen() devuelve un puntero a fichero, el cual se puede usar junto con las otras funciones de ficheros (como fgets()fgetss(),fputs()fclose()feof()).

En el apartado (Buscar de Forma automática el cambio de Divisa (II), vimos un programa en PHP que realizaba un búsqueda en Google,  recuperaba una página con la divisa y se extraía el valor de la divisa.

Mi experiencia en buscar el valor de la divisa en google, es buena pero mejor localizar el cambio de la divisa en sitios donde nos den más garantías, por ejemplo en Europen Center Bank.

En la página web del banco, podemos recuperar un fichero en formato xml y después tratarlo con un programa PHP.

La forma de recuperar el fichero es por mediación de la instrucción fsockopen() igual que en el post de la segunda parte, pero la diferencia de éste es que nos traemos un fichero xml y en el post anterior una página html.

El programa lo he realizado mediante una librería Open Source llamada DOMIT, el motivo es porque tengo un montón de programas integrados con dicha librería y de paso también veis la conexión con dicho software.

Voy a colgar el programa en PHP que está funcionando desde hace muchos meses sin dar ningún tipo de error para localizar el cambio de divisa desde un Hosting con la instrucción fsockopen()

El programa php currency_class.php es una clase y la he llamado currency_class.php, ire comentando casi todas las instrucciones para su mejor comprensión.

PROGRAMA REALIZADO PARA PHP LLAMADO CURRENCY_CLASS.PHP SIENDO LA CLASE Currency.

class Currency {
public $decimal  = 5;
function __construct($p_decimal) {
if($p_decimal != 0)    $this->decimal = $p_decimal;
}

function getCurrencyXMLECB() {

$host     = ‘www.ecb.europa.eu’;                                        // Host
$page     = ‘/stats/eurofxref/eurofxref-daily.xml’;   // Pagina y fichero xml
$type     = ‘text/xml’;                                                             // Tipo fichero
$supplier = ‘European Central Bank’;                             // Nombre de la compañia
$t_time   = ”;                                   // Fecha del cambio divisa
$t_data   = array();                     // Matriz de todas las divisas y valor (Datos)
# Open Socker (ECB);
$file_info = ”;                                                                         // Fichero xml
$get_info = false;                                                                 // Variable primera lectura
# Open Socker (ECB)
if ($fsock = @fsockopen($host, $port=80, $errno, $errstr, $timeout=15)) {
# Pagina y valores a buscar en el servidor
$out = “GET $page HTTP/1.1\r\n”;
# DNS o IP del Host
$out .= “HOST: $host\r\n”;
# Tipo de Conexion y cierre
$out .= “Connection: close\r\n\r\n”;
@fputs($fsock, $out);
while (!@feof($fsock)) {
# A partir de la Segunda Lectura grabamos la informacion en $file_info para su posterior tratamiento
if ($get_info) $file_info .= @fread($fsock, 1024);
else {
# Por primera vez eliminamos la cabecera y controlamos errores de conexion
$line = @fgets($fsock, 1024);
if ($line == “\r\n”) $get_info = true;
else if (stripos($line, ’404 not found’) !== false)
{
$errstr = ‘FILE_NOT_FOUND’ . ‘: ‘ . $host . $page;
echo(‘ Currency 01-Error : ‘ . $errstr );
return false;
}
}
}
@fclose($fsock);
}
}
# Si es todo OK en la variable $file_info tenemos el fichero eurofxref-daily.xml
# Libreria Domit (leer de forma muy rapida el fichero xml)
# en la Constante MPATH_LIBRARIES Colocamos la ruta de la libraria y Clase DOMIT
# Realizamos un requiere_once del xml_domit_lite_include.php
require_once( MPATH_LIBRARIES.’domit/xml_domit_lite_include.php’ );
# Creamos la clase y parse del fichero $file_info
$xmlDoc =& new DOMIT_Lite_Document();
if( !$xmlDoc->parseXML( $file_info, false, true ) ) return false;
# Extraemos la etiqueta Cube
$currency_list = $xmlDoc->getElementsByTagName( “Cube” );
// Leemos todas las etiquetas Cube para localizar la fecha, divisa y valor de la divisa
for ($i = 0; $i < $currency_list->getLength(); $i++) {
$currNode =& $currency_list->item($i);
// Preguntamos si el atributo es time = fecha Cambio divisa
if ($currNode->getAttribute(“time”) ) $t_time = $currNode->getAttribute(“time”);
// Preguntamos si el atributo es una divisa
elseif ($currNode->getAttribute(“currency”)) {
// Pasamos la divisa a $currency
$currency = $currNode->getAttribute(“currency”);
// Pasamos el Valor a $rate
$rate = $currNode->getAttribute(“rate”);
// Grabamos en una matriz $t_data con indice $currency y valor $rate
if ( $rate > 0 ) { $t_data[$currency]=round($rate,$this->decimal);
}
unset( $currNode );
} // end function convertecb
return $t_data;
}
}

// ———————————————————————–

Creamos el objeto $change indicando los decimales a extraer de la moneda del fichero xml, una vez creado el objeto llamamos a getCurrencyXMLECB y nos devuelve false (Si no ha recuperado las divisas) o una matriz con todas las divisas con sus valores.

$change  = new Currency($decimal=4);
$conver    = $change-> getCurrencyXMLECB(); 

Share

En el apartado (buscar de Forma automática el cambio de Divisa (I) , nos quedamos en la instrucción fsockopen() devuelve un puntero a fichero, el cual se puede usar junto con las otras funciones de ficheros (como fgets(), fgetss(), fputs(), fclose(), feof()).

Voy a colgar el programa en PHP que está funcionando desde hace muchos meses sin dar ningún tipo de error para localizar el cambio de divisa desde un Hosting con la instrucción fsockopen()

El programa php currency_class.php es una clase y la he llamado currency_class.php, ire comentando casi todas las instrucciones para su mejor comprensión.

PROGRAMA REALIZADO PARA PHP LLAMADO CURRENCY_CLASS.PHP SIENDO LA CLASE Currency.

<?php
/**
* @version  $Id: currency_class.php
* @package  mvmphp
* @copyright Copyright (C) 2009
* @comment      Clase Currency (Buscar Valor de la Divisa)
*/

class Currency {
// Por defecto para toCurr es USD = Dólares y fromCurr es EUR = Euros 

 public $toCurr   = ‘USD’; 
 public $fromCurr = ‘EUR’;
 // Constructor de la Clase, si los parametros a pasar son diferentes de null, pasamos los valores a las variables de la clase
 function __construct($p_curr=null, $p_from=null) {
  if ($p_curr != null ) $this->toCurr   = $p_curr;
  if ($p_from != null) $this->fromCurr = $p_from; 
  $this->toAmount = 1;  // Valor es siempre 1
 }  
 
/**
* Busca mediante la tecnica del Socker del puerto 80 en google el valor de la divisa
* Si es correcto devuelve una página para después localizar el cambio de la divisa
*/
 function getCurrencyGoogle() {

 $host = ‘www.google.com’;
 $page = ‘/search?&q=’.$this->toAmount.’+’.$this->toCurr.’+in+’.$this->fromCurr;
 $file_info = ”;   $get_info = false;  $returnHtml = array();  $t_d=”; 

# Open Socker (Google) y search con las dos divisas con valor 1
 if ($fsock = @fsockopen($host, $port=80, $errno, $errstr, $timeout=15))
 {
# Pagina y valores a buscar en el servidor
  @fputs($fsock, “GET $page HTTP/1.1\r\n”);
# DNS o IP del Host
  @fputs($fsock, “HOST: $host\r\n”);
# Tipo de Conexion y cierre
  @fputs($fsock, “Connection: close\r\n\r\n”);
  while (!@feof($fsock))
  {  
# A partir de la Segunda Lectura grabamos la informacion en $file_info para su posterior tratamiento
   if ($get_info) $file_info .= @fread($fsock, 1024);
   else
   {
# Por primera vez eliminamos la cabecera y controlamos errores de conexion
    $line = @fgets($fsock, 1024);
    if ($line == “\r\n”) $get_info = true;
    else if (stripos($line, ’404 not found’) !== false)
    {
     $errstr = ‘FILE_NOT_FOUND’ . ‘: ‘ . $host . $page;
     error_log_event(‘ Currency 01-Error : ‘,$errstr ); 
     return false;
    }
   }
  }
  @fclose($fsock);
 }
 else
 {
  if ($errstr) { $errstr = utf8_convert_message($errstr);
                 error_log_event(‘ Currency 02-Error : ‘,$errstr );
                       return false;  }
  else     { $errstr = ‘FSOCK_DISABLED’;  
                 error_log_event(‘ Currency 03-Error : ‘,$errstr );
        return false; }
 }

Lee el resto de esta entrada »

Share

 Existen muchas técnicas diferentes para buscar el cambio de una divisa en lenguaje PHP en otro servidor que no sea el tuyo (Por ejemplo : European Center Bank). Generalmente el cambio de las divisas del día lo dan servidores de Bancos, Instituciones Económicas, Prensa especializada en economía, Las Bolsas de todo el Mundo ,  los buscadores como yahoo, google y demás organizaciones que están especializados en Importación/Exportación de Divisas.

 Para poder leer un fichero HTML en otro ordernador en PHP podemos utilizar la funcion :  file_get_contents()  y para poder leer un fichero en otro servidor en XML la funcion : simplexml_load_file()

Dichas funciones funcionan perfectamente si las utilizamos en programa PHP que sus máquinas son controladas por nuestro Dpto. Informático o en ordenadores locales con conexión a Internet.

 Las técnicas que estamos utilizando para buscar el valor de divisa en los formatos ya explicados anteriormente, son muy factibles porque dichas organizaciones nos dejan dichos ficheros en sitios públicos, para que otras compañías puedan acceder a leer libremente dichos ficheros.

 Pero la sorpresa es cuando una aplicación realizada en PHP  la ejecutamos en un HOSTING,  y vemos con sorpresa que dichas funciones nos dan error,  porque el Servidor del Hosting no permite acceder a otros Ordenadores con dichas funciones para leer los ficheros que nosotros necesitamos en nuestra aplicación.

Para solucionar el problema existe una función : fsockopen() que nos puede ayudar a leer ficheros HTML y TXT, para poder leer ficheros de otros servidores sin que el HOSTING nos corte el acceso a las máquinas remotas que deseamos acceder.

La funcion fsockopen()  abre una conexión de dominio Internet o Unix via sockets. su descripción es : 

   int fsockopen( string hostname, int port [, int errno [, string errstr [, double timeout]]])

 fsockopen() : Inicia una conexión de dominio Internet  o Unix.

 Para el domino Internet, abrirá una conexión TCP hacia el ordenador hostname en el puerto port.

 Para el dominio Unix, hostname se usará como ruta al socket, port debe ser 0 para este caso, el parámetro opcional timeoutse puede usar para especificar un timeout en segundos para establecer la conexión.

fsockopen() devuelve un puntero a fichero, el cual se puede usar junto con las otras funciones de ficheros (como fgets(), fgetss(), fputs(), fclose(), feof()).

En el siguiente post realizaremos un programa con fsockopen() para extraer el cambio de la divisa desde un servidor.

Share

 Existen muchos productos informáticos que ofrecen una solución de ERP, CRM o CMS por Internet.  Dichos productos pueden ser Open Source (licencia Gratuita) como Openbravo, osCommerce , Joomla , SugarCRM,  o de pago (Licencia por Uso),  empresas que se dedican a comercializar productos por tener una exclusiva de distribución o paquetes informáticos desarrollados por ellos mismos.

 Pero si nos movemos en el mundo de la importación de mercancía entre diferentes culturas, por ejemplo España y China, aquí empezamos a tener problemas de idioma en cualquier tipo de producto Open Source que existe en la actualidad.

 Generalmente un producto Open Source cuando es configurado,  le tienes que indicar el idioma de arranque por defecto, pero si tiene que ser visto por dos culturas simultaneas en sus idiomas correspondientes, el idioma por defecto no funciona en una de las culturas.

 Pongo un ejemplo : Imaginaros que compro productos en China y los vendo en España, mis proveedores de china cuando entran a la web,  para consultar mis pedidos tienen que ver la página principal en chino antes de identificarse con el Usuario y Contraseña. Mis clientes de España cuando entran en la página Web la tienen que ver en Español antes de identificarse en la página web.

 Si trabajamos con un idioma por defecto, por ejemplo el Español, los chinos no tienen ni idea de dicho idioma, pero sí conocen el ingles. Si ponemos el Chino por defecto en nuestra página web , aquí tenemos un serio problema,  porque existen dos tipos de lenguas, el simplificado y el tradicional. (Cuál colocar cómo lengua por defecto).

 Podemos poner cómo idioma por defecto el inglés, pero en España como en China aún no está lo suficientemente arraigado dicho idioma en el pueblo y por dicho motivo no es posible introducirlo como idioma por defecto en nuestra Web. 

 Muchas veces crees que el idioma por defecto de un paquete informático es la solución, pero cuando trabajas con dos culturas diferentes, pasa a ser un problema de grandes dimensiones para nuestro negocio de Importación o Exportación entre diferentes continentes.

Share

 En las aplicaciones por Internet cada vez es más popular el soportar varios idiomas a la vez. Existe una reglamentación el ISO-639 que regula el idioma. Tiene que ser dos dígitos y en minúsculas.

La lista está en : http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt

 Existe otro reglamento el ISO-3166 que regula los países. Tienen que ser dos dígitos y en mayúsculas.

La lista está en : http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html   
 
 Para indicar un idioma y un país en concreto se unen los dos dígitos en minusculas del idioma y los dos dígitos del país en mayúsculas unidos por un guión _.

Varios ejemplos :

  • “es_ES”   Español es España.
  • “ca_ES”   Catalán en España. 
  • ‘es_MX”  Español en Mexico.

Todo esto lo explico porque cada vez más se implementan los idiomas en lenguajes de programación orientados a Objetos como el JAVA , C++ y el PHP, que pueden tener la clase locale para gestionar los idiomas, dicha clase se regula según la reglamentación ISO-639 e ISO-3166.

Les dejo abajo todas las posibles combinaciones que existen entre los idiomas y los paises :

Value Description   Value Description
ar Arabic   fi Finnish
ar_AE Arabic (United Arab Emirates)   fi_FI Finnish (Finland)
ar_BH Arabic (Bahrain)   fr French
ar_DZ Arabic (Algeria)   fr_BE French (Belgium)
ar_EG Arabic (Egypt)   fr_CA French (Canada)
ar_IQ Arabic (Iraq)   fr_CH French (Switzerland)
ar_JO Arabic (Jordan)   fr_FR French (France)
ar_KW Arabic (Kuwait)   fr_LU French (Luxembourg)
ar_LB Arabic (Lebanon)   hi_IN Hindi (India)
ar_LY Arabic (Libya)   hr Croatian
ar_MA Arabic (Morocco)   hr_HR Croatian (Croatia)
ar_OM Arabic (Oman)   hu Hungarian
ar_QA Arabic (Qatar)   hu_HU Hungarian (Hungary)
ar_SA Arabic (Saudi Arabia)   id Indonesian
ar_SD Arabic (Sudan)   is Icelandic
ar_SY Arabic (Syria)   is_IS Icelandic (Iceland)
ar_TN Arabic (Tunisia)   it Italian
ar_YE Arabic (Yemen)   it_CH Italian (Switzerland)
be Belarusian   it_IT Italian (Italy)
be_BY Belarusian (Belarus)   iw Hebrew
bg Bulgarian   iw_IL Hebrew (Israel)
bg_BG Bulgarian (Bulgaria)   ja Japanese
ca Catalan   ja_JP Japanese (Japan)
ca_ES Catalan (Spain)   ko Korean
cs Czech   ko_KR Korean (Korea)
cs_CZ Czech (Czech Republic)   lt Lithuanian
da Danish   lt_LT Lithuanian (Lithuania)
da_DK Danish (Denmark)   lv Latvian
de German   lv_LV Latvian (Latvia)
de_AT German (Austria)   mk Macedonian
de_CH German (Switzerland)   mk_MK Macedonian (Macedonia)
de_DE German (Germany)   nl Dutch
de_LU German (Luxembourg)   nl_BE Dutch (Belgium)
el Greek   nl_NL Dutch (Netherlands)
el_GR Greek (Greece)   no Norwegian
en English   no_NO Norwegian (Norway)
en_AT English (Austria)   no_NO_NY Norwegian (Norway,Nynorsk)
en_AU English (Australia)   pl Polish
en_BR English (Brazil)   pl_PL Polish (Poland)
en_CA English (Canada)   pt Portuguese
en_CH English (Switzerland)   pt_BR Portuguese (Brazil)
en_DE English (Germany)   pt_PT Portuguese (Portugal)
en_DK English (Demark)   ro Romanian
en_ES English (Spain)   ro_RO Romanian (Romania)
en_FI English (Finland)   ru Russian
en_FR English (France)   ru_RU Russian (Russia)
en_GB English (Great Britain)   sk Slovak
en_HK English (Hong Kong)   sk_SK Slovak (Slovakia)
en_IE English (Ireland)   sl Slovenian
en_IN English (India)   sl_SI Slovenian (Slovenia)
en_IT English (Italy)   sq Albanian
en_JP English (Japan)   sq_AL Albanian (Albania)
en_KR English (Korea)   sr Serbian
en_MX English (Mexico)   sv Swedish
en_NL English (Netherlands)   sv_SE Swedish (Sweden)
en_NO English (Norway)   th Thai
en_NZ English (New Zealand)   th_TH Thai (Thailand)
en_SE English (Sweden)   tr Turkish
en_SG English (Singapore)   tr_TR Turkish (Turkey)
en_TW English (Taiwan)   uk Ukrainian
en_US English (United States)   uk_UA Ukrainian (Ukraine)
en_ZA English (South Africa)   vi Vietnamese
es Spanish   vi_VN Vietnamese (Vietnam)
es_AR Spanish (Argentina)   zh Chinese
es_BO Spanish (Bolivia)   zh_CN Chinese (China)
es_CL Spanish (Chile)   zh_HK Chinese (Hong Kong)
es_CO Spanish (Colombia)   zh_TW Chinese (Taiwan)
es_CR Spanish (Costa Rica)      
es_DO Spanish (Dominican)      
es_EC Spanish (Ecuador)      
es_ES Spanish (Spain)      
es_GT Spanish (Guatemala)      
es_HN Spanish (Honduras)      
es_MX Spanish (Mexico)      
es_NI Spanish (Nicaragua)      
es_PA Spanish (Panama)      
es_PE Spanish (Peru)      
es_PR Spanish (Puerto Rico)      
es_PY Spanish (Paraguay)      
es_SV Spanish (El Salvador)      
es_UY Spanish (Uruguay)      
es_VE Spanish (Venezuela)      
et Estonian      
et_EE Estonian (Estonia)      
Share

 Mootools es un Framework (Estructura de soporte definida, mediante la cual otro proyecto de software puede ser desarrollado), web orientado a objeto para JavaScript, de código abierto (Open Source). Gracias a dicho programa podemos desarrollar aplicaciones de escritorio de una forma sencilla y elegante.

Es interesante leer la información de la wikipedia para entender mejor el porqué es necesario programas como Mootools, Jquery, Dojo, Prototype  o script.aculo.us para desarrollar páginas web cada vez más interactivas con el usuario final (Internauta).

Mootools tiene un API para ajax, pero en mi opinión el modulo JPSpan está más desarrollado para entornos AJAX – PHP.

JPSpan una de las cosas que tiene muy buenas es el control de 6 tipos diferentes de errores.

  1. Control de Error en la comunicación con XMLHttpRequest.
  2. Mensajes de Error durante la comunicación con el Servidor.
  3. Control de Error desde el Servidor al Cliente.
  4. Mensajes de Error de Aplicación del Servidor al Cliente.
  5. Mensajes de Error de Aplicación del Cliente al Servidor.
  6. Error de sintaxis en los programas de JavaScript

JPSpan no se centra sólo en gestionar bien los mensajes de error, sino en la comunicación de datos pudiendo ser en los siguientes formatos:  JSON, PHP, XML, TXT.

Podemos utilizar Mootools como gestor de eventos para controlar las teclas y el ratón en nuestra aplicación WEB, dejando el código de nuestra página sólo con código HTML, sin ninguna instrucción  JavaScript y CSS.

Se dice que la era de la WEB 2.0 es eso, uno o varios ficheros con extensión  .css para los estilos, uno o varios ficheros .js para el código JavaScript y por último una página realizada en php o html o .NET o Java, que su resultado final  es sólo código HTML.

Todo lo expuesto no es posible si no tenemos herramientas como Mootools o JPSpan para poder realizar nuestros proyectos con una precisión y fiabilidad increible.

Pero todo tiene una pega, y son las incompatibilidades que un programador tiene cuando quiere unir diferentes programas (Mootools y JPSpan)  para poder llegar a un resultado final  esperado por el programador, cuando tenemos dichos problemas, nos es muy dificil solucionarlos por tener poca ayuda disponible en Internet.

Escribo dicho post para explicar cómo solucionar un problema grave de funcionamiento del modulo JPSpan utilizando Mootools como framework en nuestras aplicaciones Web.

El problema radica en la no recepción de parámetros o datos enviados por nuestro programa realizado en JavaScript al servidor de datos PHP.

Lee el resto de esta entrada »

Share

 Si desea contactar con telepieza, puede enviar un e-mail a: telepieza@telepieza.com.
Normas de uso y Politica de privacidad .Telepieza empezó el 20/12/2007 a las 18h (Hora Española).
 Ayude a financiar Telepieza en Internet, picando un anuncio de su interes en nuestro Weblog.