<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3609603393360246412</id><updated>2025-08-03T01:18:05.288-06:00</updated><category term="php"/><category term="linux"/><category term="CodeIgniter"/><category term="jQuery"/><category term="javascript"/><category term="magento"/><category term="mysql"/><category term="helper"/><category term="1and1"/><category term="5"/><category term="centos"/><category term="servidor"/><category term="vista"/><category term="18 digitos"/><category term="SOAP"/><category term="WSDL"/><category term="controlador"/><category term="convertir numeros a letras"/><category term=".bashrc"/><category term="10"/><category term="2"/><category term="5.1"/><category term="Enabled WSDL Cache"/><category term="api"/><category term="array"/><category term="business package"/><category term="como"/><category term="config"/><category term="controller"/><category term="convertir"/><category term="grep"/><category term="html"/><category term="informix"/><category term="input"/><category term="modelo"/><category term="personalizar"/><category term="postgresql"/><category term="prompt"/><category term="select"/><category term="ssh"/><category term="web services"/><category term=".bash_profile"/><category term=".htaccess"/><category term="000webhost"/><category term="1.4.2"/><category term="11"/><category term="5.2"/><category term="5.3"/><category term="5.5"/><category term="7"/><category term="CSS"/><category term="LG-E510"/><category term="Model.php"/><category term="NuSOAP"/><category term="SoapServer"/><category term="acentos"/><category term="action"/><category term="address"/><category term="ajax"/><category term="alias"/><category term="android"/><category term="apache"/><category term="api v3"/><category term="asociativos"/><category term="atomic"/><category term="autoload"/><category term="ayuda"/><category term="billones"/><category term="bitacora"/><category term="buscar"/><category term="cadena"/><category term="calendario"/><category term="caracteres especiales"/><category term="cheatsheet"/><category term="checkbox"/><category term="checked"/><category term="chm"/><category term="class"/><category term="colorear"/><category term="comando"/><category term="como implementar"/><category term="componente"/><category term="config.xml"/><category term="constantes"/><category term="countdown"/><category term="crear"/><category term="create function"/><category term="create procedure"/><category term="csv"/><category term="cuenta regresiva"/><category term="custom variables"/><category term="cómo"/><category term="data"/><category term="datepicker"/><category term="datos"/><category term="decimales"/><category term="dedicated"/><category term="descomprimir"/><category term="desencriptar"/><category term="display_errors"/><category term="documentacion"/><category term="each()"/><category term="ejemplo"/><category term="email"/><category term="en_US"/><category term="encriptar"/><category term="equivalente"/><category term="errores"/><category term="es_MX"/><category term="escenario"/><category term="español"/><category term="estrés"/><category term="expresiones regulares"/><category term="extender"/><category term="fecha"/><category term="filas"/><category term="firefox"/><category term="first"/><category term="font"/><category term="formatear"/><category term="forms"/><category term="fr_FR"/><category term="geocodificación inversa"/><category term="getActionName"/><category term="getControllerName"/><category term="getInstance()"/><category term="getModel"/><category term="getModuleName"/><category term="getRequest"/><category term="getRoutename"/><category term="getstore"/><category term="google"/><category term="google maps"/><category term="grant"/><category term="highlight"/><category term="hora"/><category term="http"/><category term="http request"/><category term="idioma"/><category term="idiomas"/><category term="informacion"/><category term="ini_set"/><category term="insert_rows()"/><category term="insertar"/><category term="internacionalización"/><category term="invoice"/><category term="inyectar"/><category term="item"/><category term="jmeter"/><category term="joomla"/><category term="json"/><category term="json_decode"/><category term="json_encode"/><category term="limit"/><category term="loadByCode"/><category term="log"/><category term="logs"/><category term="ls"/><category term="manual"/><category term="mensajes"/><category term="mexicano"/><category term="micro sd"/><category term="miles"/><category term="module"/><category term="modulo"/><category term="mostrar"/><category term="mvc"/><category term="mysql.servers"/><category term="mysql.sock"/><category term="mysql.users"/><category term="mysql_fix_privilege_tables"/><category term="mysql_upgrade"/><category term="mysqld"/><category term="múltiples"/><category term="numeros"/><category term="object"/><category term="offset"/><category term="ordenar tabla"/><category term="order"/><category term="overlays"/><category term="paginar"/><category term="panel"/><category term="parametros"/><category term="pdf"/><category term="perfiles"/><category term="plan"/><category term="plesk"/><category term="plug-in"/><category term="plugin"/><category term="poo"/><category term="post"/><category term="preg_match"/><category term="profiles"/><category term="prop()"/><category term="proxy"/><category term="pruebas"/><category term="putty"/><category term="redireccionamiento"/><category term="redireccionar"/><category term="reducir"/><category term="reemplazar"/><category term="replace"/><category term="repository"/><category term="rocket"/><category term="root"/><category term="rootear"/><category term="route"/><category term="rpc"/><category term="rpm"/><category term="script"/><category term="scrollable"/><category term="seleccionar"/><category term="server"/><category term="sesion"/><category term="shipping address"/><category term="simpleXML"/><category term="simplexml_load_file"/><category term="singleton"/><category term="sitemap"/><category term="sitemap.xml"/><category term="skip"/><category term="smtp"/><category term="sql"/><category term="sqlserver"/><category term="store"/><category term="subdirectorios"/><category term="tablesorter"/><category term="tabs"/><category term="tags"/><category term="tamaño"/><category term="tar"/><category term="thread"/><category term="tiempo restante"/><category term="tienda"/><category term="time remaining"/><category term="tipo de archivos"/><category term="tools"/><category term="tooltips"/><category term="traducciones"/><category term="traducir"/><category term="turtle"/><category term="two way"/><category term="ubuntu"/><category term="ui"/><category term="unalias"/><category term="unlockroot"/><category term="unzip"/><category term="v2"/><category term="validar email"/><category term="validate"/><category term="validation"/><category term="variables"/><category term="verificar"/><category term="view"/><category term="virtual"/><category term="webmasters"/><category term="widget"/><category term="window.location"/><category term="window.location.href"/><category term="window.location.replace"/><category term="windows"/><category term="winzip"/><category term="xml"/><category term="xp"/><category term="xss"/><category term="yum"/><category term="zend"/><category term="zend_pdf"/><title type='text'>Ingeniería de Software</title><subtitle type='html'>Recursos, trucos, codigos en PHP, JavaScript, Zend Framework, Magento, CodeIgniter, RUP, MVC, XP, jQuery, Joomla, MySql, Postgresql</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-8243763474046490061</id><published>2013-07-24T13:08:00.000-05:00</published><updated>2013-07-24T13:08:58.064-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="extender"/><category scheme="http://www.blogger.com/atom/ns#" term="filas"/><category scheme="http://www.blogger.com/atom/ns#" term="insert_rows()"/><category scheme="http://www.blogger.com/atom/ns#" term="insertar"/><category scheme="http://www.blogger.com/atom/ns#" term="Model.php"/><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="múltiples"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="postgresql"/><title type='text'>Codeigniter 2: cómo insertar multiples filas en una tabla</title><content type='html'>&lt;h3&gt;Insertar múltiples filas en CodeIgniter 2, útil para manejadores como MySQL y PostgreSQL&lt;/h3&gt;
&lt;p&gt;
Este artículo lo tomé de &lt;a href=&quot;http://codefury.net/2009/12/insert-multiple-rows-into-a-database-with-codeigniter/&quot; target=&quot;_blank&quot;&gt;http://codefury.net/2009/12/insert-multiple-rows-into-a-database-with-codeigniter/&lt;/a&gt;, pero lo he adaptado para funcionar con CI2
&lt;/p&gt;
&lt;h3&gt;Paso 1: Extender la clase Model.php&lt;/h3&gt;
&lt;p&gt;
En la carpeta &lt;code&gt;application/core/&lt;/code&gt; crear la clase MY_Model.php, el prefijo &lt;code&gt;MY_&lt;/code&gt; debe ser el mismo que se encuentra establecido en el archivo config.php en el elemento &lt;code&gt;&#39;subclass_prefix&#39;&lt;/code&gt;
&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;
&amp;lt;?php

/**
 * @link http://codefury.net/2009/12/insert-multiple-rows-into-a-database-with-codeigniter/ Hacer multiples inserts
 * @author KENNY KATZGRAU
 */
class MY_Model extends CI_Model
{

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * A method to facilitate easy bulk inserts into a given table.
     * @param string $table_name
     * @param array $column_names A basic array containing the column names of the data we&#39;ll be inserting
     * @param array $rows A two dimensional array of rows to insert into the database.
     * @param bool $escape Whether or not to escape data that will be inserted. Default = true. Para otros drivers diferentes a MySQl, habría que poner FALSE
     * @author Kenny Katzgrau 
     */
    public function insert_rows($table_name, $column_names, $rows, $escape = true)
    {
        /* Build a list of column names */
        $columns = array_walk($column_names, array($this, &#39;prepare_column_name&#39;));
        $columns = implode(&#39;,&#39;, $column_names);

        /* Escape each value of the array for insertion into the SQL string */
        if ($escape){
            array_walk_recursive($rows, array($this, &#39;escape_value&#39;));
        }
        
        # asignar un table-prefix si está definido en el archivo database.php
        $table_name = $this-&gt;db-&gt;dbprefix($table_name);

        /* Collapse each rows of values into a single string */
        $length = count($rows);
        for ($i = 0; $i &lt; $length; $i++){
            $rows[$i] = implode(&#39;,&#39;, $rows[$i]);
        }

        /* Collapse all the rows into something that looks like
         *  (r1_val_1, r1_val_2, ..., r1_val_n),
         *  (r2_val_1, r2_val_2, ..., r2_val_n),
         *  ...
         *  (rx_val_1, rx_val_2, ..., rx_val_n)
         * Stored in $values
         */
        $values = &quot;(&quot; . implode(&#39;),(&#39;, $rows) . &quot;)&quot;;

        $sql = &quot;INSERT INTO {$table_name} ({$columns}) VALUES {$values}&quot;;
        
        /*
        $querie_file = PATH_APP_DEBUGS . &#39;queries_&#39; . date(&#39;Y-m-d&#39;) . &#39;.log&#39;;
        file_put_contents($querie_file, $sql, FILE_APPEND);
         * 
         */

        return $this-&gt;db-&gt;simple_query($sql);
    }

    public function escape_value(&amp; $value)
    {
        if (is_string($value)) {
            $value = &quot;&#39;&quot; . mysql_real_escape_string($value) . &quot;&#39;&quot;;
        }
    }

    public function prepare_column_name(&amp; $name)
    {
        $name = &quot;`$name`&quot;;
    }

}
&lt;/pre&gt;

&lt;h3&gt;Paso 2: Ejemplo A&lt;/h3&gt;
&lt;p&gt;He aquí un ejemplo para probar la inserción de varias filas en un mismo query:
&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;
class Messages extends MY_Model 
{   
  /* Code .. */   
  function insert_test_data()   
  {     
    /* Prepare some fake data (10000 rows, 40,000 values total) */
    $rows = array_fill(0, 10000, array(34239, 102438, &quot;Test Message!&quot;, &#39;2009-12-12&#39;));
    $columns = array(&#39;to_user_id&#39;, &#39;from_user_id&#39;, &#39;message&#39;, &#39;created&#39;);
    $this-&gt;insert_rows(&#39;messages&#39;, $columns, $rows); 
  }
}
&lt;/pre&gt;

&lt;h3&gt;Paso 1: Ejemplo B&lt;/h3&gt;
&lt;p&gt;Otro ejemplo, de cómo se usaría en un método típico de un modelo en CodeIgniter:
&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;
&amp;lt;?php

class M_usuarios extends MY_Model
{

    private $_enc_key;
    protected $_usuario_id;

    public function asignar_permisos()
    {
        $this-&gt;_usuario_id = (int) $this-&gt;input-&gt;post(&#39;sel_campo01&#39;);
        $this-&gt;db
                -&gt;where(&#39;usuario_id&#39;, $this-&gt;_usuario_id)
        ;
        try {
            $this-&gt;db-&gt;trans_start();

            $this-&gt;db-&gt;query(&#39;LOCK TABLES t_ci_sessions LOW_PRIORITY WRITE&#39;);
            $this-&gt;db-&gt;query(&#39;LOCK TABLES t_usuarios_t_submenus LOW_PRIORITY WRITE&#39;);

            # primero, eliminar todos los permisos asignados
            $delete = $this-&gt;db-&gt;delete(&#39;usuarios_t_submenus&#39;);

            # segundo, insertar todos los permisos recién asignados
            $a_columns = array(&#39;usuario_id&#39;, &#39;submenu_id&#39;);
            $a_rows = $this-&gt;_preparar_datos_permisos($this-&gt;_usuario_id, $this-&gt;input-&gt;post(&#39;sel_campo02&#39;));

            # método insert_rows() que nosotros definimos en la clase MY_Model.php
            $insert = $this-&gt;insert_rows(&#39;usuarios_t_submenus&#39;, $a_columns, $a_rows);
            
            $this-&gt;db-&gt;query(&#39;UNLOCK TABLES&#39;);
            $this-&gt;db-&gt;trans_complete();
            
            return array(&#39;insert&#39; =&gt; TRUE, &#39;mensaje&#39; =&gt; &#39;&#39;);
        } catch (Exception $e) {
            $this-&gt;db-&gt;query(&#39;UNLOCK TABLES&#39;);
            $this-&gt;db-&gt;trans_complete();

            return array(&#39;insert&#39; =&gt; FALSE, &#39;mensaje&#39; =&gt; $e-&gt;getMessage());
        }
    }

    private function _preparar_datos_permisos($usuario_id, $permisos)
    {
        $filas = array();
        foreach ($permisos as $_submenu_id){
            $filas[] = array($usuario_id, $_submenu_id);
        }
        
        return $filas;
    }
}
&lt;/pre&gt;
&lt;p&gt;
Eso es todo, espero que les sea de utilidad.
&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/8243763474046490061/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/07/codeigniter-como-insertar-multiples-filas-en-una-tabla-mysql-postgresql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8243763474046490061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8243763474046490061'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/07/codeigniter-como-insertar-multiples-filas-en-una-tabla-mysql-postgresql.html' title='Codeigniter 2: cómo insertar multiples filas en una tabla'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-8057269924101925247</id><published>2013-07-12T10:37:00.001-05:00</published><updated>2013-07-12T10:38:58.097-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="como"/><category scheme="http://www.blogger.com/atom/ns#" term="internacionalización"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="mensajes"/><category scheme="http://www.blogger.com/atom/ns#" term="personalizar"/><category scheme="http://www.blogger.com/atom/ns#" term="plugin"/><category scheme="http://www.blogger.com/atom/ns#" term="traducir"/><category scheme="http://www.blogger.com/atom/ns#" term="validation"/><title type='text'>Cómo traducir y personalizar los mensajes del plugin jQuery Validation</title><content type='html'>&lt;p&gt;Te paso un archivo de traducción de los mensajes predeterminados del plugin jQuery Validation, además en la segunda parte de este post, te mostraré como personalizar mensajes en lugar de usar los textos generales.&lt;/p&gt;
&lt;p&gt;Puedes descargar el archivo de traducción (internacionalización) &lt;a href=&quot;http://ultiminioramos.com/blogger_demos/jquery-validation/validation.es_MX.js&quot;&gt;desde aquí. El ejemplo es en español mexicano.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;1. El archivo&lt;/h3&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;
(function($) {
    $(document).ready(function(e) {
        if ($.fn.validate) {
            jQuery.extend(jQuery.validator.messages, {
                required: &quot;Este campo es obligatorio.&quot;,
                remote: &quot;Revisar este campo.&quot;,
                email: &quot;La dirección de correo no es válida.&quot;,
                url: &quot;La URL no es válida.&quot;,
                date: &quot;La fecha no es válida.&quot;,
                dateISO: &quot;La fecha no es válida, debe tener formato ISO.&quot;,
                number: &quot;El número no es válido.&quot;,
                digits: &quot;Solamente se deben ingresar números.&quot;,
                creditcard: &quot;El número de tarjeta no es válido.&quot;,
                equalTo: &quot;El valor no coincide.&quot;,
                maxlength: $.validator.format(&quot;Máximo {0} caracteres.&quot;),
                minlength: $.validator.format(&quot;Mínimo {0} caracteres.&quot;),
                rangelength: $.validator.format(&quot;Debe tener entre {0} y {1} caracteres.&quot;),
                range: $.validator.format(&quot;Debe tener un valor entre {0} y {1}.&quot;),
                max: $.validator.format(&quot;Debe tener un valor menor o igual a {0}.&quot;),
                min: $.validator.format(&quot;Debe tener un valor mayor o igual a {0}.&quot;)
            });
        }
    });
})(jQuery);
&lt;/pre&gt;
&lt;h3&gt;2. La implementación&lt;/h3&gt;
&lt;p&gt;Invocas los archivos .js, algo parecido a esto:&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;
&lt;script src=&quot;js/jquery.min.js&quot; type=&quot;text/javascript&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/jquery.validate.min.js&quot; type=&quot;text/javascript&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;js/validation.es_MX.js&quot; type=&quot;text/javascript&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt;
&lt;/pre&gt;
&lt;p&gt;Implementas el plugin jQuery Validate&lt;/p&gt;
&lt;pre class=&quot;brush: javascript&quot;&gt;
&lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
    jQuery(document).ready(function() {

        $(&#39;#form_muestras&#39;).validate({
            rules: {
                txt_campo01: {
                    required: true
                }
                , txt_campo02: {
                    required: true,
                    email: true
                }
            }
            , messages: {
                txt_campo02: {
                    email: &quot;El correo electrónico debe ser igual al nombre de usuario.&quot;
                }
            }
            , invalidHandler: function(form, validator) {
                var errors = validator.numberOfInvalids();
                if (errors) {
                    var message = errors == 1
                            ? &#39;Hay un error en el formulario. Verifique los datos ingresados&#39;
                            : &#39;Hay &#39; + errors + &#39; errores. Verifique los datos ingresados&#39;;
                    $(&quot;#div-success&quot;).html(message).hide();
                    $(&quot;#div-error&quot;).html(message).show();
                } else {
                    $(&quot;#div-success&quot;).hide();
                    $(&quot;#div-error&quot;).hide();
                }
                
                $(&#39;html, body&#39;).animate({scrollTop : 0}, &#39;slow&#39;);
            }
        });
    });
&lt;/script&gt;
&lt;/pre&gt;
&lt;p&gt;Eso es todo, espero que les haya sido de utilidad&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/8057269924101925247/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/07/como-traducir-y-personalizar-los-mensajes-del-plugin-jquery-validation.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8057269924101925247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8057269924101925247'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/07/como-traducir-y-personalizar-los-mensajes-del-plugin-jquery-validation.html' title='Cómo traducir y personalizar los mensajes del plugin jQuery Validation'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-7917748703392041251</id><published>2013-07-10T11:43:00.002-05:00</published><updated>2013-08-23T15:42:05.372-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cadena"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="desencriptar"/><category scheme="http://www.blogger.com/atom/ns#" term="encriptar"/><category scheme="http://www.blogger.com/atom/ns#" term="helper"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="two way"/><title type='text'>Encriptar y desencriptar cadenas con PHP</title><content type='html'>&lt;p&gt;Crear una función para encriptar - desencriptar (encrypting two way) usando PHP&lt;/p&gt;
&lt;p&gt;Útil para enmascarar urls, variables por post, get, datos, números de tarjetas de crédito, etc.&lt;/p&gt;
&lt;p&gt;Puedes usarla para programación scriptera, orientada a objetos, como helper en algún framework, tales como CodeIgniter, Zend, Cake, Yii, etc.&lt;/p&gt;
&lt;p&gt;Bueno, aquí vamos:&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;
&amp;lt;?php
function _enc($s)
{
    $str = (string) $s;
    
    if (&#39;&#39; == trim($str)) {
        return &#39;&#39;;
    }
    for ($i = 0; $i &lt; strlen($str); $i++) {
        $r[] = hexdec(decoct(ord($str[$i]) + 3));
    }

    return implode(&#39;,&#39;, $r);
}

function _dec($s)
{
    $str = (string) $s;
    
    if (&#39;&#39; == trim($str)) {
        return &#39;&#39;;
    }
    $s = explode(&#39;,&#39;, $str);
    for ($i = 0; $i &lt; count($s); $i++) {
        $s[$i] = chr(octdec(dechex($s[$i])) - 3);
    }

    return implode(&#39;&#39;, $s);
}
?&gt;
&lt;/pre&gt;
&lt;p&gt;El artículo original de este código viene desde &lt;a href=&quot;http://www.hawkee.com/snippet/5086/&quot; target=&quot;_blank&quot;&gt;www.hawkee.com/snippet/5086/&lt;/a&gt;, yo le añadí doble cifrado, uno en octal y el resultado obtenido lo paso a hexadecimal, esto lo hice porque si lo dejaba en decimal es bien fácil encontrar que los caracteres corresponden a códigos ASCII y cualquiera podría descifrar el contenido.&lt;/p&gt;
&lt;p&gt;Espero les sea de utilidad.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/7917748703392041251/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/07/encriptar-y-desencriptar-cadenas-con-php.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7917748703392041251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7917748703392041251'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/07/encriptar-y-desencriptar-cadenas-con-php.html' title='Encriptar y desencriptar cadenas con PHP'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-7584975967686256676</id><published>2013-06-27T14:58:00.000-05:00</published><updated>2013-06-27T15:40:19.822-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="crear"/><category scheme="http://www.blogger.com/atom/ns#" term="cómo"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="sitemap"/><category scheme="http://www.blogger.com/atom/ns#" term="sitemap.xml"/><category scheme="http://www.blogger.com/atom/ns#" term="tools"/><category scheme="http://www.blogger.com/atom/ns#" term="webmasters"/><title type='text'>Cómo crear un sitemap con CodeIgniter 2 para enviarlo a Google Webmasters Tools</title><content type='html'>        &lt;p&gt;Para crear un sitemap en formato xml con CodeIgniter 2, 
            para enviarlo a google, necesitamos de los siguientes pasos.&lt;/p&gt;

        &lt;h3&gt;Paso 1: Modificar el archivo &lt;code&gt;routes.php&lt;/code&gt;, ubicado en la carpeta &lt;code&gt;config&lt;/code&gt;&lt;/h3&gt;
        &lt;p&gt;
            El cual se encuentra en la carpeta &lt;code&gt;config/&lt;/code&gt;. Agregamos 
            una nueva línea al arreglo:
        &lt;/p&gt;
        &lt;pre class=&quot;brush: php;&quot;&gt;
            $route[&#39;sitemap.xml&#39;] = &#39;sitemap/index&#39;;
        &lt;/pre&gt;
        &lt;h3&gt;Paso 2: Crearemos entonces el controlador &lt;code&gt;sitemap.php&lt;/code&gt;&lt;/h3&gt;
        &lt;pre class=&quot;brush: php;&quot;&gt;
            &amp;lt;?php

            class Sitemap extends CI_Controller
            {

                public function __construct()
                {
                    parent::__construct();
                }

                public function index()
                {
                    # este helper se puede cargar en el archivo autoload.php
                    # para evitar cargarlo cada vez
                    $this-&gt;load-&gt;helper(&#39;url&#39;);

                    $this-&gt;load-&gt;model(&#39;sitemap_model&#39;);

                    $view_data[&#39;vw_content&#39;] = $this-&gt;sitemap_model-&gt;get_articulos();

                    $this-&gt;load-&gt;view(&#39;sitemap_view&#39;, $view_data);
                }

            }
        &lt;/pre&gt;
        &lt;h3&gt;Paso 3: Creamos el modelo &lt;code&gt;sitemap_model.php&lt;/code&gt;&lt;/h3&gt;
        &lt;pre class=&quot;brush: php;&quot;&gt;
            &amp;lt;?php

            class Sitemap_model extends CI_Model
            {

                public function __construct()
                {
                    parent::__construct();

                    # esta librería se puede cargar desde el archivo autoload.php
                    # para evitar cargarlo cada vez
                    $this-&gt;load-&gt;database();
                }

                public function get_articulos()
                {
                    $this-&gt;db
                            -&gt;select(&#39;articulo_id, alias, modificado&#39;)
                            -&gt;from(&#39;articulos&#39;)
                            -&gt;where(&#39;activo&#39;, 1)
                            -&gt;order_by(&#39;articulo_id&#39;)
                    ;

                    $query = $this-&gt;db-&gt;get();

                    return $query-&gt;result();
                }

            }
        &lt;/pre&gt;
&lt;p&gt;En nuestro ejemplo, vamos a suponer que la estructura de la tabla es como la siguiente:
&lt;/p&gt;
&lt;p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlCjaVSb2wNP9AWZsND2TRi7iymWi18Qblm3xEXUgHG5A43GEG0PWIqJgmmCLR7l8yRDCAQlJC_yxih6JC1IYKvywfVf4B3_Yd9i13rW8Uz6g2Yfqa1Qh5icZw0IEFGWkiocMWBHO0Ik2s/s692/tabla-codeigniter-articulos-para-sitemap.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlCjaVSb2wNP9AWZsND2TRi7iymWi18Qblm3xEXUgHG5A43GEG0PWIqJgmmCLR7l8yRDCAQlJC_yxih6JC1IYKvywfVf4B3_Yd9i13rW8Uz6g2Yfqa1Qh5icZw0IEFGWkiocMWBHO0Ik2s/s692/tabla-codeigniter-articulos-para-sitemap.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
        &lt;h3&gt;Paso 4: Creamos la vista &lt;code&gt;sitemap_view.php&lt;/code&gt;&lt;/h3&gt;
        &lt;pre class=&quot;brush: php;&quot;&gt;
            &amp;lt;?php ob_start(); ?&gt;
            &amp;lt;?php echo &#39;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#39;.&quot;\n&quot;; ?&gt;
            &amp;lt;urlset xmlns=&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;&gt;
                &amp;lt;url&gt;
                    &amp;lt;loc&gt;&amp;lt;?php echo base_url(); ?&gt;&amp;lt;/loc&gt;
                    &amp;lt;priority&gt;1.0&amp;lt;/priority&gt;
                &amp;lt;/url&gt;

                &amp;lt;!-- Sitemap de mi blog.com --&gt;
                &amp;lt;?php foreach ($vw_content as $url) : ?&gt;
                &amp;lt;url&gt;
                    &amp;lt;loc&gt;&amp;lt;?php echo base_url() . &#39;index.php/blog/articulos/&#39; . $url-&gt;articulo_id . &#39;/&#39; . $url-&gt;alias . &#39;/&#39;; ?&gt;&amp;lt;/loc&gt;
                    &amp;lt;lastmod&gt;&amp;lt;?php echo substr($url-&gt;modificado, 0, 10); ?&gt;&amp;lt;/lastmod&gt;
                    &amp;lt;changefreq&gt;monthly&amp;lt;/changefreq&gt;
                    &amp;lt;priority&gt;0.5&amp;lt;/priority&gt;
                &amp;lt;/url&gt;
                &amp;lt;?php endforeach; ?&gt;
            &amp;lt;/urlset&gt;
            &amp;lt;?php ob_end_flush(); ?&gt;
        &lt;/pre&gt;
        &lt;h3&gt;Paso 5: Probar tu sitemap ejecutando (por ejemplo) &lt;code&gt;http://localhost/ci2/index.php/sitemap.xml&lt;/code&gt;&lt;/h3&gt;
        &lt;p&gt;
            ¡Listo! Si todo salió bien pueder ver el codigo fuente generado y verás un
            archivo .xml bien formado, el cual estará listo para enviarlo a Google
            en su página de &lt;a href=&quot;http://www.google.com/webmasters/&quot; target=&quot;_blank&quot;&gt;herramientas para Webmasters&lt;/a&gt;.
        &lt;/p&gt;
&lt;p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioYiJMG6_R5otUKi8PM-XDkFRjbZzpw5nhqXgo8kkQPZXkhNIiV8YfMCNKKnybPUfjO7P9JEXD_dBIZU3IgnvLvT48XGJwy21B5vhyphenhyphenQ1-7u4_uOLCT4ZJd62fuQzm8bjwqhIAO6Q-NK8h3/s1338/sitemap-web-browser.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioYiJMG6_R5otUKi8PM-XDkFRjbZzpw5nhqXgo8kkQPZXkhNIiV8YfMCNKKnybPUfjO7P9JEXD_dBIZU3IgnvLvT48XGJwy21B5vhyphenhyphenQ1-7u4_uOLCT4ZJd62fuQzm8bjwqhIAO6Q-NK8h3/s1338/sitemap-web-browser.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivccah6Wmhv9rlPrIkLyNxrMMR5Xu7a3FTsZdXcrlv2mtQaWH7a69KtIYOlJW-ZeJUowO4nV82hOeTadfgfamjtYVAgUyw-hFPw7Eaa5VLlqOzMcGoL0Qvkx64HFFCk3oiqPH6Hk-kexFP/s1198/sitemap-xml.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivccah6Wmhv9rlPrIkLyNxrMMR5Xu7a3FTsZdXcrlv2mtQaWH7a69KtIYOlJW-ZeJUowO4nV82hOeTadfgfamjtYVAgUyw-hFPw7Eaa5VLlqOzMcGoL0Qvkx64HFFCk3oiqPH6Hk-kexFP/s1198/sitemap-xml.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/7584975967686256676/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/06/como-crear-un-sitemap-con-codeigniter-2-enviarlo-google-webmasters-tools.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7584975967686256676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7584975967686256676'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/06/como-crear-un-sitemap-con-codeigniter-2-enviarlo-google-webmasters-tools.html' title='Cómo crear un sitemap con CodeIgniter 2 para enviarlo a Google Webmasters Tools'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlCjaVSb2wNP9AWZsND2TRi7iymWi18Qblm3xEXUgHG5A43GEG0PWIqJgmmCLR7l8yRDCAQlJC_yxih6JC1IYKvywfVf4B3_Yd9i13rW8Uz6g2Yfqa1Qh5icZw0IEFGWkiocMWBHO0Ik2s/s72-c/tabla-codeigniter-articulos-para-sitemap.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-346638021775238327</id><published>2013-06-18T18:50:00.000-05:00</published><updated>2013-06-18T18:54:21.683-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache"/><category scheme="http://www.blogger.com/atom/ns#" term="datos"/><category scheme="http://www.blogger.com/atom/ns#" term="escenario"/><category scheme="http://www.blogger.com/atom/ns#" term="estrés"/><category scheme="http://www.blogger.com/atom/ns#" term="http request"/><category scheme="http://www.blogger.com/atom/ns#" term="inyectar"/><category scheme="http://www.blogger.com/atom/ns#" term="jmeter"/><category scheme="http://www.blogger.com/atom/ns#" term="parametros"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="plan"/><category scheme="http://www.blogger.com/atom/ns#" term="proxy"/><category scheme="http://www.blogger.com/atom/ns#" term="pruebas"/><category scheme="http://www.blogger.com/atom/ns#" term="thread"/><category scheme="http://www.blogger.com/atom/ns#" term="variables"/><title type='text'>Cómo hacer una prueba de estrés con JMeter</title><content type='html'>        &lt;h3&gt;
            Les presento sencillos pasos para diseñar, ejecutar y obtener los 
            resultados de una prueba de estrés usando JMeter con una aplicación
            basada en Web construida en PHP (para este ejemplo).
        &lt;/h3&gt;
        &lt;p&gt;
            Tenemos que crear un escenario o plan de pruebas, para ello, nos vamos 
            a auxiliar de JMeter, el cual puedes descargar desde el sitio de apache
            &lt;a href=&quot;http://jmeter.apache.org/download_jmeter.cgi&quot; target=&quot;_blank&quot;&gt;http://jmeter.apache.org/download_jmeter.cgi&lt;/a&gt;.
        &lt;/p&gt;
        &lt;h3&gt;
           Paso 1: Instalar y ejecutar JMeter
        &lt;/h3&gt;
        &lt;p&gt;
            La instalación simplemente es descomprimir el .zip o el .tgz en tu disco duro.
            Una vez hecho esto, en la carpeta de JMeter hay una carpeta &lt;code&gt;bin&lt;/code&gt;, ejecutar
            el archivo &lt;code&gt;jmeter.bat&lt;/code&gt;
        &lt;/p&gt;
        &lt;h3&gt;
           Paso 2: Configurar JMeter para el escenario de prueba
        &lt;/h3&gt;
        &lt;p&gt;
            Para efectos de este ejemplo, prefiero usar el idioma en inglés, pues la traducción
            al castellano es literal y a menudo es difícil navegar entre las opciones.
        &lt;/p&gt;
        &lt;p&gt;
            Así que para cambiar el idioma de español a inglés: Menú &lt;b&gt;Opciones&lt;/b&gt; &gt;&gt; &lt;b&gt;Elija lenguaje&lt;/b&gt; &gt;&gt; &lt;b&gt;Inglés&lt;/b&gt;
        &lt;/p&gt;
        &lt;p&gt;
            Seleccionamos el nodo de Test Plan y le ponemos un nombre que nos ayude a identificarlo, 
            luego le damos clic derecho y &lt;b&gt;Add&lt;/b&gt; &gt;&gt; &lt;b&gt;Thread Group&lt;/b&gt;
        &lt;/p&gt;
        &lt;p&gt;
            Llenamos los campos &lt;i&gt;&lt;b&gt;Name&lt;/b&gt;&lt;/i&gt;, y en el apartado de &lt;i&gt;&lt;b&gt;Action to be taken after a Sample error&lt;/b&gt;&lt;/i&gt;
        &lt;/p&gt;
        &lt;p&gt;
            En el apartado de &lt;i&gt;&lt;b&gt;Thread Properties&lt;/b&gt;&lt;/i&gt;,  
            &lt;i&gt;&lt;b&gt;Number of Threads (users)&lt;/b&gt;&lt;/i&gt;, &lt;i&gt;&lt;b&gt;Ramp-up Period (in seconds)&lt;/b&gt;&lt;/i&gt;, 
            &lt;i&gt;&lt;b&gt;Loop Count __ Forever&lt;/b&gt;&lt;/i&gt;, como se muestra en la imagen siguiente:
        &lt;/p&gt;
   &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQRCCs8oYQi88NFcuEnP9Vt4TvIY2QEjspJOB5YOGEZqaVh3yXWdnLgOhLuzf3Z0KOZD8lNl8QEV_UHW918rpMYiW-20BjPvVTjTaonteXDZPi2i547fEUiG3x_67GlFRiSAIl_KQsWT6C/s1600/thread-group.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQRCCs8oYQi88NFcuEnP9Vt4TvIY2QEjspJOB5YOGEZqaVh3yXWdnLgOhLuzf3Z0KOZD8lNl8QEV_UHW918rpMYiW-20BjPvVTjTaonteXDZPi2i547fEUiG3x_67GlFRiSAIl_KQsWT6C/s640/thread-group.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
        
        &lt;h3&gt;
           Paso 3: Configurar los valores de la petición HTTP
        &lt;/h3&gt;
        &lt;p&gt;
            Sobre el nodo de tu nuevo Thread Group, haz clic derecho y 
            &lt;i&gt;&lt;b&gt;Add&lt;/b&gt;&lt;/i&gt; &gt;&gt; &lt;i&gt;&lt;b&gt;Config Element&lt;/b&gt;&lt;/i&gt; &gt;&gt; &lt;i&gt;&lt;b&gt;HTTP Request Defaults&lt;/b&gt;&lt;/i&gt;
        &lt;/p&gt;
        &lt;p&gt;
            Selecionamos el elemento agregado y configuramos sus parámetros.
        &lt;/p&gt;
        &lt;p&gt;
            El campo &lt;i&gt;&lt;b&gt;Name&lt;/b&gt;&lt;/i&gt;, le pones un nombre descriptivo o lo puedes dejar
            así, en este ejemplo, prefiero dejarlo como viene el default
        &lt;/p&gt;
        &lt;p&gt;
            En el apartado &lt;i&gt;&lt;b&gt;Web Server&lt;/b&gt;&lt;/i&gt;, llenar los campos &lt;i&gt;&lt;b&gt;Server Name or IP:&lt;/b&gt;&lt;/i&gt;, 
            &lt;i&gt;&lt;b&gt;Port Number&lt;/b&gt;&lt;/i&gt;, con los datos del servidor que quieras probar, en este ejemplo, 
            el servidor está en una LAN y accedemos al aplicativo que queremos probar mediante el
            puerto 8084, pero una configuración típica si pruebas en tu localhost es poner 127.0.0.1 y en puerto 8080.
        &lt;/p&gt;
        &lt;p&gt;
            En el apartado &lt;i&gt;&lt;b&gt;HTTP Request&lt;/b&gt;&lt;/i&gt;, en la lista &lt;i&gt;&lt;b&gt;Implementation&lt;/b&gt;&lt;/i&gt;, seleccionar 
            HttpClient4, en el campo &lt;i&gt;&lt;b&gt;Protocol [http]&lt;/b&gt;&lt;/i&gt;, no hay más que poner http,
            en el campo &lt;i&gt;&lt;b&gt;Content encoding&lt;/b&gt;&lt;/i&gt; poner el que tú manejas en tus páginas web,
            en mi caso, utilizo UTF-8.
        &lt;/p&gt;
        &lt;p&gt;
            En el campo &lt;i&gt;&lt;b&gt;Path&lt;/b&gt;&lt;/i&gt;, poner la ruta de la raíz de tu aplicativo, puede ser / 
            o en mi caso, utilizo /ejemplo_jmeter
        &lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP-0EiyA8FonSmAPDSXk6fMf0ZGymM5nm1PJ4noDVKgdOHqqdt80oWOHo-9G3uPm1iJiiTSVCMGfBJe7c-IWAYOqfhDCz2dZ4EAp1UElSpCJMZnBXcRc5XzxT6CQh9vFnHgRgnQQkwUKJc/s1600/JMeter-HTTP-Request-Defaults.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP-0EiyA8FonSmAPDSXk6fMf0ZGymM5nm1PJ4noDVKgdOHqqdt80oWOHo-9G3uPm1iJiiTSVCMGfBJe7c-IWAYOqfhDCz2dZ4EAp1UElSpCJMZnBXcRc5XzxT6CQh9vFnHgRgnQQkwUKJc/s640/JMeter-HTTP-Request-Defaults.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
        
        
        &lt;h3&gt;
           Paso 4: Configurar el HTTP Proxy Server
        &lt;/h3&gt;
        &lt;p&gt;
            En el nodo &lt;i&gt;&lt;b&gt;Workbench&lt;/b&gt;&lt;/i&gt;, acer clic derecho y &lt;i&gt;&lt;b&gt;Add&lt;/b&gt;&lt;/i&gt; &gt;&gt; 
            &lt;i&gt;&lt;b&gt;Non-Test Elements&lt;/b&gt;&lt;/i&gt; &gt;&gt; HTTP Proxy Server
        &lt;/p&gt;
        &lt;p&gt;
            Puedes darle un nombre o dejar el que tiene por default, en mi ejemplo he decidio dejar el default. 
            En el apartado &lt;i&gt;&lt;b&gt;Global Settings&lt;/b&gt;&lt;/i&gt;, en Port: 8080
        &lt;/p&gt;
        &lt;p&gt;
            En el apartado &lt;i&gt;&lt;b&gt;Test plan content&lt;/b&gt;&lt;/i&gt;, en la lista &lt;i&gt;&lt;b&gt;Target Controller&lt;/b&gt;&lt;/i&gt; 
            seleccionar de la lista el plan de pruebas que vamos a generar y este va a ser 
            el repositorio que va a recibir todas las peticiones que se van a &quot;grabar&quot;.
        &lt;/p&gt;
        &lt;p&gt;
            En la imagen de abajo verán los demás parámetros, después con más práctica y 
            de acuerdo a la necesidad específica de cada proyecto, pueden modificar los 
            demás parámetros.
        &lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk7E9O445WYNYqJA-OK9a3_IHiItwAvSY3Xv6MrONwf3sjWAT6jGu8UKblupcnQ5iuQ2_CDmWo6NyCK3d63tpD4_pLU_85oWwSVKv_0uIjmlYPlVyhEjtjShwKJU0WtUzZcxsuWjJjH-mr/s1600/HTTP-Proxy-Server-configuracion.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk7E9O445WYNYqJA-OK9a3_IHiItwAvSY3Xv6MrONwf3sjWAT6jGu8UKblupcnQ5iuQ2_CDmWo6NyCK3d63tpD4_pLU_85oWwSVKv_0uIjmlYPlVyhEjtjShwKJU0WtUzZcxsuWjJjH-mr/s640/HTTP-Proxy-Server-configuracion.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

        &lt;h3&gt;
           Paso 5: Configurar el navegador donde se va a ejecutar la prueba
        &lt;/h3&gt;
        &lt;p&gt;
            Es necesario configurar un servidor proxy, pues una vez que se ejecute
            el escenario de pruebas que dimos de alta en JMeter, éste se convierte en un
            proxy, por el cual van a pasar todas peticiones HTTP.
        &lt;/p&gt;
        &lt;p&gt;
            Para el ejemplo, asumo que como todo buen programador, usan cualquier navegador
            que no sea Internet Explorer, así que en la imagen van a ver la configuración
            proxy para Mozilla Firefox:
        &lt;/p&gt;
 &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqrEEkWbgOnlXa-cGIWDcwv6wpklR1Dc5Z9zEatW_uL-sPU83W_bwXykNQYmKLNFfo61ioJ9KV-Rjt8y0u6jUjCO70es9yzmQ3P1EIoJBLtAagVKdkc-kDb4ysLWsd4PoU4GyEEpUm3Nn0/s1600/proxy-firefox.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqrEEkWbgOnlXa-cGIWDcwv6wpklR1Dc5Z9zEatW_uL-sPU83W_bwXykNQYmKLNFfo61ioJ9KV-Rjt8y0u6jUjCO70es9yzmQ3P1EIoJBLtAagVKdkc-kDb4ysLWsd4PoU4GyEEpUm3Nn0/s640/proxy-firefox.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

        &lt;h3&gt;
           Paso 6: Ejecutar el proceso de grabación de nuestro escenario de pruebas
        &lt;/h3&gt;
        &lt;p&gt;
            Ahora en la pantalla de HTTP Proxy Server que acabamos de configurar, presionamos 
            el botón &lt;i&gt;&lt;b&gt;Start&lt;/b&gt;&lt;/i&gt;, para iniciar el servidor proxy.
        &lt;/p&gt;
        &lt;p&gt;
            Ingresamos al navegador al cual tiene configurado que use el proxy, e introducimos la 
            url de nuestro aplicativo que queremos probar.
        &lt;/p&gt;
        &lt;p&gt;
            Navegamos dentro de nuestra aplicación para que comience a &quot;grabar&quot; nuestro escenario 
            de pruebas, el concepto es parecido a grabar una macro.
        &lt;/p&gt;
        &lt;p&gt;
            Una vez que ya recorrimos todo lo que nos interesa &quot;testear&quot;, podemos regresar a JMeter 
            y damos &lt;i&gt;&lt;b&gt;Stop&lt;/b&gt;&lt;/i&gt; al servidor proxy (que se ubica en el nodo &lt;i&gt;&lt;b&gt;Workbench &gt;&gt; HTTP Proxy Server&lt;/b&gt;&lt;/i&gt;).
        &lt;/p&gt;
        &lt;p&gt;
            Entonces, ahora nuestro escenario de pruebas ya tiene varias ramas, que debe 
            verse más o menos como en la siguiente imagen:
        &lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKuUk-3j3FhJbYPZnXeXoKE6awzQswg5QTOrcpB3rReB9NSuUKzAlX9u3pkQlPixwKLCWGUcp_Hjj-9iK28jqvFLku3t_eTPU_MDWRqjLc-JolnFHcUo8dTLvjubaiBzqBA_2YLiTrRS7A/s1600/escenario-pruebas-jmeter.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKuUk-3j3FhJbYPZnXeXoKE6awzQswg5QTOrcpB3rReB9NSuUKzAlX9u3pkQlPixwKLCWGUcp_Hjj-9iK28jqvFLku3t_eTPU_MDWRqjLc-JolnFHcUo8dTLvjubaiBzqBA_2YLiTrRS7A/s640/escenario-pruebas-jmeter.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
        
        &lt;h3&gt;
            Paso 7: Hay que agregar unos &quot;Listeners&quot; que van a recopilar los resultados de 
            la prueba y nos darán ciertos resultados
        &lt;/h3&gt;
        &lt;p&gt;
            Hay algunos que son muy interesantes, pero para esta primera prueba, te
            recomiendo agregar el listener &lt;i&gt;&lt;b&gt;View Results in Table&lt;/b&gt;&lt;/i&gt;, entonces haz clic
            derecho en el &lt;i&gt;&lt;b&gt;Thread Group&lt;/b&gt;&lt;/i&gt;, que en este ejemplo le pusimos por nombre &quot;Proceso de login&quot;, 
            &lt;i&gt;&lt;b&gt;Add&lt;/b&gt;&lt;/i&gt; &gt;&gt; &lt;i&gt;&lt;b&gt;Listener&lt;/b&gt;&lt;/i&gt; y finalmente &lt;i&gt;&lt;b&gt;View Results in Table&lt;/b&gt;&lt;/i&gt;.
        &lt;/p&gt;
        &lt;p&gt;
            Se pueden agregar varios listeners a la vez. Todo depende de qué tipo de resultados 
            deseas obtener y cómo quieres que sean presentados.
        &lt;/p&gt;
        &lt;h3&gt;
            Paso 8: Ejecutar el escenario de pruebas ¡por fin!
        &lt;/h3&gt;
        &lt;p&gt;
            Ahora sí, seleccionas el nodo Thread Group (el cual le pusimos por nombre 
            &quot;Proceso de login&quot; y presionamos &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;R&lt;/code&gt;, ó menú &lt;i&gt;&lt;b&gt;Run&lt;/b&gt;&lt;/i&gt; &gt;&gt; &lt;i&gt;&lt;b&gt;Start&lt;/b&gt;&lt;/i&gt; ó podemos hacer clic 
            en el botón verde de start (el típico ícono de play).
        &lt;/p&gt;
        &lt;p&gt;
            ¡A disfrutar!
        &lt;/p&gt;
        &lt;h3&gt;Tip extra:&lt;/h3&gt;
        &lt;p&gt;
            Voy a ponerte un posible escenario: en mi ejemplo, vamos a ejecutar una prueba 
            de estrés usando un usuario para hacer el login, pero como hay una regla de negocio 
            que indica que no pueden haber un mismo usuario conectado más de 1 vez simultáneamente, 
            la solución es introducir diferentes usuarios para ejecutar todas las 
            conexiones concurrentes para la prueba de estrés.
        &lt;/p&gt;
        &lt;p&gt;
            Para lograr esto, lo que tenemos que hacer es agregar parámetros de usuario 
            los cuales podemos ingresar haciendo clic derecho en el nodo &lt;i&gt;&lt;b&gt;Thread Group&lt;/b&gt;&lt;/i&gt;, que en este ejemplo le pusimos por nombre &quot;Proceso de login&quot;, 
             &lt;i&gt;&lt;b&gt;Add&lt;/b&gt;&lt;/i&gt; &gt;&gt; &lt;i&gt;&lt;b&gt;Pre Processors&lt;/b&gt;&lt;/i&gt; &gt;&gt; &lt;i&gt;&lt;b&gt;User Parameters&lt;/b&gt;&lt;/i&gt;.
        &lt;/p&gt;

        &lt;p&gt;
            Con el botón &lt;i&gt;&lt;b&gt;Add Variable&lt;/b&gt;&lt;/i&gt; agregamos las dos variables que necesitamos para username y password.
        &lt;/p&gt;
        &lt;p&gt;
            Con el botón &lt;i&gt;&lt;b&gt;Add User&lt;/b&gt;&lt;/i&gt; agregamos varios usuarios con su password 
            de nuestro aplicativo, en mi ejemplo introduje 100 usuarios de mi base de datos, ver imagen de abajo:
        &lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRN4E1O8D7oBh1ZgFTcxTVzP31oZ3CcWfNzp8e60XSMLChE-3pT7QrmQIOMmeYhyn9O6dKAS2M1so_Yx18HeXgT0ErJ_CNdbjhJJe8zMBbLNjuMdu6QJFZNhVZW9S6EJ9NFmM0lxcRnX8_/s1600/JMeter-user-parameters-01.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRN4E1O8D7oBh1ZgFTcxTVzP31oZ3CcWfNzp8e60XSMLChE-3pT7QrmQIOMmeYhyn9O6dKAS2M1so_Yx18HeXgT0ErJ_CNdbjhJJe8zMBbLNjuMdu6QJFZNhVZW9S6EJ9NFmM0lxcRnX8_/s640/JMeter-user-parameters-01.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia8PFyKhDWUvn06cEpF9tpvRF5aUYTCpAoxl6sI0L1_M5z8kxokHwE-l0hdOL0I4tAk56gH8n5NZQuF9gamFSKM-3krWvkK-KMs76pDcjdiAV5qlHbLRgYUl2TP2eZglSu1bXVULe1BEyc/s1600/JMeter-user-parameters-02.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia8PFyKhDWUvn06cEpF9tpvRF5aUYTCpAoxl6sI0L1_M5z8kxokHwE-l0hdOL0I4tAk56gH8n5NZQuF9gamFSKM-3krWvkK-KMs76pDcjdiAV5qlHbLRgYUl2TP2eZglSu1bXVULe1BEyc/s640/JMeter-user-parameters-02.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
        &lt;p&gt;
            Luego, debes ubicar en el árbol de requests el recurso que envía los datos de usuario 
            y contraseña, en mi ejemplo, lo señalo en la imagen de abajo, y verás como llenar los campos  
            para inyectar los diferentes valores usando unas variables, típicamente 
            se colocan con el siguiente formato: &lt;code&gt;&lt;b&gt;${variable}&lt;/b&gt;&lt;/code&gt;
        &lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSGKFqiPLjNXZFUgO0EI6if25Axtj_aOHzSiSn6JxfynQ7QCf0-CALDGc10BklWabgzgCVYDH1LRdEYTggFiLgy38bKsJN1elvqBvrz5PO7YiQbtHlJQ_TI7_xf-TBeG5amo-aK0X2eOfh/s1600/JMeter-user-parameters-inyectar-variables.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSGKFqiPLjNXZFUgO0EI6if25Axtj_aOHzSiSn6JxfynQ7QCf0-CALDGc10BklWabgzgCVYDH1LRdEYTggFiLgy38bKsJN1elvqBvrz5PO7YiQbtHlJQ_TI7_xf-TBeG5amo-aK0X2eOfh/s640/JMeter-user-parameters-inyectar-variables.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
Finalmente, volver a ejecutar como lo dijimos en el paso 8.
&lt;/p&gt;
        &lt;p&gt;
            Bueno, espero haber que este post les sea de utilidad, creo que todo programador 
            aunque no sea tester, debe hacer pruebas de rendimiento, la prueba de estrés es 
            solamente una de ellas.
        &lt;/p&gt;
    </content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/346638021775238327/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/06/como-hacer-una-prueba-de-estres-con-jmeter-apache.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/346638021775238327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/346638021775238327'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/06/como-hacer-una-prueba-de-estres-con-jmeter-apache.html' title='Cómo hacer una prueba de estrés con JMeter'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQRCCs8oYQi88NFcuEnP9Vt4TvIY2QEjspJOB5YOGEZqaVh3yXWdnLgOhLuzf3Z0KOZD8lNl8QEV_UHW918rpMYiW-20BjPvVTjTaonteXDZPi2i547fEUiG3x_67GlFRiSAIl_KQsWT6C/s72-c/thread-group.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-6424611018229952252</id><published>2013-06-04T16:03:00.000-05:00</published><updated>2013-06-30T08:24:17.978-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".bashrc"/><category scheme="http://www.blogger.com/atom/ns#" term="1and1"/><category scheme="http://www.blogger.com/atom/ns#" term="alias"/><category scheme="http://www.blogger.com/atom/ns#" term="business package"/><category scheme="http://www.blogger.com/atom/ns#" term="descomprimir"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="unalias"/><category scheme="http://www.blogger.com/atom/ns#" term="unzip"/><category scheme="http://www.blogger.com/atom/ns#" term="winzip"/><title type='text'>Linux: unzip convierte todo a minúsculas de un archivo creado con Winzip</title><content type='html'>&lt;h3&gt;Me ocurrió que cuando usaba unzip para descomprimir un archivo en Linux, que fue creado en Windows (con Winzip), me convertía todos los nombres de archivo en minúsculas, ocasionándome problemas al ejecutar mi código de una aplicación web.&lt;/h3&gt;
&lt;h3&gt;La solución que encontré fue la siguiente:&lt;/h3&gt;
&lt;p&gt;Revisé si el comando unzip tenía algún alias que forzara la conversión a minúsculas con el parámetro -L&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
# alias
&lt;/pre&gt;
&lt;p&gt;y efectivamente, ahí estaba el alias para unzip:&lt;/p&gt; 
&lt;pre class=&quot;brush: shell&quot;&gt;
...
alias unzip=&#39;unzip -L&#39;
...
&lt;/pre&gt;
&lt;p&gt;
Así que todo lo que hice fue quitar el alias de la siguiente manera:
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
unalias unzip
&lt;/pre&gt;
&lt;h3&gt;Si deseas que el cambio sea permanente puedes agregarlo a tu &lt;code&gt;.bashrc&lt;/code&gt;, en este link puedes ver cómo hacerlo: &lt;a href=&quot;http://php-aplicado.blogspot.com/2013/05/como-crear-un-shell-bashrc-con-servidores-linux-1and1-business-package.html&quot; target=&quot;_blank&quot;&gt;&quot;Cómo crear un shell .bashrc con servidores Linux de 1and1 Business Package&quot;&lt;/a&gt;&lt;/h3&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/6424611018229952252/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/06/linux-unzip-convierte-todo-minusculas-de-un-archivo-creado-con-winzip.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/6424611018229952252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/6424611018229952252'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/06/linux-unzip-convierte-todo-minusculas-de-un-archivo-creado-con-winzip.html' title='Linux: unzip convierte todo a minúsculas de un archivo creado con Winzip'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-421717121227984480</id><published>2013-05-30T13:35:00.000-05:00</published><updated>2013-05-30T13:36:41.006-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="equivalente"/><category scheme="http://www.blogger.com/atom/ns#" term="first"/><category scheme="http://www.blogger.com/atom/ns#" term="informix"/><category scheme="http://www.blogger.com/atom/ns#" term="limit"/><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="offset"/><category scheme="http://www.blogger.com/atom/ns#" term="paginar"/><category scheme="http://www.blogger.com/atom/ns#" term="select"/><category scheme="http://www.blogger.com/atom/ns#" term="skip"/><title type='text'>Equivalente de OFFSET y LIMIT en Informix</title><content type='html'>&lt;h3&gt;El equivalente a OFFSET y LIMIT pero en Informix son SKIP y FIRST respectivamente&lt;/h3&gt;
&lt;p&gt;He aquí unos ejemplos entre MySql e Informix, para el muy recurrido ejemplo de paginación de resultados.&lt;/p&gt;
&lt;pre class=&quot;brush:sql&quot;&gt;
/* En MySql: */
--traer los registros del 1 al 10
SELECT * FROM mitabla LIMIT 10 OFFSET 0;

--traer los registros del 11 al 20
SELECT * FROM mitabla LIMIT 10 OFFSET 10;

--traer los registros del 21 al 30
SELECT * FROM mitabla LIMIT 10 OFFSET 20;


/* En Informix: */
--traer los registros del 1 al 10
SELECT SKIP 0 FIRST 10 * FROM mitabla;

--traer los registros del 11 al 20
SELECT SKIP 10 FIRST 10 * FROM mitabla;

--traer los registros del 21 al 30
SELECT SKIP 20 FIRST 10 * FROM mitabla;
&lt;/pre&gt;
&lt;p&gt;Espero que les sea de utilidad&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/421717121227984480/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/equivalente-de-offset-y-limit-en-informix-vs-mysql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/421717121227984480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/421717121227984480'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/equivalente-de-offset-y-limit-en-informix-vs-mysql.html' title='Equivalente de OFFSET y LIMIT en Informix'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-977442616325377376</id><published>2013-05-30T13:05:00.000-05:00</published><updated>2013-05-30T13:08:06.880-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="10"/><category scheme="http://www.blogger.com/atom/ns#" term="11"/><category scheme="http://www.blogger.com/atom/ns#" term="create function"/><category scheme="http://www.blogger.com/atom/ns#" term="create procedure"/><category scheme="http://www.blogger.com/atom/ns#" term="informix"/><category scheme="http://www.blogger.com/atom/ns#" term="replace"/><category scheme="http://www.blogger.com/atom/ns#" term="script"/><category scheme="http://www.blogger.com/atom/ns#" term="select"/><category scheme="http://www.blogger.com/atom/ns#" term="sql"/><title type='text'>Crear una función en Informix para reemplazar acentos y caracteres especiales</title><content type='html'>&lt;h3&gt;Sencillo script para crear una función de usuario dentro de Informix, hay que tener en cuenta que a partir de la versión 10 de Informix ya no hay soporte para el comando CREATE FUNCTION, por eso este código funciona a partir de la versión 10+.&lt;/h3&gt;
&lt;pre class=&quot;brush: sql&quot;&gt;
/* Editar este archivo con codificación UTF-8 */

/* DROP PROCEDURE mibasededatos:fun_quitar_acentos; */


CREATE PROCEDURE mibasededatos:fun_quitar_acentos (CADENA lvarchar)
RETURNING lvarchar;
  DEFINE TempString lvarchar;
  LET TempString = CADENA;
  
  LET TempString =  REPLACE(TempString, &#39;à&#39;, &#39;a&#39;);
  LET TempString =  REPLACE(TempString, &#39;è&#39;, &#39;e&#39;);
  LET TempString =  REPLACE(TempString, &#39;ì&#39;, &#39;i&#39;);
  LET TempString =  REPLACE(TempString, &#39;ò&#39;, &#39;o&#39;);
  LET TempString =  REPLACE(TempString, &#39;ù&#39;, &#39;u&#39;);
  LET TempString =  REPLACE(TempString, &#39;À&#39;, &#39;A&#39;);
  LET TempString =  REPLACE(TempString, &#39;È&#39;, &#39;E&#39;);
  LET TempString =  REPLACE(TempString, &#39;Ì&#39;, &#39;I&#39;);
  LET TempString =  REPLACE(TempString, &#39;Ò&#39;, &#39;O&#39;);
  LET TempString =  REPLACE(TempString, &#39;Ù&#39;, &#39;U&#39;);
  LET TempString =  REPLACE(TempString, &#39;ñ&#39;, &#39;n&#39;);
  LET TempString =  REPLACE(TempString, &#39;Ñ&#39;, &#39;n&#39;);
  LET TempString =  REPLACE(TempString, &#39;á&#39;, &#39;a&#39;);
  LET TempString =  REPLACE(TempString, &#39;é&#39;, &#39;e&#39;);
  LET TempString =  REPLACE(TempString, &#39;í&#39;, &#39;i&#39;);
  LET TempString =  REPLACE(TempString, &#39;ó&#39;, &#39;o&#39;);
  LET TempString =  REPLACE(TempString, &#39;ú&#39;, &#39;u&#39;);
  LET TempString =  REPLACE(TempString, &#39;Á&#39;, &#39;A&#39;);
  LET TempString =  REPLACE(TempString, &#39;É&#39;, &#39;E&#39;);
  LET TempString =  REPLACE(TempString, &#39;Í&#39;, &#39;I&#39;);
  LET TempString =  REPLACE(TempString, &#39;Ó&#39;, &#39;O&#39;);
  LET TempString =  REPLACE(TempString, &#39;Ú&#39;, &#39;U&#39;);
  LET TempString =  REPLACE(TempString, &#39;ç&#39;, &#39;c&#39;);
  LET TempString =  REPLACE(TempString, &#39;Ç&#39;, &#39;C&#39;);
 
  RETURN TempString;
END PROCEDURE;

/* comprobaciones */
execute procedure fun_quitar_acentos(&#39;Prueba: áéíóú Nñ ÁÉÍÓÚ&#39;);

SELECT descripcion, fun_quitar_acentos(descripcion) AS desc_sin_acentos FROM mi_tabla ORDER BY descripcion;
&lt;/pre&gt;
&lt;p&gt;Este script va a crear una función de usuario dentro de Informix&lt;/p&gt;
&lt;p&gt;Espero que les sea de utilidad &lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/977442616325377376/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/crear-una-funcion-en-informix-para-reemplazar-acentos-y-caracteres-especiales.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/977442616325377376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/977442616325377376'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/crear-una-funcion-en-informix-para-reemplazar-acentos-y-caracteres-especiales.html' title='Crear una función en Informix para reemplazar acentos y caracteres especiales'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-7874106162885145435</id><published>2013-05-30T12:06:00.000-05:00</published><updated>2013-05-30T12:06:47.486-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="5"/><category scheme="http://www.blogger.com/atom/ns#" term="array"/><category scheme="http://www.blogger.com/atom/ns#" term="json_decode"/><category scheme="http://www.blogger.com/atom/ns#" term="json_encode"/><category scheme="http://www.blogger.com/atom/ns#" term="object"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="simpleXML"/><category scheme="http://www.blogger.com/atom/ns#" term="simplexml_load_file"/><category scheme="http://www.blogger.com/atom/ns#" term="xml"/><title type='text'>Como convertir un archivo o string XML en un array en PHP 5, usando SimpleXML</title><content type='html'>&lt;h3&gt;
La solución es muy sencilla, para este ejemplo, utilizaremos la librería SimpleXML. Esta libería requiere la extensión de PHP libxml y funciona a partir de PHP 5.
&lt;/h3&gt;
&lt;h5&gt;
Voy a usar el xml de ejemplo que viene en la &lt;a href=&quot;http://php.net/manual/es/simplexml.examples-basic.php&quot; target=&quot;_self&quot;&gt;documentación de PHP&lt;/a&gt;.
&lt;/h5&gt;
&lt;pre class=&quot;brush: php&quot;&gt;
# aquí debes poner la ruta y el nombre de tu archivo xml
$xmlstring = realpath(dirname(__FILE__)) . &#39;/xmls/prueba.xml&#39;;

if (!file_exists($xmlstring)) {
   trigger_error(__FILE__: {$xmlstring}&quot;, E_USER_ERROR);
   return;
}

$xml = simplexml_load_file($xmlstring);
        
$json = json_encode($xml);
$array = json_decode($json, TRUE);
echo &#39;&amp;lt;pre&gt;&#39;;
print_r($xml);
echo &#39;&amp;lt;/pre&gt;&#39;;

echo &#39;&amp;lt;pre&gt;&#39;;
print_r($array);
echo &#39;&amp;lt;/pre&gt;&#39;;
&lt;/pre&gt;
&lt;h6&gt;Nota: el inconveniente de pasar el objeto XML a un array con esta técnica, es que se pierden los atributos de los elementos, como en el caso de los atributos del elemento &amp;lt;puntuacion&gt;, que se pierden los atributos &quot;tipo&quot;, pero seguramente para determinados casos esta sencilla técnica puede servir muy bien.&lt;/h6&gt;
&lt;p&gt;El resultado de este ejemplo para el objeto simpleXML sería:&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;
SimpleXMLElement Object
(
    [pelicula] =&gt; SimpleXMLElement Object
        (
            [titulo] =&gt; PHP: Tras el Parser
            [personajes] =&gt; SimpleXMLElement Object
                (
                    [personaje] =&gt; Array
                        (
                            [0] =&gt; SimpleXMLElement Object
                                (
                                    [nombre] =&gt; Srta. Programadora
                                    [actor] =&gt; Onlivia Actora
                                )

                            [1] =&gt; SimpleXMLElement Object
                                (
                                    [nombre] =&gt; Sr. Programador
                                    [actor] =&gt; El Actor
                                )

                        )

                )

            [argumento] =&gt; 
            Así que, este lenguaje. Es como, un lenguaje de programación. ¿O es un
            lenguaje interpretado? Lo descubrirás en esta intrigante y temible parodia
            de un documental.
        
            [grandes-lineas] =&gt; SimpleXMLElement Object
                (
                    [linea] =&gt; PHP soluciona todos los problemas web
                )

            [puntuacion] =&gt; Array
                (
                    [0] =&gt; 7
                    [1] =&gt; 5
                )

        )

)
&lt;/pre&gt;
&lt;p&gt;El resultado de este ejemplo para el array sería:&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;
Array
(
    [pelicula] =&gt; Array
        (
            [titulo] =&gt; PHP: Tras el Parser
            [personajes] =&gt; Array
                (
                    [personaje] =&gt; Array
                        (
                            [0] =&gt; Array
                                (
                                    [nombre] =&gt; Srta. Programadora
                                    [actor] =&gt; Onlivia Actora
                                )

                            [1] =&gt; Array
                                (
                                    [nombre] =&gt; Sr. Programador
                                    [actor] =&gt; El Actor
                                )

                        )

                )

            [argumento] =&gt; 
            Así que, este lenguaje. Es como, un lenguaje de programación. ¿O es un
            lenguaje interpretado? Lo descubrirás en esta intrigante y temible parodia
            de un documental.
        
            [grandes-lineas] =&gt; Array
                (
                    [linea] =&gt; PHP soluciona todos los problemas web
                )

            [puntuacion] =&gt; Array
                (
                    [0] =&gt; 7
                    [1] =&gt; 5
                )

        )

)
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/7874106162885145435/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/como-convertir-un-archivo-o-string-xml-en-un-array-php-5-simplexml.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7874106162885145435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7874106162885145435'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/como-convertir-un-archivo-o-string-xml-en-un-array-php-5-simplexml.html' title='Como convertir un archivo o string XML en un array en PHP 5, usando SimpleXML'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-2523226596921076073</id><published>2013-05-17T18:15:00.000-05:00</published><updated>2013-05-17T18:38:21.436-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="autoload"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="config"/><category scheme="http://www.blogger.com/atom/ns#" term="controlador"/><category scheme="http://www.blogger.com/atom/ns#" term="csv"/><category scheme="http://www.blogger.com/atom/ns#" term="en_US"/><category scheme="http://www.blogger.com/atom/ns#" term="es_MX"/><category scheme="http://www.blogger.com/atom/ns#" term="fr_FR"/><category scheme="http://www.blogger.com/atom/ns#" term="helper"/><category scheme="http://www.blogger.com/atom/ns#" term="idiomas"/><category scheme="http://www.blogger.com/atom/ns#" term="modelo"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="traducciones"/><category scheme="http://www.blogger.com/atom/ns#" term="vista"/><title type='text'>CodeIgniter 2: Implementar mecanismo de idiomas para tus aplicaciones PHP</title><content type='html'>&lt;p&gt;&lt;b&gt;
CodeIgniter 2 trae su propio sistema de regionalización de idiomas, pero francamente me parece poco práctico, pues se basa en crear arreglos asociativos con las diferentes cadenas de traducción, el problema de esta técnica es que se requiere consultar constantemente el archivo de configuración para ver el nombre de la llave del arreglo y poder obtener la cadena, en cambio, sugiero usar un sistema más parecido al que usa Magento, que traduce la cadena en función de la cadena misma, y utiliza un sencillo sistema de archivos separados por comas y en pares.
&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
Así que los pasos para implementar un sistema de regionalización de idiomas son:
&lt;/p&gt;
&lt;h3&gt;Paso 1.&lt;/h3&gt;
&lt;p&gt;Crear en la carpeta &lt;code&gt;application/language/&lt;/code&gt;, los diferentes códigos de idiomas, en mi caso, utilzaré &lt;code&gt;en_US/&lt;/code&gt; y &lt;code&gt;es_MX/&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Paso 2.&lt;/h3&gt;
&lt;p&gt;Nuestra base siempre va a ser el inglés de estados unidos, así que vamos a crear en la carpeta &lt;code&gt;en_US&lt;/code&gt; un archivo llamado &lt;code&gt;core_general.csv&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Paso 3.&lt;/h3&gt;
&lt;p&gt;Es importante señalar que uno puede organizar los archivos de idiomas según su ámbito, por ejemplo, podemos crear uno llamado &lt;code&gt;core_exceptions.cvs&lt;/code&gt;, otro para &lt;code&gt;core_database.csv&lt;/code&gt;, otro para &lt;code&gt;sales.csv&lt;/code&gt;, otro para &lt;code&gt;checkout.csv&lt;/code&gt;, otro &lt;code&gt;crm.csv&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h3&gt;Paso 4.&lt;/h3&gt;
&lt;p&gt;La técnica es usar los archivos separados por comas en pares: tal como se muestra el ejemplo, recordemos que la base es el idioma inglés de E.U., en este ejemplo te muestro los dos archivos, el que colocaremos en la carpeta &lt;code&gt;en_US/&lt;/code&gt; y el que colocaremos en la carpeta &lt;code&gt;es_MX/&lt;/code&gt;, con esto ya se va comprendiendo más la lógica:&lt;/p&gt;
&lt;h3&gt;en_US/core_general.csv&lt;/h3&gt;
&lt;pre class=&quot;brush:text&quot;&gt;
&quot;ERP&quot;,&quot;ERP&quot;
&quot;MRP&quot;,&quot;MRP&quot;
&quot;CRM&quot;,&quot;CRM&quot;
&quot;FRM&quot;,&quot;FRM&quot;
&quot;HRM&quot;,&quot;HRM&quot;
&quot;SCM&quot;,&quot;SCM&quot;
&quot;Enterprise Resource Planning&quot;,&quot;Enterprise Resource Planning&quot;
&quot;Material Resource Planning&quot;,&quot;Material Resource Planning&quot;
&quot;Customer Relationship Management&quot;,&quot;Customer Relationship Management&quot;
&quot;Financial Resource Management&quot;,&quot;Financial Resource Management&quot;
&quot;Human Resource Management&quot;,&quot;Human Resource Management&quot;
&quot;Supply Chain Management&quot;,&quot;Supply Chain Management&quot;
&quot;Inbox&quot;,&quot;Inbox&quot;
&quot;Personal&quot;,&quot;Personal&quot;
&quot;Important&quot;,&quot;Important&quot;
&quot;Pending&quot;,&quot;Pending&quot;
&quot;Archived&quot;,&quot;Archived&quot;
&quot;archived&quot;,&quot;archived&quot;
&quot;Schedule&quot;,&quot;Schedule&quot;
&quot;Calendar&quot;,&quot;Calendar&quot;
&quot;Notes&quot;,&quot;Notes&quot;
&quot;Groups&quot;,&quot;Groups&quot;
&quot;Messages&quot;,&quot;Messages&quot;
&quot;Create/Join Groups&quot;,&quot;Create/Join Groups&quot;
&quot;Go!&quot;,&quot;Go!&quot;
&quot;Search...&quot;,&quot;Search...&quot;
&quot;Edit Profile&quot;,&quot;Edit Profile&quot;
&quot;View Profile&quot;,&quot;View Profile&quot;
&quot;View All&quot;,&quot;View All&quot;
&quot;Logout&quot;,&quot;Logout&quot;
&quot;Login&quot;,&quot;Login&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&lt;/pre&gt;

&lt;h3&gt;es_MX/core_general.csv&lt;/h3&gt;
&lt;pre class=&quot;brush:text&quot;&gt;
&quot;ERP&quot;,&quot;PRE&quot;
&quot;MRP&quot;,&quot;PRM&quot;
&quot;CRM&quot;,&quot;GAC&quot;
&quot;FRM&quot;,&quot;GRF&quot;
&quot;HRM&quot;,&quot;GRH&quot;
&quot;SCM&quot;,&quot;GCS&quot;
&quot;Enterprise Resource Planning&quot;,&quot;Planificación de recursos empresariales&quot;
&quot;Material Resource Planning&quot;,&quot;Planificación de recursos materiales&quot;
&quot;Customer Relationship Management&quot;,&quot;Gestión de atención al cliente&quot;
&quot;Financial Resource Management&quot;,&quot;Gestión de recursos financieros&quot;
&quot;Human Resource Management&quot;,&quot;Gestión de recursos humanos&quot;
&quot;Supply Chain Management&quot;,&quot;Gestión de la cadena de suministro&quot;
&quot;Inbox&quot;,&quot;Bandeja de entrada&quot;
&quot;Personal&quot;,&quot;Personal&quot;
&quot;Important&quot;,&quot;Importante&quot;
&quot;Pending&quot;,&quot;Pendiente&quot;
&quot;Archived&quot;,&quot;Archivados&quot;
&quot;archived&quot;,&quot;archivados&quot;
&quot;Schedule&quot;,&quot;Agenda&quot;
&quot;Calendar&quot;,&quot;Calendario&quot;
&quot;Notes&quot;,&quot;Notas&quot;
&quot;Groups&quot;,&quot;Grupos&quot;
&quot;Messages&quot;,&quot;Mensajes&quot;
&quot;Create/Join Groups&quot;,&quot;Crear/Unir grupos&quot;
&quot;Go!&quot;,&quot;Ir...&quot;
&quot;Search...&quot;,&quot;Buscar...&quot;
&quot;Edit Profile&quot;,&quot;Modificar perfil&quot;
&quot;View Profile&quot;,&quot;Ver perfil&quot;
&quot;View All&quot;,&quot;Ver todo&quot;
&quot;Logout&quot;,&quot;Desconectar&quot;
&quot;Login&quot;,&quot;Conectar&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&quot;&quot;,&quot;&quot;
&lt;/pre&gt;
&lt;h3&gt;Paso 5.&lt;/h3&gt;
&lt;p&gt;Ahora, vamos a crear un helper, llamado &lt;code&gt;translate_helper.php&lt;/code&gt; y lo vamos a colocar en la carpeta &lt;code&gt;application/helpers/&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;?php

/**
 * Regresa una cadena con la traducción especificada.
 * Si se especifica $code, se regresa la cadena en ese idioma, 
 * si no se envía el parámetro opcional $code, entonces la 
 * cadena es regresada en el idioma especificado en el archivo 
 * config.php de CI.
 * 
 * @param string $texto La cadena a traducir
 * @param string $archivo El archivo de traducción, por default, el core_general.csv
 * @param string $codigo El código idioma_región, pe: es_MX
 * @return string
 */
function __($texto, $archivo = &#39;core_general&#39;, $codigo = NULL)
{
    $texto_str = (string) $texto;

    # validar si la cadena viene vacía
    if (&#39;&#39; == $texto_str) {
        return &#39;&#39;;
    }

    # quitar espacios a la cadena
    $texto_ok = trim($texto);

    # inicializar locale por si no se encuentra la cadena a traducir
    $text_locale = $texto_ok;

    # validar código de idiomas
    if (!is_string($codigo)) {
        $codigo = config_item(&#39;locale_default&#39;);
    } else {
        $valid_code = array_search($codigo, config_item(&#39;locale_list&#39;));

        # si el código locale no está en la lista de paquetes de idioma disponibles,
        # entonces, tomar el default.
        if (FALSE === $valid_code) {
            $codigo = config_item(&#39;locale_default&#39;);
        }
    }

    $archivo = PATH_RAIZ . URL_ROOT_FOLDER . APPPATH . DIR_LANG . $codigo . &#39;/&#39; . $archivo . &#39;.csv&#39;;

    try {
        $handle = @fopen($archivo, &#39;rb&#39;);
    } catch (Exception $e) {
        return $text_locale;
    }
    
    if (FALSE !== $handle) {
        while (FALSE !== ($data = fgetcsv($handle, 1000, &#39;,&#39;))) {
            if ($texto_ok == $data[0]) {
                $text_locale = $data[1];
                break;
            }
        }
        fclose($handle);
    }

    return $text_locale;
}

/*  EOF  */
&lt;/pre&gt;
&lt;h3&gt;Paso 6.&lt;/h3&gt;
&lt;p&gt;Ahora necesitamos crear unas constantes, así que editamos el archivo &lt;code&gt;application/config/constants.php&lt;/code&gt; y declaramos las siguientes constantes:&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
define(&#39;PATH_RAIZ&#39;, $_SERVER[&#39;DOCUMENT_ROOT&#39;] . &#39;/&#39;);
define(&#39;URL_ROOT_FOLDER&#39;, &#39;&#39;); // si tu aplicación corre desde un(os) subdirectorio(s), ponerlo aquí por ejemplo: define(&#39;URL_ROOT_FOLDER&#39;, &#39;misubfolder/&#39;);
define(&#39;DIR_LANG&#39;, &#39;language/&#39;);
&lt;/pre&gt;
&lt;h3&gt;Paso 7.&lt;/h3&gt;
&lt;p&gt;Editamos el archivo &lt;code&gt;application/config/autoload.php&lt;/code&gt; y agregamos el nuevo helper (&lt;code&gt;translate&lt;/code&gt;) a la lista, en mi ejemplo se vería así:&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
$autoload[&#39;helper&#39;] = array(&#39;url&#39;, &#39;form&#39;, &#39;directory&#39;, &#39;file&#39;, &#39;html&#39;, &#39;date&#39;, &#39;cookie&#39;, &#39;translate&#39;);
&lt;/pre&gt;
&lt;h3&gt;Paso 8.&lt;/h3&gt;
&lt;p&gt;En el mismo archivo &lt;code&gt;autoload.php&lt;/code&gt; debemos colocar en una sección llamada &lt;i&gt;&quot;Auto-load config files&quot;&lt;/i&gt;, lo siguiente:&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
/*
| -------------------------------------------------------------------
|  Auto-load Config files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload[&#39;config&#39;] = array(&#39;config1&#39;, &#39;config2&#39;);
|
| NOTE: This item is intended for use ONLY if you have created custom
| config files.  Otherwise, leave it blank.
|
*/

$autoload[&#39;config&#39;] = array(&#39;locale&#39;);
&lt;/pre&gt;
&lt;h3&gt;Paso 9.&lt;/h3&gt;
&lt;p&gt;Ahora debemos crear el archivo de configuración &lt;code&gt;locale.php&lt;/code&gt; en la carpeta &lt;code&gt;application/config/&lt;/code&gt;
y colocamos el siguiente contenido:&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;?php  if ( ! defined(&#39;BASEPATH&#39;)) exit(&#39;No direct script access allowed&#39;);

$config[&#39;locale_default&#39;] = &#39;es_MX&#39;;

//$config[&#39;locale_list&#39;] = array(&#39;en_US&#39;, &#39;en_GB&#39;, &#39;es_ES&#39;, &#39;es_AR&#39;, &#39;es_CL&#39;, &#39;es_MX&#39;, &#39;es_UY&#39;, &#39;es_VE&#39;, &#39;fr_FR&#39;, &#39;pt_BR&#39;);

# idiomas disponibles, en mi caso, solamente manejaré éstos dos:
$config[&#39;locale_list&#39;] = array(&#39;en_US&#39;, &#39;es_MX&#39;);

/* EOF */
&lt;/pre&gt;
&lt;h3&gt;Paso 10.&lt;/h3&gt;
&lt;p&gt;Listo, ahora ya estamos preparados para usar nuestro archivo de traducciones en cualquier tipo de script: vista, controlador, modelo, helpers, librerías, etc., aquí un ejemplo para usarlo en una vista:&lt;/p&gt;
&lt;pre class=&quot;brush:html&quot;&gt;
&amp;lt;ul&gt;
    &amp;lt;li class=&quot;admin-username&quot;&gt;&amp;lt;?php echo $username; ?&gt;&amp;lt;/li&gt;
    &amp;lt;li&gt;&amp;lt;a href=&quot;#&quot;&gt;&amp;lt;?php echo __(&#39;Edit Profile&#39;); ?&gt;&amp;lt;/a&gt;&amp;lt;/li&gt;
    &amp;lt;li&gt;&amp;lt;a href=&quot;#&quot;&gt;&amp;lt;?php echo __(&#39;View Profile&#39;); ?&gt;&amp;lt;/a&gt;&amp;lt;a href=&quot;#&quot;&gt;&amp;lt;i class=&quot;icon-lock&quot;&gt;&amp;lt;/i&gt;&amp;lt;?php echo __(&#39;Logout&#39;); ?

&gt;&amp;lt;/a&gt;&amp;lt;/li&gt;
    &amp;lt;li class=&quot;active&quot;&gt;&amp;lt;a href=&quot;#messages&quot; class=&quot;icon-inbox&quot; title=&quot;&amp;lt;?php echo __(&#39;Messages&#39;); ?&gt;&quot;&gt;&amp;lt;/a&gt;&amp;lt;/li&gt;
    &amp;lt;li&gt;&amp;lt;a href=&quot;#schedule&quot; class=&quot;icon-calendar&quot; title=&quot;&amp;lt;?php echo __(&#39;Schedule&#39;); ?&gt;&quot;&gt;&amp;lt;/a&gt;&amp;lt;/li&gt;
    &amp;lt;li&gt;&amp;lt;a href=&quot;#groups&quot; class=&quot;icon-group&quot; title=&quot;&amp;lt;?php echo __(&#39;Groups&#39;); ?&gt;&quot;&gt;&amp;lt;/a&gt;&amp;lt;/li&gt;
&amp;lt;/ul&gt;
&lt;/pre&gt;

&lt;h3&gt;11. Por último, las variantes para este helper, serían por ejemplo:&lt;/h3&gt; 
&lt;pre class=&quot;brush:php&quot;&gt;
__(&#39;String to translate&#39;, &#39;sales&#39;); // usar el archivo sales.csv
__(&#39;String to translate&#39;, &#39;sales&#39;, &#39;fr_FR&#39;); // usar el archivo sales.csv y además forzar a usar el idioma francés de Francia.
&lt;/pre&gt;
&lt;p&gt;
Espero que le sea de utilidad.
&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/2523226596921076073/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/codeigniter-2-implementar-mecanismo-de-idiomas-para-tus-aplicaciones-php.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/2523226596921076073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/2523226596921076073'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/codeigniter-2-implementar-mecanismo-de-idiomas-para-tus-aplicaciones-php.html' title='CodeIgniter 2: Implementar mecanismo de idiomas para tus aplicaciones PHP'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-8541387628874275569</id><published>2013-05-16T16:49:00.000-05:00</published><updated>2013-05-17T10:18:41.512-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="18 digitos"/><category scheme="http://www.blogger.com/atom/ns#" term="controlador"/><category scheme="http://www.blogger.com/atom/ns#" term="convertir numeros a letras"/><category scheme="http://www.blogger.com/atom/ns#" term="modelo"/><category scheme="http://www.blogger.com/atom/ns#" term="mvc"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="poo"/><category scheme="http://www.blogger.com/atom/ns#" term="vista"/><title type='text'>Convertir números a letras usando PHP 5 / Poo y aplicando MVC</title><content type='html'>&lt;p&gt;Es la misma función que hice para convertir números a letras (tanto scriptera como la versión para CodeIgniter), pero ahora hecha con programación orientada a objetos&lt;/p&gt;
&lt;p&gt;Como un valor adicional, vamos a aplicar el patrón de diseño MVC (modelo, vista, controlador)&lt;/p&gt;
&lt;p&gt;Para este ejemplo voy a suponer que ya conoces las bases de POO (programación orientada a objetos), de lo contrario sugiero primero buscar documentación en la web&lt;/p&gt;
&lt;h3&gt;Puedes ejecutar el demo desde aquí &lt;a href=&quot;http://ultiminioramos.com/blogger_demos/numeros_a_letras_poo/&quot; target=&quot;_blank&quot;&gt;Convertir números a letras PHP 5 Poo/MVC&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;El código fuente lo puedes descargar desde aquí &lt;a href=&quot;http://ultiminioramos.com/recursos/blogger/numeros_a_letras/poo_numtoletras.zip&quot;&gt;poo_numtoletras.zip&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Primero, debemos crear una estructura de archivos que contenga:&lt;/h3&gt;
 &lt;ul&gt;
&lt;li&gt;un archivo &lt;b&gt;index.php&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;una carpeta &lt;b&gt;controller&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;un archivo &lt;b&gt;c_numeros.php&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;una carpeta &lt;b&gt;model&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;un archivo &lt;b&gt;m_numeros.php&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;una carpeta &lt;b&gt;view&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;un archivo &lt;b&gt;v_numeros.php&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Segundo, editamos el archivo ruteador &lt;b&gt;index.php&lt;/b&gt; y colocamos este código:&lt;/h3&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;?php

/**
 * Ruteador para aplicar el modelo MVC simple
 * 
 * @author Ultiminio Ramos Galán &amp;lt;contacto@ultiminioramos.com&gt;
 * @date 2013-05-16
 */

# cargar el controlador
include &#39;controller/c_numeros.php&#39;;

$instancia = new C_numeros();

$instancia-&gt;index();

/* EOF */
&lt;/pre&gt;
&lt;h3&gt;Tercero, editamos el archivo del controlador &lt;b&gt;c_numeros.php&lt;/b&gt; y colocamos este código:&lt;/h3&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;?php
/**
 * Clase controladora
 * 
 * @author Ultiminio Ramos Galán &amp;lt;contacto@ultiminioramos.com&gt;
 * @date 2013-05-16
 */

class C_numeros
{

    protected $_letras = &#39;&#39;;
    protected $_cantidad;

    public function __construct()
    {
        
    }

    public function index()
    {
        if (isset($_POST[&#39;cantidad&#39;])) {
            # preparar la variable
            $this-&gt;_prepararDatos();

            # cargar el modelo
            $modeloNum = $this-&gt;_cargarModelo(&#39;m_numeros&#39;);

            # ejecutar la conversion a letras
            try {
                $this-&gt;_letras = $modeloNum-&gt;numeroLetras($this-&gt;_cantidad);
            } catch (Exception $e) {
                $letras = &#39;Ocurrió un error.&#39;;
            }
        }

        # cargar la vista
        $view_data[&#39;cantidad&#39;] = $this-&gt;_cantidad;
        $view_data[&#39;letras&#39;] = $this-&gt;_letras;

        $this-&gt;_cargarVista(&#39;v_numeros&#39;, $view_data);
    }

    /**
     * En este método puedes validar el dato de entrada y 
     * agregar funcionalidad adicional
     * 
     * @return void
     */
    protected function _prepararDatos()
    {
        $this-&gt;_cantidad = trim($_POST[&#39;cantidad&#39;]);

        return;
    }

    /**
     * Instancia la clase del modelo y regresa el objeto
     * 
     * @param string $modelo
     * @return object
     */
    protected function _cargarModelo($modelo)
    {
        include &quot;model/{$modelo}.php&quot;;
        
        return new M_numeros();
    }

    /**
     * Cargar la vista
     * 
     * @param string $vista
     * @param array $datos_vista
     */
    protected function _cargarVista($vista, $datos_vista)
    {
        include &quot;view/{$vista}.php&quot;;
    }

}
&lt;/pre&gt;
&lt;h3&gt;Cuarto, editamos el archivo de la vista &lt;b&gt;v_numeros.php&lt;/b&gt; y colocamos este código:&lt;/h3&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;!DOCTYPE html&gt;
&amp;lt;html&gt;
    &amp;lt;head&gt;
        &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
        &amp;lt;title&gt;Convertir números a letras con PHP 5/Poo &amp;lt;/title&gt;
    &amp;lt;/head&gt;
    &amp;lt;body&gt;
        &amp;lt;form name=&quot;forma1&quot; action=&quot;&quot; method=&quot;post&quot;&gt;
            &amp;lt;div style=&quot;width: 100%; display: block;&quot;&gt;
                &amp;lt;input id=&quot;cantidad&quot; type=&quot;text&quot; name=&quot;cantidad&quot; value=&quot;&amp;lt;?php echo $datos_vista[&#39;cantidad&#39;]; ?&gt;&quot; size=&quot;50&quot; maxlength=&quot;21&quot; /&gt; 
                &amp;lt;input id=&quot;boton1&quot; type=&quot;submit&quot; name=&quot;boton1&quot; value=&quot;Convertir...&quot; /&gt;
            &amp;lt;/div&gt;
            &amp;lt;div style=&quot;width: 100%; display: block;&quot;&gt;
                &amp;lt;textarea id=&quot;cantidad_letras&quot; cols=&quot;100&quot; rows=&quot;5&quot;&gt;&amp;lt;?php echo $datos_vista[&#39;letras&#39;]; ?&gt;&amp;lt;/textarea&gt;
            &amp;lt;/div&gt;
        &amp;lt;/form&gt;

        &amp;lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
        &amp;lt;/script&gt;
    &amp;lt;/body&gt;
&amp;lt;/html&gt;
&lt;/pre&gt;
&lt;h3&gt;Quinto, editamos el archivo del modelo &lt;b&gt;m_numeros.php&lt;/b&gt; y colocamos este código:&lt;/h3&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;?php
/**
 * Clase del proceso de negocio (modelo)
 * 
 * @author Ultiminio Ramos Galán &amp;lt;contacto@ultiminioramos.com&gt;
 * @date 2013-05-16
 */

class M_numeros
{

    /**
     * Convierte un número en una cadena de letras, para el idioma
     * castellano, pero puede funcionar para español de mexico, de  
     * españa, colombia, argentina, etc.
     * 
     * Máxima cifra soportada: 18 dígitos con 2 decimales
     * 999,999,999,999,999,999.99
     * NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE BILLONES
     * NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE MILLONES
     * NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE PESOS 99/100 M.N.
     * 
     * @author Ultiminio Ramos Galán &amp;lt;contacto@ultiminioramos.com&gt;
     * @param string $numero La cantidad numérica a convertir 
     * @param string $moneda La moneda local de tu país
     * @param string $subfijo Una cadena adicional para el subfijo
     * 
     * @return string La cantidad convertida a letras
     */
    public function numeroLetras($numero, $moneda = &#39;PESO&#39;, $subfijo = &#39;M.N.&#39;)
    {
        $xarray = array(
            0 =&gt; &#39;Cero&#39;
            , 1 =&gt; &#39;UN&#39;, &#39;DOS&#39;, &#39;TRES&#39;, &#39;CUATRO&#39;, &#39;CINCO&#39;, &#39;SEIS&#39;, &#39;SIETE&#39;, &#39;OCHO&#39;, &#39;NUEVE&#39;
            , &#39;DIEZ&#39;, &#39;ONCE&#39;, &#39;DOCE&#39;, &#39;TRECE&#39;, &#39;CATORCE&#39;, &#39;QUINCE&#39;, &#39;DIECISEIS&#39;, &#39;DIECISIETE&#39;, &#39;DIECIOCHO&#39;, &#39;DIECINUEVE&#39;
            , &#39;VEINTI&#39;, 30 =&gt; &#39;TREINTA&#39;, 40 =&gt; &#39;CUARENTA&#39;, 50 =&gt; &#39;CINCUENTA&#39;
            , 60 =&gt; &#39;SESENTA&#39;, 70 =&gt; &#39;SETENTA&#39;, 80 =&gt; &#39;OCHENTA&#39;, 90 =&gt; &#39;NOVENTA&#39;
            , 100 =&gt; &#39;CIENTO&#39;, 200 =&gt; &#39;DOSCIENTOS&#39;, 300 =&gt; &#39;TRESCIENTOS&#39;, 400 =&gt; &#39;CUATROCIENTOS&#39;, 500 =&gt; &#39;QUINIENTOS&#39;
            , 600 =&gt; &#39;SEISCIENTOS&#39;, 700 =&gt; &#39;SETECIENTOS&#39;, 800 =&gt; &#39;OCHOCIENTOS&#39;, 900 =&gt; &#39;NOVECIENTOS&#39;
        );

        $numero = trim($numero);
        $xpos_punto = strpos($numero, &#39;.&#39;);
        $xaux_int = $numero;
        $xdecimales = &#39;00&#39;;
        if (!($xpos_punto === false)) {
            if ($xpos_punto == 0) {
                $numero = &#39;0&#39; . $numero;
                $xpos_punto = strpos($numero, &#39;.&#39;);
            }
            $xaux_int = substr($numero, 0, $xpos_punto); // obtengo el entero de la cifra a covertir
            $xdecimales = substr($numero . &#39;00&#39;, $xpos_punto + 1, 2); // obtengo los valores decimales
        }

        $XAUX = str_pad($xaux_int, 18, &#39; &#39;, STR_PAD_LEFT); // ajusto la longitud de la cifra, para que sea divisible por centenas de miles (grupos de 6)
        $xcadena = &#39;&#39;;
        for ($xz = 0; $xz &amp;lt; 3; $xz++) {
            $xaux = substr($XAUX, $xz * 6, 6);
            $xi = 0;
            $xlimite = 6; // inicializo el contador de centenas xi y establezco el límite a 6 dígitos en la parte entera
            $xexit = true; // bandera para controlar el ciclo del While
            while ($xexit) {
                if ($xi == $xlimite) { // si ya llegó al límite máximo de enteros
                    break; // termina el ciclo
                }

                $x3digitos = ($xlimite - $xi) * -1; // comienzo con los tres primeros digitos de la cifra, comenzando por la izquierda
                $xaux = substr($xaux, $x3digitos, abs($x3digitos)); // obtengo la centena (los tres dígitos)
                for ($xy = 1; $xy &amp;lt; 4; $xy++) { // ciclo para revisar centenas, decenas y unidades, en ese orden
                    switch ($xy) {
                        case 1: // checa las centenas
                            $key = (int) substr($xaux, 0, 3);
                            if (100 &gt; $key) { // si el grupo de tres dígitos es menor a una centena ( &amp;lt; 99) no hace nada y pasa a revisar las decenas
                                /* do nothing */
                            } else {
                                if (TRUE === array_key_exists($key, $xarray)) {  // busco si la centena es número redondo (100, 200, 300, 400, etc..)
                                    $xseek = $xarray[$key];
                                    $xsub = $this-&gt;_subfijo($xaux); // devuelve el subfijo correspondiente (Millón, Millones, Mil o nada)
                                    if (100 == $key) {
                                        $xcadena = &#39; &#39; . $xcadena . &#39; CIEN &#39; . $xsub;
                                    } else {
                                        $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek . &#39; &#39; . $xsub;
                                    }
                                    $xy = 3; // la centena fue redonda, entonces termino el ciclo del for y ya no reviso decenas ni unidades
                                } else { // entra aquí si la centena no fue numero redondo (101, 253, 120, 980, etc.)
                                    $key = (int) substr($xaux, 0, 1) * 100;
                                    $xseek = $xarray[$key]; // toma el primer caracter de la centena y lo multiplica por cien y lo busca en el arreglo (para que busque 100,200,300, etc)
                                    $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek;
                                } // ENDIF ($xseek)
                            } // ENDIF (substr($xaux, 0, 3) &amp;lt; 100)
                            break;
                        case 2: // checa las decenas (con la misma lógica que las centenas)
                            $key = (int) substr($xaux, 1, 2);
                            if (10 &gt; $key) {
                                /* do nothing */
                            } else {
                                if (TRUE === array_key_exists($key, $xarray)) {
                                    $xseek = $xarray[$key];
                                    $xsub = $this-&gt;_subfijo($xaux);
                                    if (20 == $key) {
                                        $xcadena = &#39; &#39; . $xcadena . &#39; VEINTE &#39; . $xsub;
                                    } else {
                                        $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek . &#39; &#39; . $xsub;
                                    }
                                    $xy = 3;
                                } else {
                                    $key = (int) substr($xaux, 1, 1) * 10;
                                    $xseek = $xarray[$key];
                                    if (20 == $key)
                                        $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek;
                                    else
                                        $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek . &#39; Y &#39;;
                                } // ENDIF ($xseek)
                            } // ENDIF (substr($xaux, 1, 2) &amp;lt; 10)
                            break;
                        case 3: // checa las unidades
                            $key = (int) substr($xaux, 2, 1);
                            if (1 &gt; $key) { // si la unidad es cero, ya no hace nada
                                /* do nothing */
                            } else {
                                $xseek = $xarray[$key]; // obtengo directamente el valor de la unidad (del uno al nueve)
                                $xsub = $this-&gt;_subfijo($xaux);
                                $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek . &#39; &#39; . $xsub;
                            } // ENDIF (substr($xaux, 2, 1) &amp;lt; 1)
                            break;
                    } // END SWITCH
                } // END FOR
                $xi = $xi + 3;
            } // ENDDO
            # si la cadena obtenida termina en MILLON o BILLON, entonces le agrega al final la conjuncion DE
            if (&#39;ILLON&#39; == substr(trim($xcadena), -5, 5)) {
                $xcadena.= &#39; DE&#39;;
            }

            # si la cadena obtenida en MILLONES o BILLONES, entonces le agrega al final la conjuncion DE
            if (&#39;ILLONES&#39; == substr(trim($xcadena), -7, 7)) {
                $xcadena.= &#39; DE&#39;;
            }

            # depurar leyendas finales
            if (&#39;&#39; != trim($xaux)) {
                switch ($xz) {
                    case 0:
                        if (&#39;1&#39; == trim(substr($XAUX, $xz * 6, 6))) {
                            $xcadena.= &#39;UN BILLON &#39;;
                        } else {
                            $xcadena.= &#39; BILLONES &#39;;
                        }
                        break;
                    case 1:
                        if (&#39;1&#39; == trim(substr($XAUX, $xz * 6, 6))) {
                            $xcadena.= &#39;UN MILLON &#39;;
                        } else {
                            $xcadena.= &#39; MILLONES &#39;;
                        }
                        break;
                    case 2:
                        if (1 &gt; $numero) {
                            $xcadena = &quot;CERO {$moneda}S {$xdecimales}/100 {$subfijo}&quot;;
                        }
                        if ($numero &gt;= 1 &amp;&amp; $numero &amp;lt; 2) {
                            $xcadena = &quot;UN {$moneda} {$xdecimales}/100 {$subfijo}&quot;;
                        }
                        if ($numero &gt;= 2) {
                            $xcadena.= &quot; {$moneda}S {$xdecimales}/100 {$subfijo}&quot;; //
                        }
                        break;
                } // endswitch ($xz)
            } // ENDIF (trim($xaux) != &quot;&quot;)

            $xcadena = str_replace(&#39;VEINTI &#39;, &#39;VEINTI&#39;, $xcadena); // quito el espacio para el VEINTI, para que quede: VEINTICUATRO, VEINTIUN, VEINTIDOS, etc
            $xcadena = str_replace(&#39;  &#39;, &#39; &#39;, $xcadena); // quito espacios dobles
            $xcadena = str_replace(&#39;UN UN&#39;, &#39;UN&#39;, $xcadena); // quito la duplicidad
            $xcadena = str_replace(&#39;  &#39;, &#39; &#39;, $xcadena); // quito espacios dobles
            $xcadena = str_replace(&#39;BILLON DE MILLONES&#39;, &#39;BILLON DE&#39;, $xcadena); // corrigo la leyenda
            $xcadena = str_replace(&#39;BILLONES DE MILLONES&#39;, &#39;BILLONES DE&#39;, $xcadena); // corrigo la leyenda
            $xcadena = str_replace(&#39;DE UN&#39;, &#39;UN&#39;, $xcadena); // corrigo la leyenda
        } // ENDFOR ($xz)
        return trim($xcadena);
    }

    /**
     * Esta función regresa un subfijo para la cifra
     * 
     * @author Ultiminio Ramos Galán &amp;lt;contacto@ultiminioramos.com&gt;
     * @param string $cifras La cifra a medir su longitud
     */
    private function _subfijo($cifras)
    {
        $cifras = trim($cifras);
        $strlen = strlen($cifras);
        $_sub = &#39;&#39;;
        if (4 &amp;lt;= $strlen &amp;&amp; 6 &gt;= $strlen) {
            $_sub = &#39;MIL&#39;;
        }

        return $_sub;
    }

}

/*  EOF  */
&lt;/pre&gt;
&lt;p&gt;El código fuente lo puedes descargar desde aquí &lt;a href=&quot;http://ultiminioramos.com/recursos/blogger/numeros_a_letras/poo_numtoletras.zip&quot;&gt;poo_numtoletras.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Espero que les haya sido de utilidad.&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/8541387628874275569/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/convertir-numeros-letras-usando-php-5-poo-mvc.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8541387628874275569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8541387628874275569'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/convertir-numeros-letras-usando-php-5-poo-mvc.html' title='Convertir números a letras usando PHP 5 / Poo y aplicando MVC'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-102620436401907061</id><published>2013-05-16T13:10:00.003-05:00</published><updated>2013-05-17T10:19:55.071-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="18 digitos"/><category scheme="http://www.blogger.com/atom/ns#" term="ajax"/><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="convertir numeros a letras"/><category scheme="http://www.blogger.com/atom/ns#" term="helper"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><title type='text'>Convertir números a letras con CodeIgniter 2, usando ajax y jQuery</title><content type='html'>&lt;p&gt;Es la misma función que hice para convertir números a letras, pero ahora integrada a CodeIgniter 2&lt;/p&gt;
&lt;p&gt;como un valor adicional, vamos a hacer la llamada por ajax usando jQuery, pero lo que realmente vale es el helper que hace la conversión de números a letras&lt;/p&gt;
&lt;p&gt;Para este ejemplo voy a suponer que ya conoces las bases de CodeIgniter, de lo contrario sugiero primero ir a la documentación oficial: &lt;a href=&quot;http://escodeigniter.com/guia_usuario/&quot; target=&quot;_blank&quot;&gt;http://escodeigniter.com/guia_usuario/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Puedes ejecutar el demo desde aquí &lt;a href=&quot;http://ultiminioramos.com/blogger_demos/codeigniter2/index.php/numeros/&quot; target=&quot;_blank&quot;&gt;Convertir números a letras PHP con CodeIgniter 2&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;El código fuente lo puedes descargar desde aquí &lt;a href=&quot;http://ultiminioramos.com/recursos/blogger/codeigniter2/numeros_a_letras_CI2.zip&quot;&gt;numeros_a_letras_CI2.zip&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Primero, creamos un helper&lt;/h3&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;?php

/**
 * Convierte un número en una cadena de letras, para el idioma
 * castellano, pero puede funcionar para español de mexico, de  
 * españa, colombia, argentina, etc.
 * 
 * Máxima cifra soportada: 18 dígitos con 2 decimales
 * 999,999,999,999,999,999.99
 * NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE BILLONES
 * NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE MILLONES
 * NOVECIENTOS NOVENTA Y NUEVE MIL NOVECIENTOS NOVENTA Y NUEVE PESOS 99/100 M.N.
 * 
 * @author Ultiminio Ramos Galán &amp;lt;contacto@ultiminioramos.com&gt;
 * @param string $numero La cantidad numérica a convertir 
 * @param string $moneda La moneda local de tu país
 * @param string $subfijo Una cadena adicional para el subfijo
 * 
 * @return string La cantidad convertida a letras
 */
function num_to_letras($numero, $moneda = &#39;PESO&#39;, $subfijo = &#39;M.N.&#39;)
{
    $xarray = array(
        0 =&gt; &#39;Cero&#39;
        , 1 =&gt; &#39;UN&#39;, &#39;DOS&#39;, &#39;TRES&#39;, &#39;CUATRO&#39;, &#39;CINCO&#39;, &#39;SEIS&#39;, &#39;SIETE&#39;, &#39;OCHO&#39;, &#39;NUEVE&#39;
        , &#39;DIEZ&#39;, &#39;ONCE&#39;, &#39;DOCE&#39;, &#39;TRECE&#39;, &#39;CATORCE&#39;, &#39;QUINCE&#39;, &#39;DIECISEIS&#39;, &#39;DIECISIETE&#39;, &#39;DIECIOCHO&#39;, &#39;DIECINUEVE&#39;
        , &#39;VEINTI&#39;, 30 =&gt; &#39;TREINTA&#39;, 40 =&gt; &#39;CUARENTA&#39;, 50 =&gt; &#39;CINCUENTA&#39;
        , 60 =&gt; &#39;SESENTA&#39;, 70 =&gt; &#39;SETENTA&#39;, 80 =&gt; &#39;OCHENTA&#39;, 90 =&gt; &#39;NOVENTA&#39;
        , 100 =&gt; &#39;CIENTO&#39;, 200 =&gt; &#39;DOSCIENTOS&#39;, 300 =&gt; &#39;TRESCIENTOS&#39;, 400 =&gt; &#39;CUATROCIENTOS&#39;, 500 =&gt; &#39;QUINIENTOS&#39;
        , 600 =&gt; &#39;SEISCIENTOS&#39;, 700 =&gt; &#39;SETECIENTOS&#39;, 800 =&gt; &#39;OCHOCIENTOS&#39;, 900 =&gt; &#39;NOVECIENTOS&#39;
    );

    $numero = trim($numero);
    $xpos_punto = strpos($numero, &#39;.&#39;);
    $xaux_int = $numero;
    $xdecimales = &#39;00&#39;;
    if (!($xpos_punto === false)) {
        if ($xpos_punto == 0) {
            $numero = &#39;0&#39; . $numero;
            $xpos_punto = strpos($numero, &#39;.&#39;);
        }
        $xaux_int = substr($numero, 0, $xpos_punto); // obtengo el entero de la cifra a covertir
        $xdecimales = substr($numero . &#39;00&#39;, $xpos_punto + 1, 2); // obtengo los valores decimales
    }

    $XAUX = str_pad($xaux_int, 18, &#39; &#39;, STR_PAD_LEFT); // ajusto la longitud de la cifra, para que sea divisible por centenas de miles (grupos de 6)
    $xcadena = &#39;&#39;;
    for ($xz = 0; $xz &amp;lt; 3; $xz++) {
        $xaux = substr($XAUX, $xz * 6, 6);
        $xi = 0;
        $xlimite = 6; // inicializo el contador de centenas xi y establezco el límite a 6 dígitos en la parte entera
        $xexit = true; // bandera para controlar el ciclo del While
        while ($xexit) {
            if ($xi == $xlimite) { // si ya llegó al límite máximo de enteros
                break; // termina el ciclo
            }

            $x3digitos = ($xlimite - $xi) * -1; // comienzo con los tres primeros digitos de la cifra, comenzando por la izquierda
            $xaux = substr($xaux, $x3digitos, abs($x3digitos)); // obtengo la centena (los tres dígitos)
            for ($xy = 1; $xy &amp;lt; 4; $xy++) { // ciclo para revisar centenas, decenas y unidades, en ese orden
                switch ($xy) {
                    case 1: // checa las centenas
                        $key = (int) substr($xaux, 0, 3);
                        if (100 &gt; $key) { // si el grupo de tres dígitos es menor a una centena ( &amp;lt; 99) no hace nada y pasa a revisar las decenas
                            /* do nothing */
                        } else {
                            if (TRUE === array_key_exists($key, $xarray)) {  // busco si la centena es número redondo (100, 200, 300, 400, etc..)
                                $xseek = $xarray[$key];
                                $xsub = subfijo($xaux); // devuelve el subfijo correspondiente (Millón, Millones, Mil o nada)
                                if (100 == $key) {
                                    $xcadena = &#39; &#39; . $xcadena . &#39; CIEN &#39; . $xsub;
                                } else {
                                    $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek . &#39; &#39; . $xsub;
                                }
                                $xy = 3; // la centena fue redonda, entonces termino el ciclo del for y ya no reviso decenas ni unidades
                            } else { // entra aquí si la centena no fue numero redondo (101, 253, 120, 980, etc.)
                                $key = (int) substr($xaux, 0, 1) * 100;
                                $xseek = $xarray[$key]; // toma el primer caracter de la centena y lo multiplica por cien y lo busca en el arreglo (para que busque 100,200,300, etc)
                                $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek;
                            } // ENDIF ($xseek)
                        } // ENDIF (substr($xaux, 0, 3) &amp;lt; 100)
                        break;
                    case 2: // checa las decenas (con la misma lógica que las centenas)
                        $key = (int) substr($xaux, 1, 2);
                        if (10 &gt; $key) {
                            /* do nothing */
                        } else {
                            if (TRUE === array_key_exists($key, $xarray)) {
                                $xseek = $xarray[$key];
                                $xsub = subfijo($xaux);
                                if (20 == $key) {
                                    $xcadena = &#39; &#39; . $xcadena . &#39; VEINTE &#39; . $xsub;
                                } else {
                                    $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek . &#39; &#39; . $xsub;
                                }
                                $xy = 3;
                            } else {
                                $key = (int) substr($xaux, 1, 1) * 10;
                                $xseek = $xarray[$key];
                                if (20 == $key)
                                    $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek;
                                else
                                    $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek . &#39; Y &#39;;
                            } // ENDIF ($xseek)
                        } // ENDIF (substr($xaux, 1, 2) &amp;lt; 10)
                        break;
                    case 3: // checa las unidades
                        $key = (int) substr($xaux, 2, 1);
                        if (1 &gt; $key) { // si la unidad es cero, ya no hace nada
                            /* do nothing */
                        } else {
                            $xseek = $xarray[$key]; // obtengo directamente el valor de la unidad (del uno al nueve)
                            $xsub = subfijo($xaux);
                            $xcadena = &#39; &#39; . $xcadena . &#39; &#39; . $xseek . &#39; &#39; . $xsub;
                        } // ENDIF (substr($xaux, 2, 1) &amp;lt; 1)
                        break;
                } // END SWITCH
            } // END FOR
            $xi = $xi + 3;
        } // ENDDO
        # si la cadena obtenida termina en MILLON o BILLON, entonces le agrega al final la conjuncion DE
        if (&#39;ILLON&#39; == substr(trim($xcadena), -5, 5)) {
            $xcadena.= &#39; DE&#39;;
        }

        # si la cadena obtenida en MILLONES o BILLONES, entonces le agrega al final la conjuncion DE
        if (&#39;ILLONES&#39; == substr(trim($xcadena), -7, 7)) {
            $xcadena.= &#39; DE&#39;;
        }

        # depurar leyendas finales
        if (&#39;&#39; != trim($xaux)) {
            switch ($xz) {
                case 0:
                    if (&#39;1&#39; == trim(substr($XAUX, $xz * 6, 6))) {
                        $xcadena.= &#39;UN BILLON &#39;;
                    } else {
                        $xcadena.= &#39; BILLONES &#39;;
                    }
                    break;
                case 1:
                    if (&#39;1&#39; == trim(substr($XAUX, $xz * 6, 6))) {
                        $xcadena.= &#39;UN MILLON &#39;;
                    } else {
                        $xcadena.= &#39; MILLONES &#39;;
                    }
                    break;
                case 2:
                    if (1 &gt; $numero) {
                        $xcadena = &quot;CERO {$moneda}S {$xdecimales}/100 {$subfijo}&quot;;
                    }
                    if ($numero &gt;= 1 &amp;&amp; $numero &amp;lt; 2) {
                        $xcadena = &quot;UN {$moneda} {$xdecimales}/100 {$subfijo}&quot;;
                    }
                    if ($numero &gt;= 2) {
                        $xcadena.= &quot; {$moneda}S {$xdecimales}/100 {$subfijo}&quot;; //
                    }
                    break;
            } // endswitch ($xz)
        } // ENDIF (trim($xaux) != &quot;&quot;)

        $xcadena = str_replace(&#39;VEINTI &#39;, &#39;VEINTI&#39;, $xcadena); // quito el espacio para el VEINTI, para que quede: VEINTICUATRO, VEINTIUN, VEINTIDOS, etc
        $xcadena = str_replace(&#39;  &#39;, &#39; &#39;, $xcadena); // quito espacios dobles
        $xcadena = str_replace(&#39;UN UN&#39;, &#39;UN&#39;, $xcadena); // quito la duplicidad
        $xcadena = str_replace(&#39;  &#39;, &#39; &#39;, $xcadena); // quito espacios dobles
        $xcadena = str_replace(&#39;BILLON DE MILLONES&#39;, &#39;BILLON DE&#39;, $xcadena); // corrigo la leyenda
        $xcadena = str_replace(&#39;BILLONES DE MILLONES&#39;, &#39;BILLONES DE&#39;, $xcadena); // corrigo la leyenda
        $xcadena = str_replace(&#39;DE UN&#39;, &#39;UN&#39;, $xcadena); // corrigo la leyenda
    } // ENDFOR ($xz)
    return trim($xcadena);
}

/**
 * Esta función regresa un subfijo para la cifra
 * 
 * @author Ultiminio Ramos Galán &amp;lt;contacto@ultiminioramos.com&gt;
 * @param string $cifras La cifra a medir su longitud
 */
function subfijo($cifras)
{
    $cifras = trim($cifras);
    $strlen = strlen($cifras);
    $_sub = &#39;&#39;;
    if (4 &amp;lt;= $strlen &amp;&amp; 6 &gt;= $strlen) {
        $_sub = &#39;MIL&#39;;
    }

    return $_sub;
}

/*  EOF  */
&lt;/pre&gt;
&lt;h3&gt;Segundo, creamos una vista&lt;/h3&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;!DOCTYPE html&gt;
&amp;lt;html&gt;
    &amp;lt;head&gt;
        &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
        &amp;lt;title&gt;Convertir números a letras con PHP/CodeIgniter 2&amp;lt;/title&gt;
        &amp;lt;!--
        La ausencia de http: en el link de abajo NO es un error:
        http://encosia.com/3-reasons-why-you-should-let-google-host-jquery-for-you/#protocolless
        --&gt;
        &amp;lt;script src=&quot;//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js&quot; &gt;&amp;lt;/script&gt;
    &amp;lt;/head&gt;
    &amp;lt;body&gt;
        &amp;lt;form name=&quot;forma1&quot; action=&quot;&quot; method=&quot;post&quot;&gt;
            &amp;lt;input id=&quot;cantidad&quot; type=&quot;text&quot; name=&quot;cantidad&quot; value=&quot;&amp;lt;?php echo isset($_POST[&#39;cantidad&#39;]) ? $_POST[&#39;cantidad&#39;] : &#39;&#39;; ?&gt;&quot; size=&quot;50&quot; maxlength=&quot;21&quot; /&gt; 
            &amp;lt;input id=&quot;boton1&quot; type=&quot;button&quot; name=&quot;boton1&quot; value=&quot;Convertir...&quot; /&gt;
            &amp;lt;br/&gt;
            &amp;lt;textarea id=&quot;cantidad_letras&quot; cols=&quot;100&quot; rows=&quot;5&quot;&gt;&amp;lt;?php echo isset($_POST[&#39;cantidad&#39;]) ? numtoletras($_POST[&#39;cantidad&#39;]) : &#39;&#39;; ?&gt;&amp;lt;/textarea&gt;
        &amp;lt;/form&gt;

        &amp;lt;script type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;
            /* debes personalizar esta url para apuntar a tu servidor */
            var url_post = &#39;http://ultiminioramos.com/blog/codeigniter2/index.php/numeros/convertir/&#39;;

            jQuery(document).ready(function() {
                $(&#39;#cantidad&#39;).focus();

                /* Enviar vía ajax la petición */
                $(&#39;#boton1&#39;).dblclick(function(e) {
                    e.preventDefault();
                });
                $(&#39;#boton1&#39;).click(function(e) {
                    e.preventDefault();
                    
                    $.ajax({
                        url: url_post
                                , type: &#39;post&#39;
                                , dataType: &#39;json&#39;
                                , data: {
                                    cantidad: $(&#39;#cantidad&#39;).val()
                                }
                                , success: function(response) {
                            $(&#39;#cantidad_letras&#39;).html(response.leyenda);
                            $(&#39;#cantidad&#39;).val(response.cantidad);
                        }
                    });
                });
            });
        &amp;lt;/script&gt;
    &amp;lt;/body&gt;
&amp;lt;/html&gt;
&lt;/pre&gt;
&lt;h3&gt;Tercero, creamos el controlador&lt;/h3&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;?php

/**
 * Ejemplo en CodeIgniter 2 para convertir números a letras
 *
 * @author Ultiminio Ramos Galán &amp;lt;contacto@ultiminioramos.com&gt;
 */
class numeros extends CI_Controller
{

    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        $this-&gt;load-&gt;helper(&#39;numeros&#39;);

        $this-&gt;load-&gt;view(&#39;v_numeros&#39;);
    }

    public function convertir()
    {
        $cantidad = trim($this-&gt;input-&gt;post(&#39;cantidad&#39;));

        if (empty($cantidad)) {
            echo json_encode(array(&#39;leyenda&#39; =&gt; &#39;Debe introducir una cantidad.&#39;));
            
            return;
        }
        
        # verificar si el número no tiene caracteres no númericos, con excepción
        # del punto decimal
        $xcantidad = str_replace(&#39;.&#39;, &#39;&#39;, $cantidad);
        
        if (FALSE === ctype_digit($xcantidad)){
            echo json_encode(array(&#39;leyenda&#39; =&gt; &#39;La cantidad introducida no es válida.&#39;));
            
            return;
        }

        # procedemos a covertir la cantidad en letras
        $this-&gt;load-&gt;helper(&#39;numeros&#39;);
        $response = array(
            &#39;leyenda&#39; =&gt; num_to_letras($cantidad)
            , &#39;cantidad&#39; =&gt; $cantidad
            );
        echo json_encode($response);
    }

}
/* EOF */
&lt;/pre&gt;
&lt;p&gt;El código fuente lo puedes descargar desde aquí &lt;a href=&quot;http://ultiminioramos.com/recursos/blogger/codeigniter2/numeros_a_letras_CI2.zip&quot;&gt;numeros_a_letras_CI2.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Espero que les haya sido de utilidad.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/102620436401907061/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/convertir-numeros-letras-con-codeigniter-2-usando-ajax-jquery.html#comment-form' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/102620436401907061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/102620436401907061'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/convertir-numeros-letras-con-codeigniter-2-usando-ajax-jquery.html' title='Convertir números a letras con CodeIgniter 2, usando ajax y jQuery'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-7037038085778702828</id><published>2013-05-04T10:35:00.000-05:00</published><updated>2013-05-04T10:35:47.445-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".bash_profile"/><category scheme="http://www.blogger.com/atom/ns#" term=".bashrc"/><category scheme="http://www.blogger.com/atom/ns#" term="1and1"/><category scheme="http://www.blogger.com/atom/ns#" term="business package"/><category scheme="http://www.blogger.com/atom/ns#" term="centos"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="prompt"/><category scheme="http://www.blogger.com/atom/ns#" term="putty"/><category scheme="http://www.blogger.com/atom/ns#" term="servidor"/><category scheme="http://www.blogger.com/atom/ns#" term="ssh"/><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><title type='text'>Cómo crear un shell .bashrc con servidores Linux de 1and1 Business Package</title><content type='html'>&lt;p&gt;Esto lo tengo realizado con mi servidor Linux Business Package de 1and1, y funciona con CentOs y Ubuntu, pero seguramente con otras distribuciones de linux también.&lt;/p&gt;
&lt;p&gt;
Primero, abrir una consola linux, puede ser con putty.exe (1and1 te lo ofrece gratis para que lo puedas descargar)
&lt;/p&gt;
&lt;p&gt;
Ahora, lo que hay que hacer es crear/editar un archivo .bash_profile directamente en la carpeta home de tu usuario SSH de 1and1 (es el mismo que usas para conexiones FTP)
&lt;pre class=&quot;brush:shell&quot;&gt;
vi .bash_profile
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Acto seguido, presiona la tecla i para cambiar a modo de edición, copiar el siguiente código
&lt;pre class=&quot;brush:shell&quot;&gt;
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi
&lt;/pre&gt;
Presionar la tecla &lt;code&gt;Esc&lt;/code&gt; y luego las teclas &lt;code&gt;wq&lt;/code&gt;  y presionas &lt;code&gt;Enter&lt;/code&gt;, esto guardará el archivo recién creado.
&lt;/p&gt;
&lt;p&gt;
Ahora sí, puedes crear/editar el archivo &lt;strong&gt;.bashrc&lt;/strong&gt; y poner todo lo que tú deseas, en mi caso particular, quise personalizar el prompt y los colores de la pantalla:
&lt;pre class=&quot;brush:shell&quot;&gt;
# Personalizar los colores del comando ls y del prompt
# Ultiminio Ramos G.
# 2011-04-16
export LS_COLORS=&#39;di=01;35:ex=01;37:ow=01;04&#39;

export PS1=&#39;[\[\e[01;37m\]\u\[\e[0m\]@\[\e[01;37m\H\[\e[0m\]] [\[\e[01;37m\]\d \t\[\e[0m\]] [\[\e[01;37m\]Path:\[\e[0m\] \[\e[01;36m\]\w\[\e[0m\]]\n\[\e[01;33m\]#\[\e[0m\] &#39;

export GREP_COLOR=&#39;01;33&#39;
alias grep=&#39;grep --color=auto&#39; 
# Fin
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
La referencia la encontré aquí: &lt;a href=&quot;http://stackoverflow.com/questions/820517/bashrc-at-ssh-login&quot; target=&quot;_blank&quot;&gt;http://stackoverflow.com/questions/820517/bashrc-at-ssh-login&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
Espero que les sea de utilidad.
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/7037038085778702828/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/como-crear-un-shell-bashrc-con-servidores-linux-1and1-business-package.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7037038085778702828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7037038085778702828'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/05/como-crear-un-shell-bashrc-con-servidores-linux-1and1-business-package.html' title='Cómo crear un shell .bashrc con servidores Linux de 1and1 Business Package'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-8383363439529041109</id><published>2013-04-15T18:44:00.000-05:00</published><updated>2013-04-15T18:44:18.446-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="buscar"/><category scheme="http://www.blogger.com/atom/ns#" term="grep"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="subdirectorios"/><category scheme="http://www.blogger.com/atom/ns#" term="tipo de archivos"/><title type='text'>Cómo buscar con grep en subdirectorios y en cierto tipo de archivos</title><content type='html'>Sencillo pero útil comando para buscar cadenas dentro de archivos, pero de manera recursiva y para cierto tipo de archivos.

&lt;pre class=&quot;brush:shell;&quot;&gt;
grep -rnHI &#39;getMedicalSpecialties&#39; --include=&#39;*.java&#39; --include=&#39;*.php&#39; --include=&#39;*.class&#39; .
&lt;/pre&gt;

Espero les haya sido de utilidad.</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/8383363439529041109/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/04/como-buscar-con-grep-en-subdirectorios-y-en-cierto-tipo-de-archivos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8383363439529041109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8383363439529041109'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/04/como-buscar-con-grep-en-subdirectorios-y-en-cierto-tipo-de-archivos.html' title='Cómo buscar con grep en subdirectorios y en cierto tipo de archivos'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-6041923224786264926</id><published>2013-04-14T16:16:00.001-05:00</published><updated>2013-04-14T16:16:41.486-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CodeIgniter"/><category scheme="http://www.blogger.com/atom/ns#" term="como"/><category scheme="http://www.blogger.com/atom/ns#" term="config"/><category scheme="http://www.blogger.com/atom/ns#" term="controlador"/><category scheme="http://www.blogger.com/atom/ns#" term="controller"/><category scheme="http://www.blogger.com/atom/ns#" term="helper"/><category scheme="http://www.blogger.com/atom/ns#" term="item"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="view"/><category scheme="http://www.blogger.com/atom/ns#" term="vista"/><title type='text'>Cómo llamar un &quot;config item&quot; dentro de un helper en CodeIgniter</title><content type='html'>Este sencillo pero útil &quot;tip&quot; te va a ayudar a llamar un elemento de configuración (config item) desde un helper, una vista, un modelo, o algún otro tipo de archivo php que no sea un controlador (controller).

Como sabemos y tal como la documentación de CodeIgniter lo indica, un config item se llama de la siguiente manera:
&lt;pre class=&quot;brush:php;&quot;&gt;
$xss_conf = $this-&gt;config-&gt;item(&#39;global_xss_filtering&#39;);
&lt;/pre&gt;
Pero, si hacemos esto en algún otro archivo php tal como una vista o un helper, recibiremos un error como éste:
&lt;pre style=&quot;color:red;&quot;&gt;
Fatal error: Using $this when not in object context in translate_helper.php on line 31
&lt;/pre&gt;
Lo que debes hacer es usar la siguiente sintaxis:
&lt;pre class=&quot;brush:php;&quot;&gt;
$ci =&amp; get_instance();
$xss_conf = $ci-&gt;config-&gt;item(&#39;global_xss_filtering&#39;);
&lt;/pre&gt;
&lt;b&gt;Pero mejor aún, de una manera más sencilla, puedes usar:&lt;/b&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$xss_conf = config_item(&#39;global_xss_filtering&#39;);
&lt;/pre&gt;
&lt;p&gt;
Espero que les haya sido de mucha utilidad como a mí.
&lt;/p&gt;
&lt;p&gt;
La referencia a este tip está en: &lt;a href=&quot;http://ellislab.com/forums/viewthread/130472/#643868&quot; target=&quot;_blank&quot;&gt;http://ellislab.com/forums/viewthread/130472/#643868&lt;/a&gt;
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/6041923224786264926/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/04/como-llamar-un-config-item-dentro-de-un-helper-en-codeigniter.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/6041923224786264926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/6041923224786264926'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/04/como-llamar-un-config-item-dentro-de-un-helper-en-codeigniter.html' title='Cómo llamar un &quot;config item&quot; dentro de un helper en CodeIgniter'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-5144880491077811400</id><published>2013-03-29T16:28:00.000-06:00</published><updated>2013-03-29T16:37:31.915-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="como implementar"/><category scheme="http://www.blogger.com/atom/ns#" term="ejemplo"/><category scheme="http://www.blogger.com/atom/ns#" term="getInstance()"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="singleton"/><title type='text'>Cómo implementar el patrón de diseño Singleton en PHP</title><content type='html'>El patrón de diseño Singleton es creado para asegurarse de tener solamente una instancia de un objeto durante la ejecución de un hilo en un proceso determinado. Un ejemplo típico de esto es tener una instancia del objeto de conexión a la base de datos. Para mayores referencias sobre este patrón de diseño, pueden &lt;a href=&quot;http://es.wikipedia.org/wiki/Singleton&quot;&gt;ir a la wikipedia&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Bien, me voy a enfocar a explicar cómo implementarlo en php, el cual con esta ténica es soportada a partir de php 5.0+ pues en versiones anteriores el manejo de ciertos métodos mágicos no funcionaría.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: php&quot;&gt;
&amp;lt;?php

/**
 * Description of Singleton
 *
 * @author Ultiminio Ramos
 */
class Singleton
{

    private static $instancia;
    private $_contador;

    /**
     * Declaramos private el método constructor, para evitar acceder a él cada vez
     * que se realiza la instanciación de esta clase
     */
    private function __construct()
    {
        echo &#39;Se ha instanciado una clase (&amp;lt;code style=&quot;color: blue; font-weight: bolder;&quot;&gt;&#39; . __CLASS__ . &quot;&amp;lt;/code&gt;)&amp;lt; br/&gt;&quot;;

        $this-&gt;_contador = 0;
    }

    /**
     * Punto global de acceso a la clase, pues el método constructor lo hemos
     * declarado como private para asegurarnos de que no se puede acceder a él
     * sino solamente por medio de este método llamado getInstance()
     * 
     * @return object
     */
    public static function getInstance()
    {
        if (!self::$instancia instanceof self) {
            self::$instancia = new self;
        }

        return self::$instancia;
    }

    /**
     * Método público que ya es accesible desde un objeto instanciado
     */
    public function incrementar()
    {
        return ++$this-&gt;_contador;
    }

    /**
     * Método público que ya es accesible desde un objeto instanciado
     */
    public function disminuir()
    {
        return --$this-&gt;_contador;
    }

    /**
     * Método mágico que nos permite gestionar la clonación y evitar que se rompa
     * el patrón singleton
     */
    public function __clone()
    {
        $error_msg = &#39;No se permite la clonación dentro del patrón singleton&#39;;
        $error_msg.= &#39;(&amp;lt;code style=&quot;color: blue;&quot;&gt;&#39; . get_class($this) . &#39;&amp;lt;/code&gt;)&#39;;

        //trigger_error($error_msg, E_USER_NOTICE); # mandamos un mensaje, pero la ejecución no se interrumpe
        trigger_error($error_msg, E_USER_ERROR); # interrumpimos la ejecución
    }

    /**
     * Método mágico para gestionar la serialización y por consiguiente 
     * evitar romper el patrón singleton
     */
    public function __wakeup()
    {
        $error_msg = &#39;No se permite la serialización dentro del patrón singleton&#39;;
        $error_msg.= &#39;(&amp;lt;code style=&quot;color: blue;&quot;&gt;&#39; . get_class($this) . &#39;&amp;lt;/code&gt;)&#39;;

        trigger_error($error_msg, E_USER_ERROR); # interrumpimos la ejecución
    }

}
&lt;/pre&gt;
&lt;p&gt;Ahora, es momento de probar nuestro patrón de diseño.&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;
&amp;lt;!DOCTYPE html&gt;
&amp;lt;html&gt;
    &amp;lt;head&gt;
        &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;
        &amp;lt;title&gt;Probar el patrón Singleton en PHP 5.0+&amp;lt;/title&gt;
    &amp;lt;/head&gt;
    &amp;lt;body&gt;
        &amp;lt;?php
        include_once &#39;app/test_singleton/model/Singleton.php&#39;;

        $br = &#39;&amp;lt; br/&gt;&#39;; 

        $instancia = Singleton::getInstance();
        echo &#39;&amp;lt;pre&gt;&#39;;
        echo &#39;instancia(++$i) = &#39; . $instancia-&gt;incrementar() . $br;
        echo &#39;instancia(++$i) = &#39; . $instancia-&gt;incrementar() . $br;
        echo &#39;instancia(++$i) = &#39; . $instancia-&gt;incrementar() . $br;
        echo &#39;instancia(++$i) = &#39; . $instancia-&gt;incrementar() . $br;
        echo &#39;instancia(++$i) = &#39; . ($instancia-&gt;incrementar()) . $br;
        echo &#39;&amp;lt;hr/&gt;&#39;;

        # probar la clonación como técnica para romper el patrón singleton
        $clone = clone($instancia);

        echo &#39;clone_instancia(--$i) = &#39; . $clone-&gt;disminuir() . $br;
        echo &#39;clone_instancia(--$i) = &#39; . $clone-&gt;disminuir() . $br;
        echo &#39;clone_instancia(++$i) = &#39; . $clone-&gt;incrementar() . $br;
        echo &#39;clone_instancia(++$i) = &#39; . $clone-&gt;incrementar() . $br;
        echo &#39;clone_instancia(++$i) = &#39; . $clone-&gt;incrementar() . $br;
        echo &#39;clone_instancia(++$i) = &#39; . $clone-&gt;incrementar() . $br;
        echo &#39;clone_instancia(++$i) = &#39; . $clone-&gt;incrementar() . $br;
        echo &#39;clone_instancia(++$i) = &#39; . $clone-&gt;incrementar() . $br;
        echo &#39;clone_instancia(++$i) = &#39; . $clone-&gt;incrementar() . $br;
   
        # probar la serialización/deserialización como técnica para romper el patrón singleton
        $serializado = serialize($instancia);
        $unserializa = unserialize($serializado);
        echo &#39;$unserializa(++$i) = &#39; . $unserializa-&gt;incrementar() . $br;
        echo &#39;$unserializa(++$i) = &#39; . $unserializa-&gt;incrementar() . $br;
        echo &#39;$unserializa(++$i) = &#39; . $unserializa-&gt;incrementar() . $br;
        echo &#39;$unserializa(++$i) = &#39; . $unserializa-&gt;incrementar() . $br;

        # comprobación
        echo &#39;.&#39; . $br;
        echo &#39;.&#39; . $br;
        echo &#39;.&#39; . $br;

        echo &#39;instancia(++$i) = &#39; . $instancia-&gt;incrementar() . $br;

        echo &#39;&amp;lt;/pre&gt;&#39;;
        ?&gt;
    &amp;lt;/body&gt;
&amp;lt;/html&gt;
&lt;/pre&gt;
&lt;p&gt;Espero les sirva el ejemplo, y como dijeran los gringos: &quot;happy conding&quot;&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/5144880491077811400/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/03/como-implementar-el-patron-de-diseno-singleton-en-php.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/5144880491077811400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/5144880491077811400'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/03/como-implementar-el-patron-de-diseno-singleton-en-php.html' title='Cómo implementar el patrón de diseño Singleton en PHP'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-837248092875441106</id><published>2013-02-20T12:56:00.000-06:00</published><updated>2013-02-20T17:59:57.098-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="address"/><category scheme="http://www.blogger.com/atom/ns#" term="email"/><category scheme="http://www.blogger.com/atom/ns#" term="expresiones regulares"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="preg_match"/><category scheme="http://www.blogger.com/atom/ns#" term="validar email"/><title type='text'>Validar email con expresiones regulares en PHP</title><content type='html'>&lt;h3&gt;
Hay en la web diferentes expresiones regulares que validan direcciones de correo electrónico, pero tienen huecos, así que les paso una muy buena y robusta, que encontré en un software que se llama Expresso (&lt;a href=&quot;http://www.ultrapico.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://www.ultrapico.com&lt;/a&gt;) y se las comparto a ustedes. La aplico en PHP pero como saben pueden usarla en Javascript y cualquier otro lenguaje.&lt;/h3&gt;
&lt;br /&gt;
Débiles expresiones regulares que encontré en la web, que permiten pasar direcciones como: &lt;code style=&quot;color:red;&quot;&gt;uramos@gmail&lt;/code&gt;, &lt;code style=&quot;color:red;&quot;&gt;uramos@gmail.&lt;/code&gt;, &lt;code style=&quot;color:red;&quot;&gt;uramos@gmail.com.&lt;/code&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
preg_match(&quot;^([a-z0-9_-])+([\.a-z0-9_-])*@([a-z0-9-])+(\.[a-z0-9-]+)*\.([a-z]{2,6})$&quot;, $email);&lt;br /&gt;
preg_match(&quot;/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/&quot;, $email);&lt;br /&gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;Verdadera expresión regular que valida direcciones de correo&lt;/strong&gt;:&lt;br /&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
function validarEmailAddress($email)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; // Regresa 1 si la cadena hace match&lt;br /&gt;
&amp;nbsp;&amp;nbsp; // Regresa 0 si no hace match&lt;br /&gt;
&amp;nbsp;&amp;nbsp; // Regresa FALSE si hubo un error &lt;br /&gt;
&amp;nbsp;&amp;nbsp; return preg_match(&quot;/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})+$/&quot;, $email);&lt;br /&gt;}&lt;br /&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;strong&gt;Las funciones de PHP ereg() y eregi() son obsoletas y quedarán fuera desde la versión 5.3, por eso usamos preg_match()&lt;/strong&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/837248092875441106/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/validar-email-con-expresiones-regulares-php.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/837248092875441106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/837248092875441106'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/validar-email-con-expresiones-regulares-php.html' title='Validar email con expresiones regulares en PHP'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-7700890791070973000</id><published>2013-02-19T11:45:00.000-06:00</published><updated>2013-02-19T11:51:17.731-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="checkbox"/><category scheme="http://www.blogger.com/atom/ns#" term="checked"/><category scheme="http://www.blogger.com/atom/ns#" term="each()"/><category scheme="http://www.blogger.com/atom/ns#" term="input"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="prop()"/><category scheme="http://www.blogger.com/atom/ns#" term="verificar"/><title type='text'>Verificar un checkbox con jQuery</title><content type='html'>Para saber si un campo de formulario tipo checkbox está seleccionado o no, usando jQuery.&lt;br /&gt;
&lt;br /&gt;
Lo primero es que es &lt;b&gt;indispensable &lt;/b&gt;que el campo tenga el atributo checked (yo sé que parece obvio pero a veces los errores al escribir código están en detalles como éste):&lt;br /&gt;
&lt;pre class=&quot;brush:html;&quot;&gt;
&amp;lt;input name=&quot;recordarme&quot; class=&quot;rem_me&quot; type=&quot;checkbox&quot; value=&quot;1&quot; checked=&quot;checked&quot; /&amp;gt;&lt;br /&gt;
&lt;/pre&gt;
Ahora te muestro las diferentes posibilidades de poder verificar es estado de un campo checkbox usando jQuery:&lt;br /&gt;
&lt;pre class=&quot;brush:javascript;&quot;&gt;
$(&#39;.rem_me&#39;).click(function(e){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 1. usando el método attr
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // va a regresar lo que está dentro de las comillas del atributo checked
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // (algunos programadores todavía ponen checked=&quot;true&quot; en lugar de checked=&quot;checked&quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert($(&#39;.rem_me&#39;).attr(&#39;checked&#39;));
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 2. usando el método prop (a partir de jQuery 1.6)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // este método regresa true o false
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert($(&#39;.rem_me&#39;).prop(&#39;checked&#39;));&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 3. usando el método is para filtrar las propiedades del elemento input
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // este método regresa true o false
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert($(&#39;.rem_me&#39;).is(&#39;:checked&#39;));
&lt;br /&gt;
});
&lt;br /&gt;
// 4. finalmente, para verificar un conjunto de inputs de tipo chekbox:&lt;br /&gt;&amp;nbsp;$(&quot;input[type=checkbox][checked]&quot;).each( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (true === $(this).is(&#39;:checked&#39;)) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // tu código aquí en caso de estar seleccionado&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // tu código aquí en caso de no estar seleccionado&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
});
&lt;/pre&gt;
&lt;br /&gt;
Espero que les sea de utilidad.</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/7700890791070973000/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/verificar-un-checkbox-con-jquery.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7700890791070973000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7700890791070973000'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/verificar-un-checkbox-con-jquery.html' title='Verificar un checkbox con jQuery'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-9782127966906734</id><published>2013-02-15T21:26:00.000-06:00</published><updated>2013-02-15T21:37:22.292-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="calendario"/><category scheme="http://www.blogger.com/atom/ns#" term="componente"/><category scheme="http://www.blogger.com/atom/ns#" term="datepicker"/><category scheme="http://www.blogger.com/atom/ns#" term="español"/><category scheme="http://www.blogger.com/atom/ns#" term="fecha"/><category scheme="http://www.blogger.com/atom/ns#" term="idioma"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="mexicano"/><category scheme="http://www.blogger.com/atom/ns#" term="mostrar"/><category scheme="http://www.blogger.com/atom/ns#" term="seleccionar"/><category scheme="http://www.blogger.com/atom/ns#" term="ui"/><title type='text'>jQuery: Mostrar componente datepicker en español mexicano</title><content type='html'>Te paso el archivo regional para el idioma español regionalizado para México (aunque en general sirve para el castellano de todos los paises de america látina e incluso de españa).&lt;br /&gt;
&lt;br /&gt;
Para este post, tengo el supuesto de que tienes los conocimientos previos de cómo implementar el componente datepicker del framework de jQuery UI.&lt;br /&gt;
&lt;br /&gt;
Bueno, entonces el archivo lo puedes descargar de esta liga: &lt;a href=&quot;http://ultiminioramos.com/recursos/blogger/jQuery/jQuery.UI/ui.datepicker-es-MX.js&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ui.datepicker-es-MX.js&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora un ejemplo de cómo implementarlo:&lt;br /&gt;
&lt;pre class=&quot;brush:html;&quot;&gt;
&amp;lt;!doctype html&gt;
 
&amp;lt;html lang=&quot;en&quot;&gt;
&amp;lt;head&gt;
  &amp;lt;meta charset=&quot;utf-8&quot; /&gt;
  &amp;lt;title&gt;jQuery UI Datepicker - Ejemplo de regionalización al español&amp;lt;/title&gt;
  &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;http://code.jquery.com/ui/1.10.1/themes/base/jquery-ui.css&quot; /&gt;
  &amp;lt;script src=&quot;http://code.jquery.com/jquery-1.9.1.js&quot;&gt;&amp;lt;/script&gt;
  &amp;lt;script src=&quot;http://code.jquery.com/ui/1.10.1/jquery-ui.js&quot;&gt;&amp;lt;/script&gt;
  &amp;lt;script src=&quot;ui.datepicker-es-MX.js&quot;&gt;&amp;lt;/script&gt;
  &amp;lt;script&gt;
  $(function() {
    $.datepicker.setDefaults($.datepicker.regional[&#39;es-MX&#39;]);
    $(&#39;#input_campo_date&#39;).datepicker({
                        &#39;setDate&#39;: &#39;25/02/2013&#39;
                        , altField: &#39;#fecha_texto&#39;
                        , altFormat: &quot;DD, d &#39;de&#39; MM &#39;de&#39; yy&quot;
                    });
  });
  &amp;lt;/script&gt;
&amp;lt;/head&gt;
&amp;lt;body&gt;
 
&amp;lt;p&gt;Fecha: &amp;lt;input type=&quot;text&quot; id=&quot;input_campo_date&quot; /&gt;&amp;nbsp;&amp;lt;input type=&quot;text&quot; id=&quot;fecha_texto&quot; size=&quot;40&quot; /&gt;&amp;lt;/p&gt;

&amp;lt;/body&gt;
&amp;lt;/html&gt;
&lt;/pre&gt;
Para mayores referencias sobre la documentación, ir a:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.jquery.com/UI/Datepicker/Localization&quot; target=&quot;_blank&quot;&gt;Documentación de jQuery UI para datepicker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jqueryui.com/datepicker/&quot; target=&quot;_blank&quot;&gt;Ejemplos de jQuery UI para datepicker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Espero que les sea de utilidad.</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/9782127966906734/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/jquery-mostrar-componente-datepicker-mexicano-castellano.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/9782127966906734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/9782127966906734'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/jquery-mostrar-componente-datepicker-mexicano-castellano.html' title='jQuery: Mostrar componente datepicker en español mexicano'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-4189349500495155938</id><published>2013-02-14T16:25:00.000-06:00</published><updated>2013-02-14T16:25:29.401-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="http"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="redireccionamiento"/><category scheme="http://www.blogger.com/atom/ns#" term="redireccionar"/><category scheme="http://www.blogger.com/atom/ns#" term="window.location"/><category scheme="http://www.blogger.com/atom/ns#" term="window.location.href"/><category scheme="http://www.blogger.com/atom/ns#" term="window.location.replace"/><title type='text'>¿Cómo hacer un redireccionamiento con jQuery o Javascript?</title><content type='html'>Para direccionar o redireccionar una página a otra. Se puede hacer con Javascript directamente o bien con jQuery.&lt;br /&gt;
&lt;br /&gt;
En Javascript existen 2 funciones para esto:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;window.location.replace&lt;/span&gt; la cual es similar a hacer un HTTP redirect&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;window.location.href&lt;/span&gt; es como hacer clic en un link&lt;/li&gt;
&lt;/ol&gt;
De tal manera que:&lt;br /&gt;
&lt;pre class=&quot;brush:javascript;&quot;&gt;
// hacer un redireccionamiento HTTP con Javascript
window.location.replace(&#39;http://ultiminioramos.com&#39;);
window.location = &#39;http://ultiminioramos.com&#39;;

// hacer un direccionamiento con Javascript que se agregue al historial del navegador
window.location.href = &#39;http://ultiminioramos.com&#39;;

// hacer un redireccionamiento HTTP con jQuery
$(window).attr(&#39;location&#39;, &#39;http://ultiminioramos.com&#39;);
jQuery(window).attr(&#39;location&#39;, &#39;http://ultiminioramos.com&#39;);

// hacer un direccionamiento con jQuery que se agregue al historial del navegador
$(location).attr(&#39;href&#39;, &#39;http://ultiminioramos.com&#39;);
jQuery(location).attr(&#39;href&#39;, &#39;http://ultiminioramos.com&#39;);
&lt;/pre&gt;
Espero les sea de utilidad.</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/4189349500495155938/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/como-hacer-un-redireccionamiento-javascript-jquery.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/4189349500495155938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/4189349500495155938'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/como-hacer-un-redireccionamiento-javascript-jquery.html' title='¿Cómo hacer un redireccionamiento con jQuery o Javascript?'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-6497660048587619953</id><published>2013-02-14T15:40:00.001-06:00</published><updated>2013-02-14T15:40:10.696-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Enabled WSDL Cache"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="magento"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="SOAP"/><category scheme="http://www.blogger.com/atom/ns#" term="web services"/><category scheme="http://www.blogger.com/atom/ns#" term="WSDL"/><title type='text'>Magento: WSDL, limpiar los archivos del caché de PHP</title><content type='html'>&lt;b&gt;&lt;span style=&quot;color: red;&quot;&gt;Problema&lt;/span&gt;: &lt;/b&gt;Durante el desarrollo y exposición de Web services desde Magento usando SOAP, he tenido que prender y apagar el setting de &quot;Enable WSDL Cache&quot;, y a veces, no actualiza los cambios realizados a las estructuras de datos definidos en los archivos wsdl.xml.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;Solución&lt;/span&gt;: &lt;/b&gt;Eliminar los archivos temporales que PHP genera para el manejo de caché del archivo WSDL, así que:&lt;br /&gt;
&lt;br /&gt;
Acceder a la carpeta temporal de tu servidor (linux), y eliminar los archivos temporales de wsdl:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:shell&quot;&gt;cd /tmp
ls wsdl-* -l
rm wsdl-*
&lt;/pre&gt;
&lt;br /&gt;
Listo, eso es todo.&lt;br /&gt;
&lt;br /&gt;
Como beneficio adicional, seguramente esta acción evitará falsos errores de SOAP como:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Invalid API path&lt;/span&gt;&lt;/li&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;/span&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Is not a valid method&lt;/span&gt;&lt;/li&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;
&lt;/span&gt;
&lt;li&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Resource path not callable&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/6497660048587619953/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/magento-soap-wsdl-limpiar-archivos-cache-php.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/6497660048587619953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/6497660048587619953'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/magento-soap-wsdl-limpiar-archivos-cache-php.html' title='Magento: WSDL, limpiar los archivos del caché de PHP'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-7283244941615164701</id><published>2013-02-13T17:27:00.001-06:00</published><updated>2013-02-13T17:27:39.006-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="api"/><category scheme="http://www.blogger.com/atom/ns#" term="Enabled WSDL Cache"/><category scheme="http://www.blogger.com/atom/ns#" term="magento"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="SOAP"/><category scheme="http://www.blogger.com/atom/ns#" term="SoapServer"/><category scheme="http://www.blogger.com/atom/ns#" term="v2"/><category scheme="http://www.blogger.com/atom/ns#" term="WSDL"/><title type='text'>Magento: SOAP V2, mejorar el tiempo de respuesta</title><content type='html'>Hay muchas razones por las que una petición a un web service usando SOAP V2 puede tomar mucho tiempo,
    pero la primera cosa que pienso es revisar la configuración para activar la caché en la construcción del archivo WSDL.
    Cuando se hace una llamada a la API de Magento, Magento usa el objecto SoapServer de PHP. El objeto SoapServer necesita
    obtener su propio archivo WSDL para poder funcionar, y la generación y extracción de este archivo puede consumir mucho tiempo.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
La solución para esto es habilitar el manejo de caché para el archivo WSDL, que por defecto viene apagado en Magento.&amp;nbsp;&lt;/h3&gt;
&lt;br /&gt;
Acceder al backend de Magento, luego a &lt;code&gt;System-&amp;gt;Configuration-&amp;gt;Magento Core API&lt;/code&gt;&lt;br /&gt;
Busca el rubro &quot;Enabled WSDL Cache&quot; y cámbialo a Yes.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRAx3kaHCqk59vN68Ozogcuk0kUrj7LdvbM0CRgH4ROgusaQ2iF867pyfjIhCDUA4thEevpEN_1tw-CI9MISPykSaT8Vgo5rVzsnq4LW1Z-e3xKW75avdQ_dTOhSCZw-QgA4XP-MJb93zt/s1600/magento-enabled-wsdl-cache.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;187&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRAx3kaHCqk59vN68Ozogcuk0kUrj7LdvbM0CRgH4ROgusaQ2iF867pyfjIhCDUA4thEevpEN_1tw-CI9MISPykSaT8Vgo5rVzsnq4LW1Z-e3xKW75avdQ_dTOhSCZw-QgA4XP-MJb93zt/s640/magento-enabled-wsdl-cache.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Haciendo esto, mejorarás notablemente el tiempo de respuesta de las llamadas a la API, aclaro que esto funciona a partir de la versión 
    1.6 de Magento usando SOAP V2, para versiones anteriores hay una solución en este link:
    &lt;a href=&quot;http://www.ivoronline.com/Coding/Languages/PHP/Tutorials/PHP%20-%20API%20-%20SOAP%20Extension%20-%20Introduction.php&quot; target=&quot;_blank&quot;&gt;http://www.ivoronline.com/Coding/Languages/PHP/Tutorials/PHP - API - SOAP - Extension - Introduction.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Este parámetro no existe en versiones anteriores a 1.6 de Magento, pero también existe una extensión comercial hecha por &lt;a href=&quot;http://alanstorm.com/category/magento&quot; target=&quot;_blank&quot;&gt;Alan Storm&lt;/a&gt;, y se llama 
    &quot;&lt;a href=&quot;http://store.pulsestorm.net/products/mercury-api&quot; target=&quot;_blank&quot;&gt;Mercury API Extension&lt;/a&gt;&quot;. Aunque también se puede mirar la clase &lt;code&gt;Mage_Api_Model_Server_Adapter_Soap&lt;/code&gt; donde las versiones
    anteriores de Magento deshabilitan esta caché.&lt;br /&gt;
&lt;br /&gt;
Esta solución fue tomada de &lt;a href=&quot;http://alanstorm.com/category/magento&quot; target=&quot;_blank&quot;&gt;Alan Storm&lt;/a&gt; desde &lt;a href=&quot;http://stackoverflow.com/questions/14284671/magento-soap-v1-vs-v2-performance&quot; target=&quot;_blank&quot;&gt;Stackoverflow.com&lt;/a&gt; </content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/7283244941615164701/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/magento-soap-v2-mejorar-el-tiempo-de.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7283244941615164701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/7283244941615164701'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2013/02/magento-soap-v2-mejorar-el-tiempo-de.html' title='Magento: SOAP V2, mejorar el tiempo de respuesta'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRAx3kaHCqk59vN68Ozogcuk0kUrj7LdvbM0CRgH4ROgusaQ2iF867pyfjIhCDUA4thEevpEN_1tw-CI9MISPykSaT8Vgo5rVzsnq4LW1Z-e3xKW75avdQ_dTOhSCZw-QgA4XP-MJb93zt/s72-c/magento-enabled-wsdl-cache.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-2778323848991056031</id><published>2012-09-26T15:43:00.001-05:00</published><updated>2012-09-26T15:43:01.289-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="grant"/><category scheme="http://www.blogger.com/atom/ns#" term="LG-E510"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="micro sd"/><category scheme="http://www.blogger.com/atom/ns#" term="root"/><category scheme="http://www.blogger.com/atom/ns#" term="rootear"/><category scheme="http://www.blogger.com/atom/ns#" term="unlockroot"/><title type='text'>Android: Cómo &quot;rootear&quot; tu sistema</title><content type='html'>Hay que saber que los smartphones y las tablets que usan sistema operativo Android, están basados en linux, por lo tanto, el superusuario root viene bloqueado de fábrica.&lt;br /&gt;
&lt;br /&gt;
Por diversas razones queremos hacer uso de este usuario en nuestro teléfono, en mi caso, tuve la necesidad de linkear aplicaciones y widgets a la memoria micro SD, para que no me consumiera el poco espacio de mi memoria interna, de tal manera que lo logré y ahora puedo instalar todas las aplicaciones que quiero.&lt;br /&gt;
&lt;br /&gt;
Bueno, pues los pasos son bien sencillos:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Descargar el programa unlockroot.exe, este lo vas a encontrar desde su sitio web: &lt;a href=&quot;http://www.unlockroot.com/&quot; target=&quot;_blank&quot;&gt;www.unlockroot.com&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Instalar el programa en tu computadora y después ejecutarlo
&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL6SdY0NutaSj_rEYAtMvSfP0Ql17ZbTB1H-Qk5WBv_3XPKBndT7vat0J0WnoJOQLHsEUMZHFG_C4BHDvd4rF5XmnJfzGmvTQ_6a8La4N9tk-U9oDa5EiOsP1iTRszp1WyfRYcWcX_4BVF/s1600/unlockroot.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;384&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL6SdY0NutaSj_rEYAtMvSfP0Ql17ZbTB1H-Qk5WBv_3XPKBndT7vat0J0WnoJOQLHsEUMZHFG_C4BHDvd4rF5XmnJfzGmvTQ_6a8La4N9tk-U9oDa5EiOsP1iTRszp1WyfRYcWcX_4BVF/s640/unlockroot.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Como dicen las instrucciones, conectar tu smartphone o table por el puerto USB y en el smartphone o tablet ir a la configuración y habilitar la opción de &quot;USB debugging&quot;. En mi smartphone con Android 2.3.4, la opción se encuentra en Settings &amp;gt;&amp;gt;&amp;nbsp; Application &amp;gt;&amp;gt; Development &amp;gt;&amp;gt; USB debugging (en español sería: Ajustes &amp;gt;&amp;gt; Aplicaciones &amp;gt;&amp;gt; Desarrollo &amp;gt;&amp;gt; Depuración de USB)&lt;/li&gt;
&lt;li&gt;Para mayor claridad pongo este link: &lt;a href=&quot;http://www.unlockroot.com/guide/guide.htm&quot; target=&quot;_blank&quot;&gt;www.unlockroot.com/guide/guide.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Una vez activado, puedes hacer clic en &quot;Root&quot;, una vez hecho esto, va a autodetectar tu dispositivo.&lt;/li&gt;
&lt;li&gt;Haz clic el botón que muestra el nombre de tu dispositivo.&lt;/li&gt;
&lt;li&gt;El programa va a desbloquear el usuario root de tu dispositivo (smartphone o tablet), además de que va a instalar una app que se llama &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.noshufou.android.su&quot; target=&quot;_blank&quot;&gt;Superuser.apk&lt;/a&gt;, la cual va a funcionar como un &quot;hook&quot; (gancho) que va a otorgar (grant) permisos de root cuando sea necesario de manera automática.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;A lo largo de la instalación te va a preguntar si deseas instalar otras apps como ahorrar batería, pero ya es decisión tuya si deseas instalarla o no.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Al final, te indica si deseas reiniciar tu dispositivo, lo cual es recomendable para que entonces ya puedas funcionar como usuario root cuando sea necesario de manera automática.&lt;/li&gt;
&lt;li&gt;A mi me funcionó con un LG-E510g, pero hay un montón de dispositivos soportados.&lt;/li&gt;
&lt;li&gt;Cuan do ya hayas hecho lo que necesitabas como usuario root, no olvides desactivar la opción nde &quot;USB debugging&quot; (&quot;Depuración de USB&quot; en español) .&lt;/li&gt;
&lt;/ol&gt;
Espero que te haya servido esta solución como a mi me sirvió. &lt;br /&gt;
&lt;ol&gt;
&lt;/ol&gt;
</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/2778323848991056031/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2012/09/android-como-rootear-tu-sistema.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/2778323848991056031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/2778323848991056031'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2012/09/android-como-rootear-tu-sistema.html' title='Android: Cómo &quot;rootear&quot; tu sistema'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL6SdY0NutaSj_rEYAtMvSfP0Ql17ZbTB1H-Qk5WBv_3XPKBndT7vat0J0WnoJOQLHsEUMZHFG_C4BHDvd4rF5XmnJfzGmvTQ_6a8La4N9tk-U9oDa5EiOsP1iTRszp1WyfRYcWcX_4BVF/s72-c/unlockroot.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-739199060182813141</id><published>2012-08-28T13:53:00.000-05:00</published><updated>2012-08-28T16:19:27.254-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="constantes"/><category scheme="http://www.blogger.com/atom/ns#" term="custom variables"/><category scheme="http://www.blogger.com/atom/ns#" term="display_errors"/><category scheme="http://www.blogger.com/atom/ns#" term="getModel"/><category scheme="http://www.blogger.com/atom/ns#" term="ini_set"/><category scheme="http://www.blogger.com/atom/ns#" term="loadByCode"/><category scheme="http://www.blogger.com/atom/ns#" term="magento"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><title type='text'>Magento: Cómo crear/usar variables globales</title><content type='html'>&lt;p&gt;
A partir de Magento 1.4 se pueden usar las variables personalizadas, o si lo quieres ver de otra manera &quot;constantes&quot; que pueden ser usadas a lo largo de tu código en Magento.
&lt;/p&gt;
&lt;p&gt;
En este caso, voy a ejemplificarlo con el uso de una variable que me es muy útil para controlar el uso de la directiva &lt;code&gt;display_errors&lt;/code&gt; de php.ini para los entornos de desarrollo/producción
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Paso 1:&lt;/b&gt;&lt;br/&gt;
&lt;p&gt;Acceder al backend de Magento, luego a &lt;code&gt;System-&gt;Custom Variables&lt;/code&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;b&gt;Paso 2:&lt;/b&gt;&lt;br/&gt;
Agregar una nueva variable. En el formulario ingresar los datos: 
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Variable Code&lt;/b&gt;. Aquí va el nombre de la variable, lo recomendable es nombrar una variable de acuerdo a la sintaxis de php (pero sin el signo de $)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Variable Name&lt;/b&gt;. Aquí se debe poner la descripción de la variable&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Variable HTML Value&lt;/b&gt;. Opcional, se puede usar este campo que permite tags de HTML o usar el campo de abajo o ambos, y decidir en tu programación cual de los dos valores quieres que te retorne: el valor HTML o el valor de texto plano&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Variable Plain Value&lt;/b&gt;. Colocar el valor que se desea, pero aquí no se acepta código HTML&lt;/li&gt;
&lt;/ul&gt;
Guardar los datos. Ahora vayamos al código para saber cómo usar esta nueva variable.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaec_0oM8nRoEgvqcMcowRNg7uspiPQBO7UCE1L-suscOjzHuyPebraeeT-6UMwdxd4fFgkYjSAiOS9kaP07v6g4QcicxMTZzerNx7ohbi8fudqdyfonXDf6VN8IFtAuV5Jv7VxERBnqbS/s1600/custom_variable.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaec_0oM8nRoEgvqcMcowRNg7uspiPQBO7UCE1L-suscOjzHuyPebraeeT-6UMwdxd4fFgkYjSAiOS9kaP07v6g4QcicxMTZzerNx7ohbi8fudqdyfonXDf6VN8IFtAuV5Jv7VxERBnqbS/s400/custom_variable.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;b&gt;Paso 3:&lt;/b&gt;&lt;br/&gt;
Usar el siguiente código:
&lt;p&gt;
&lt;pre class=&quot;brush: php;&quot;&gt;
// por default, el tipo de datos es un string
$objVar = Mage::getModel(&#39;core/variable&#39;)-&gt;loadByCode(&#39;display_errors&#39;);
$display_errors = $objVar-&gt;getValue(&#39;plain&#39;);
ini_set(&#39;display_errors&#39;, $display_errors);

// pero puedes explícitamente cambiar el tipo:
$display_errors = (int) $objVar-&gt;getValue(&#39;plain&#39;);
ini_set(&#39;display_errors&#39;, $display_errors);

// booleano:
$display_errors = (boolean) $objVar-&gt;getValue(&#39;plain&#39;);
ini_set(&#39;display_errors&#39;, $display_errors);

// de punto flotante:
$display_errors = (double) $objVar-&gt;getValue(&#39;plain&#39;);
ini_set(&#39;display_errors&#39;, $display_errors);
&lt;/pre&gt;
Para este ejemplo, todos los tipos de datos son válidos para la directiva &lt;b&gt;ini_set(&#39;display_errors&#39;,&lt;/b&gt; &lt;code&gt;string|int|bool|double&lt;/code&gt;)
&lt;/p&gt;
&lt;p&gt;
Y como te imaginarás, en el método &lt;code&gt;getValue()&lt;/code&gt; puedes poner &lt;b&gt;&#39;html&#39;&lt;/b&gt; en lugar de &lt;b&gt;&#39;plain&#39;&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
Espero que te sea de utilidad y como dicen los gringos: Happy coding!
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/739199060182813141/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2012/08/magento-como-crearusar-variables.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/739199060182813141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/739199060182813141'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2012/08/magento-como-crearusar-variables.html' title='Magento: Cómo crear/usar variables globales'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaec_0oM8nRoEgvqcMcowRNg7uspiPQBO7UCE1L-suscOjzHuyPebraeeT-6UMwdxd4fFgkYjSAiOS9kaP07v6g4QcicxMTZzerNx7ohbi8fudqdyfonXDf6VN8IFtAuV5Jv7VxERBnqbS/s72-c/custom_variable.JPG" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3609603393360246412.post-8361521904868031229</id><published>2012-08-13T20:16:00.001-05:00</published><updated>2012-08-14T17:18:23.049-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="font"/><category scheme="http://www.blogger.com/atom/ns#" term="invoice"/><category scheme="http://www.blogger.com/atom/ns#" term="magento"/><category scheme="http://www.blogger.com/atom/ns#" term="order"/><category scheme="http://www.blogger.com/atom/ns#" term="pdf"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="reducir"/><category scheme="http://www.blogger.com/atom/ns#" term="shipping address"/><category scheme="http://www.blogger.com/atom/ns#" term="tamaño"/><category scheme="http://www.blogger.com/atom/ns#" term="zend"/><category scheme="http://www.blogger.com/atom/ns#" term="zend_pdf"/><title type='text'>Magento: Cómo reducir el tamaño de los archivos PDF</title><content type='html'>&lt;p&gt;
Para reducir el tamaño de los archivos PDF que genera Magento, tales como las facturas (invoices), pedidos (orders), etc. se necesita usar una fuente (fonts) diferentes a las predeterminadas.
&lt;/p&gt;
&lt;p&gt;
Los archivos PDF generados por Magento tienen un tamaño alrededor de 1.5 MB, esto se debe a que la fuente predeterminada es &lt;code&gt;/lib/LinLibertineFont/LinLibertineC_Re-2.8.0.ttf&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
La cual por sí misma pesa 1.5 MB. La solución es reemplazar esta fuente por alguna estándar de Zend_Pdf, para hacer esto, solamente abre el archivo &lt;code&gt;app/code/core/Mage/Sales/Model/Order/Pdf/Abstract.php&lt;/code&gt;
&lt;/p&gt;
&lt;p&gt;
Busca la siguiente línea:
&lt;pre class=&quot;brush: php;&quot;&gt;
$font = Zend_Pdf_Font::fontWithPath(Mage::getBaseDir() . &#39;/lib/LinLibertineFont/LinLibertineC_Re-2.8.0.ttf&#39;);
#
#
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Y reemplázala con:
&lt;pre class=&quot;brush: php;&quot;&gt;
$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
#
#
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Esto reducirá hasta en un 90% el tamaño de los archivos PDF generados en Magento
&lt;/p&gt;
&lt;p&gt;
Si deseas aumentar el tamaño de las fuentes para las facturas, direcciones de envío, etc., puedes cambiar las líneas: 
&lt;pre class=&quot;brush: php;&quot;&gt;
protected function _setFontRegular($object, $size = 7)
protected function _setFontBold($object, $size = 7)
protected function _setFontItalic($object, $size = 7)
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;Por:
&lt;pre class=&quot;brush: php;&quot;&gt;
protected function _setFontRegular($object, $size = 9)
protected function _setFontBold($object, $size = 9)
protected function _setFontItalic($object, $size = 9)
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
Como podrás ver, hemos tocado el core de Magento, para preservar las modificaciones para futuras actualizaciones de Magento, puedes colocar este código en &lt;code&gt;app/local/Mage/Sales/Model/Order/Pdf/Abstract.php&lt;/code&gt;, pero toma en cuenta que con el simple hecho de colocarlo en esta carpeta no quiere decir que vas a sobreescribir la clase, sino que simplemente es a manera de &quot;backup&quot; para que sepas que ahí puedes recolectar los cambios hechos al core de Magento cuando hagas una actualización de versión y repetir estos pasos para un futuro.
&lt;/p&gt;
&lt;p&gt;
Ahora bien, si no quieres tocar el core de Magento, puedes extender la clase &lt;code&gt;app/code/core/Mage/Sales/Model/Order/Pdf/Abstract.php&lt;/code&gt; y entonces sobreescribir los métodos arriba mencionados. Por el momento no voy a tocar el tema de cómo extender módulos en Magento, pero te dejo unos links en inglés que te pueden servir:
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://blog.chapagain.com.np/magento-block-controller-model-helper-override/&quot; target=&quot;_blank&quot;&gt;http://blog.chapagain.com.np/magento-block-controller-model-helper-override/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://blog.theunical.com/ecommerce/shopping-carts/magento-cart/magento-how-to-create-a-custom-plugin-module-example-tutorial/&quot; target=&quot;_blank&quot;&gt;http://blog.theunical.com/ecommerce/shopping-carts/magento-cart/magento-how-to-create-a-custom-plugin-module-example-tutorial/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.webspeaks.in/2010/07/create-your-first-magento-module.html&quot; target=&quot;_blank&quot;&gt;http://www.webspeaks.in/2010/07/create-your-first-magento-module.html&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Artículo original:&lt;br/&gt;
&lt;a href=&quot;http://www.magpleasure.com/blog/change-fonts-and-reduce-file-size-for-pdf-invoice-in-magento.html&quot; target=&quot;_blank&quot;&gt;http://www.magpleasure.com/blog/change-fonts-and-reduce-file-size-for-pdf-invoice-in-magento.html&lt;/a&gt;
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://php-aplicado.blogspot.com/feeds/8361521904868031229/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://php-aplicado.blogspot.com/2012/08/magento-como-reducir-el-tamano-de-los.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8361521904868031229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3609603393360246412/posts/default/8361521904868031229'/><link rel='alternate' type='text/html' href='http://php-aplicado.blogspot.com/2012/08/magento-como-reducir-el-tamano-de-los.html' title='Magento: Cómo reducir el tamaño de los archivos PDF'/><author><name>Ultiminio Ramos Galán</name><uri>http://www.blogger.com/profile/05209187960867206618</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRxCx5-c-Lb6L9v73TOwhKMhKoeIwVQ5kt9WN7xgOp1oV2UXT_b3FiSLydjJC9mh2Kg7DJl9_oLgV2ep5WUsmT_0UOyKPocJia1KcGQD9b-5cDkEWgu2QtPPiIsnuXA/s220/Beakman+Avatar.jpg'/></author><thr:total>0</thr:total></entry></feed>