<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog -  El TallerWeb &#187; PHP</title>
	<atom:link href="http://blog.eltallerweb.com/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.eltallerweb.com</link>
	<description>Blog para apasionados al diseño y desarrollo Web</description>
	<lastBuildDate>Tue, 16 Jun 2015 20:26:30 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.2</generator>
	<item>
		<title>Usuarios y Sessiones en Yii</title>
		<link>http://blog.eltallerweb.com/usuarios-y-sessiones-en-yii/</link>
		<comments>http://blog.eltallerweb.com/usuarios-y-sessiones-en-yii/#comments</comments>
		<pubDate>Tue, 19 May 2015 17:36:08 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Yii]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[sesiones]]></category>
		<category><![CDATA[usuarios]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[yii framework]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=855</guid>
		<description><![CDATA[Buenas tardes a todos Para ir un poco mas adelante en la construcción de un sitio web con Yii Framework nos encontramos con un tema básico en el desarrollo de cualquier sistema, la implementación de un ]]></description>
				<content:encoded><![CDATA[<p class="p1"><span class="s1">Buenas tardes a todos</span></p>
<p class="p1"><span class="s1">Para ir un poco mas adelante en la construcción de un sitio web con Yii Framework nos encontramos con un tema básico en el desarrollo de cualquier sistema, la implementación de un sistema de logueo, usuarios, roles y permisos para diferentes acciones en el sistema.</span></p>
<p class="p1"><span class="s1">Comenzando por explicar como tiene Yii configurado en su sistema base el logueo, nos encontramos con una acción en el controller &#8220;site/login&#8221; en la cual recibe la información de un formulario con usuario y contraseña.</span></p>
<pre class="brush: php; title: ; notranslate">

public function actionLogin() {
$model = new LoginForm;

// if it is ajax validation request
if (isset($_POST['ajax']) &amp;&amp; $_POST['ajax'] === 'login-form') {
 echo CActiveForm::validate($model);
 Yii::app()-&gt;end();
}

// collect user input data
if (isset($_POST['LoginForm'])) {
 $model-&gt;attributes = $_POST['LoginForm'];
 // validate user input and redirect to the previous page if valid
 if ($model-&gt;validate() &amp;&amp; $model-&gt;login())
$this-&gt;redirect(array(&quot;perfil&quot;));
}
// display the login form
$this-&gt;render('login', array('model' =&gt; $model));
}

</pre>
<p class="p1"><span class="s1">Esta acción a menos que tengamos algún requerimiento muy específico no debe cambiar, ya que solo nos permite desplegar el formulario y cuando ingresa la información mandarla a validar, a donde? pues esa es una pregunta importante.</span></p>
<p class="p1"><span class="s1">En &#8220;protected/components/UserIdentity&#8221; nos encontramos con una función llamada authenticate, que por default valida sobre un Array, que contiene los usuarios admin y demo, y que sirven en la forma más sencilla de nuestro sistema, pero que puede ser sustituida por:</span></p>
<pre class="brush: php; title: ; notranslate">

public function authenticate() {
$registro = Usuario::model()-&gt;findByAttributes(array('email' =&gt; $this-&gt;username));

if ($registro === null) {
$this-&gt;errorCode = self::ERROR_USERNAME_INVALID;
} else if ($registro-&gt;password === crypt($this-&gt;password,$registro-&gt;salt)) {//
$this-&gt;setState('id_usuario', $registro-&gt;id);
$this-&gt;setState('id_rol', $registro-&gt;id_rol);
$this-&gt;errorCode = self::ERROR_NONE;
} else {
$this-&gt;errorCode = self::ERROR_PASSWORD_INVALID;
}
return !$this-&gt;errorCode;
}

</pre>
<p class="p1"><span class="s1">El código anterior consulta nuestra base de datos buscando el usuario con el que coincida el correo que fue ingresado en el formulario de login, una vez encontrado, si existe, compara la contraseña almacenada en la base con la que fue enviado por el usuario, utilizando el mismo método de cifrado que se utilizó para almacenarla al principio.</span></p>
<p class="p1"><span class="s1">Una vez comparado, y si no manda error, se declaran las variables de sesión que pudiéramos utilizar en el sistema para identificar a este usuario. Se pueden definir tantas variables como sea necesario, recordando que si se agrega una nueva variable o modifica la información, esta se tomará en cuanta cuando se vuelvan a loguear.</span></p>
<p class="p1"><span class="s1">Estas variables podrán ser utilizadas a lo largo de la sesión del usuario utilizando las variables con formato:</span></p>
<pre class="brush: php; title: ; notranslate"> 
Yii::app()-&gt;user-&gt;id_usuario;
</pre>
<p class="p1"><span class="s1">Una buena practica es utilizar primero un &#8220;isset&#8221; para ver si el usuario de verdad tiene sesión, de lo contrario, el sistema arrojara un error al no encontrar dicha variable.</span></p>
<p class="p1"><span class="s1">En cuanto a los roles en las acciones, los controladores generados con crud, traen por default el access rules, que define quien si y quien no, pasa a las acciones correspondientes del controlador:</span></p>
<pre class="brush: php; title: ; notranslate">

public function accessRules() {
return array(
 array('allow', // allow all user perform 'index' and 'view' actions
'actions' =&gt; array('index', 'view'),
'users' =&gt; array('*'),
 ),
 array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions' =&gt; array('create', 'update'),
'users' =&gt; array('@'),
 ),
 array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions' =&gt; array('admin', 'delete'),
'users' =&gt; array('admin'),
 ),
 array('deny', // deny all users
'users' =&gt; array('*'),
 ),
);
}

</pre>
<p class="p1"><span class="s1">Como podemos ver, tenemos cuatro escenarios:</span></p>
<p class="p1"><span class="s1">En el primero, permitimos a todos los usuarios(*) entrar a la accion index y view</span></p>
<p class="p1"><span class="s1">En el segundo, permitimos a todos los usuarios que tengan sesión iniciada(@) entrar a la acción create y update</span></p>
<p class="p1"><span class="s1">En el tercero, permitimos a todos los usuarios que tengan sesión iniciada y que su usuario sea admin(admin) entrar a la acción admin y delete</span></p>
<p class="p1"><span class="s1">En el cuarto, Negamos cualquier acción que no haya sido definida antes</span></p>
<p class="p1"><span class="s1">Pero como esto no aplica para todos los casos, sino que podemos manejar roles, podríamos poner una regla como la siguiente:</span></p>
<pre class="brush: php; title: ; notranslate">
array('allow',
'actions' =&gt; array('create', 'update'),
'users' =&gt; array('@'),
'expression' =&gt; 'Yii::app()-&gt;user-&gt;id_rol==1 || Yii::app()-&gt;user-&gt;id_rol==3',
),
</pre>
<p class="p1"><span class="s1">Con esta regla, permitimos a todos los usuarios con sesión y que cuenten con un rol de usuario 1 o 2 a que ejecuten la acción create y update.</span></p>
<p class="p1"><span class="s1">Existen otra formas de llevar a cabo acciones, permisos y roles, aunque esta puede adaptarse a las necesidades de tu proyecto, espero les sea útil</span></p>
<p class="p1"><span class="s1">Felices Códigos</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/usuarios-y-sessiones-en-yii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First Steps Yii-Framework</title>
		<link>http://blog.eltallerweb.com/first-steps-yii-framework/</link>
		<comments>http://blog.eltallerweb.com/first-steps-yii-framework/#comments</comments>
		<pubDate>Wed, 31 Jul 2013 19:18:24 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[gii]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[tips. configuración]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Studio]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=777</guid>
		<description><![CDATA[Por Jorge Villela, @Joge23_rm Hola a todos, traigo a ustedes una mini-guía para la utilización de Yii-Framework. Sirve para empezar a utilizar este Framework de desarrollo ágil muy recomendable para todo tipo de proyectos web, espero ]]></description>
				<content:encoded><![CDATA[<p>Por Jorge Villela, @Joge23_rm</p>
<p>Hola a todos, traigo a ustedes una mini-guía para la utilización de Yii-Framework. Sirve para empezar a utilizar este <em>Framework</em> de desarrollo ágil muy recomendable para todo tipo de proyectos web, espero les sirva, cualquier duda estoy disponible en @Joge23_rm o por correo <a href="mailto:joge23@gmail.com">joge23@gmail.com</a>. Saludos.</p>
<p><strong>NOMENCLATURA</strong></p>
<p style="text-align: left; background: yellow; width: 110px;" align="right">Cambios a líneas</p>
<p style="text-align: left; background: green; width: 130px;" align="right">Agregados de líneas</p>
<p style="text-align: left;"><strong>INSTALACIÓN</strong></p>
<p style="text-align: left;">Lo primero que debes hacer es descargar el  <em>Framework</em> del sitio: <a href="http://www.yiiframework.com/">http://www.yiiframework.com/</a> (versión actual: v1.1.13)</p>
<p style="text-align: left;">Descomprimir y colocar carpeta sin renombrar (para mantener un control de la versión utilizada para cada proyecto) en la carpeta de elección, sugerida en ambiente linux: /opt/</p>
<p style="text-align: left;">Para la creación del proyecto utilizamos el <em>Shell</em> de Linux, estando en la carpeta donde se va a alojar el proyecto se escribe /opt/yii_version/framework/yiic webapp nombreProyecto</p>
<p style="text-align: left;">          p.e.<em> jorge@jorge:/var/www$ /opt/yii-1.1.13.e9e4a0/framework/yiic webapp prueba</em></p>
<p style="text-align: left;">El sistema te solicitará confirmar la creación del proyecto, recordar que esto generará una carpeta con el nombre de dicho proyecto en donde estes ubicado. Puedes probar tu proyecto creado, en este ejemplo en el navegador:</p>
<p style="text-align: left;"><a href="http://localhost/prueba/">http://localhost/prueba/</a></p>
<p style="text-align: left;"><em>** En caso de mostrar el siguiente error</em></p>
<h1 style="text-align: left;">PHP warning</h1>
<p style="text-align: left;">date() [&lt;a href=&#8217;function.date&#8217;&gt;function.date&lt;/a&gt;]: It is not safe to rely on the system&#8217;s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected &#8216;America/Chicago&#8217; for &#8216;CDT/-5.0/DST&#8217; instead</p>
<p style="text-align: left;">Verificar la configuración de PHP el default_time_zone (Este problema suele presentarse con Zend Studio)</p>
<p style="text-align: left;">Ya en este punto podrás ver tu sitio funcionando.</p>
<p style="text-align: left;">A partir de aquí se configurarán los archivos del proyecto, no debes modificar los del Framework a menos que sea muy necesario.</p>
<p style="text-align: left;">Podemos identificar que se han creado las carpetas de nuestro proyecto, debemos identificar la carpeta <em>Protected</em> que es donde estan los archivos de configuración, las extensiones, y el MVC (Models, Views, Controllers). En este punto están los de la estructura básica del proyecto.</p>
<p style="text-align: left;"><strong>CONFIGURACIÓN Y BASES DE DATOS</strong></p>
<p style="text-align: left;">prueba/protected/config/main.php</p>
<p style="text-align: left;">&lt;?php</p>
<p style="text-align: left;">// uncomment the following to define a path alias</p>
<p style="text-align: left;">// Yii::setPathOfAlias(&#8216;local&#8217;,&#8217;path/to/local-folder&#8217;);</p>
<p style="text-align: left;">// This is the main Web application configuration. Any writable</p>
<p style="text-align: left;">// CWebApplication properties can be configured here.</p>
<p style="text-align: left;">return array(</p>
<p style="text-align: left;">          &#8216;basePath&#8217;=&gt;dirname(__FILE__).DIRECTORY_SEPARATOR.&#8217;..&#8217;,</p>
<p style="text-align: left;"><span style="background-color: yellow;">          &#8216;name&#8217;=&gt;&#8217;Prueba&#8217;,</span></p>
<p style="text-align: left;"><span style="background-color: green;">          &#8216;language&#8217;=&gt;&#8217;es&#8217;,</span></p>
<p style="text-align: left;">          // preloading &#8216;log&#8217; component</p>
<p style="text-align: left;">          &#8216;preload&#8217;=&gt;array(&#8216;log&#8217;),</p>
<p style="text-align: left;">          // autoloading model and component classes</p>
<p style="text-align: left;">          &#8216;import&#8217;=&gt;array(</p>
<p style="text-align: left;">                   &#8216;application.models.*&#8217;,</p>
<p style="text-align: left;">                   &#8216;application.components.*&#8217;,</p>
<p style="text-align: left;">          ),</p>
<p style="text-align: left;">          &#8216;modules&#8217;=&gt;array(</p>
<p style="text-align: left;">                   // uncomment the following to enable the Gii tool</p>
<p style="text-align: left;"><span style="background-color: yellow;">                   &#8216;gii&#8217;=&gt;array(</span></p>
<p style="text-align: left;"><span style="background-color: yellow;">                             &#8216;class&#8217;=&gt;&#8217;system.gii.GiiModule&#8217;,</span></p>
<p style="text-align: left;"><span style="background-color: yellow;">                            &#8216;password&#8217;=&gt;&#8217;hfdjkhf&#8217;,</span></p>
<p style="text-align: left;"><span style="background-color: yellow;">                            // If removed, Gii defaults to localhost only. </span></p>
<p style="text-align: left;"><span style="background-color: yellow;">                             &#8216;ipFilters&#8217;=&gt;array(&#8216;127.0.0.1&#8242;,'::1&#8242;),</span></p>
<p style="text-align: left;"><span style="background-color: yellow;">                        ),</span></p>
<p style="text-align: left;"><span style="background-color: yellow;">                        </span></p>
<p style="text-align: left;">                 ),</p>
<p>          // application components</p>
<p style="text-align: left;">          &#8216;components&#8217;=&gt;array(</p>
<p style="text-align: left;">                   &#8216;user&#8217;=&gt;array(</p>
<p style="text-align: left;">                             // enable cookie-based authentication</p>
<p style="text-align: left;">                             &#8216;allowAutoLogin&#8217;=&gt;true,</p>
<p style="text-align: left;">                   ),</p>
<p style="text-align: left;"><span style="background-color: green;">                               // JQUERY nativo desactivado</span></p>
<p style="text-align: left;"><span style="background-color: green;">                               &#8216;clientScript&#8217;=&gt;array(<br />
&#8216;scriptMap&#8217;=&gt;array(<br />
&#8216;jquery.js&#8217;=&gt;false,<br />
&#8216;jquery.min.js&#8217;=&gt;false,<br />
)<br />
),<br />
</span></p>
<p>                   // uncomment the following to enable URLs in path-format</p>
<p style="text-align: left;"><span style="background-color: yellow;">                    &#8216;urlManager&#8217;=&gt;array(<br />
&#8216;urlFormat&#8217;=&gt;&#8217;path&#8217;,<br />
&#8216;rules&#8217;=&gt;array(<br />
&#8216;&lt;controller:\w+&gt;/&lt;id:\d+&gt;&#8217;=&gt;'&lt;controller&gt;/view&#8217;,<br />
&#8216;&lt;controller:\w+&gt;/&lt;action:\w+&gt;/&lt;id:\d+&gt;&#8217;=&gt;'&lt;controller&gt;/&lt;action&gt;&#8217;,<br />
&#8216;&lt;controller:\w+&gt;/&lt;action:\w+&gt;&#8217;=&gt;'&lt;controller&gt;/&lt;action&gt;&#8217;,<br />
),<br />
),</span></p>
<p>                         &#8216;db&#8217;=&gt;array(<br />
&#8216;connectionString&#8217; =&gt; &#8216;sqlite:&#8217;.dirname(__FILE__).&#8217;/../data/testdrive.db&#8217;,<br />
),</p>
<p>// uncomment the following to use a MySQL database</p>
<p style="text-align: left;"><span style="background-color: yellow;">                         &#8216;db&#8217;=&gt;array(<br />
&#8216;connectionString&#8217; =&gt; &#8216;mysql:host=localhost;dbname=prueba&#8217;,<br />
&#8217;emulatePrepare&#8217;=&gt; true,<br />
&#8216;username&#8217; =&gt; &#8216;usuario&#8217;,<br />
&#8216;password&#8217; =&gt; &#8216;dsfsfsdfs&#8217;,<br />
&#8216;charset&#8217; =&gt; &#8216;utf8&#8242;,<br />
),<br />
</span></p>
<p style="text-align: left;">&#8216;errorHandler&#8217;=&gt;array(</p>
<p>                             // use &#8216;site/error&#8217; action to display errors</p>
<p>&#8216;errorAction&#8217;=&gt;&#8217;site/error&#8217;,</p>
<p>),</p>
<p>&#8216;log&#8217;=&gt;array(</p>
<p>&#8216;class&#8217;=&gt;&#8217;CLogRouter&#8217;,</p>
<p>&#8216;routes&#8217;=&gt;array(</p>
<p>array(</p>
<p>&#8216;class&#8217;=&gt;&#8217;CFileLogRoute&#8217;,</p>
<p>&#8216;levels&#8217;=&gt;&#8217;error, warning&#8217;,</p>
<p>),</p>
<p>// uncomment the following to show log messages on web pages</p>
<p>/*</p>
<p>array(</p>
<p>&#8216;class&#8217;=&gt;&#8217;CWebLogRoute&#8217;,</p>
<p>),</p>
<p>*/</p>
<p>),</p>
<p>),<br />
),</p>
<p>// application-level parameters that can be accessed</p>
<p>// using Yii::app()-&gt;params[&#8216;paramName&#8217;]</p>
<p>&#8216;params&#8217;=&gt;array(</p>
<p>// this is used in contact page</p>
<p>&#8216;adminEmail&#8217;=&gt;&#8217;webmaster@example.com&#8217;,</p>
<p>),</p>
<p>);</p>
<p>Lo que hicimos fue modificar el nombre de nuestra aplicación, modificar el lenguaje para el sitio, descomentar el código que permite utilizar Gii (generación de modelos y <em>crud</em>) y le modificamos el campo de <em>Password;</em> agregar el código para deshabilitar el JQuery nativo (recomendado para incluir la versión más nueva y que no choquen), descomentar UrlManager (esto hace que los métodos se muestren con <em>Friendly Url</em>)<em>,</em> descomentamos la configuración de DB y agregamos los datos de nuestra base de datos. Con esto finalizamos la modificación de este archivo.</p>
<p><strong>CREACIÓN DE MODELOS</strong></p>
<p>Es importante que el usuario <em>www-data</em> tenga permisos, se sugiere cambiar el propietario del proyecto cuando se utiliza el Gii(esto es porque se generan archivos a partir del navegador), en consola:</p>
<p><em>sudo chown -R www-data.www-data prueba</em></p>
<p>En el navegador: <a href="http://localhost/prueba/index.php/gii/default/login">http://localhost/prueba/index.php/gii/default/login</a></p>
<p>Utilizamos nuestra contraseña (la que asignamos para el componente Gii en el archivo de configuración).</p>
<p>Una vez adentro, seleccionamos la sección de <em>Model Generato</em>r y en esta parte ingresamos en el campo de <em>Table Name</em> el nombre de la tabla; lo demás es bueno dejarlo por <em>Default.</em> Seleccionamos el botón <em>Preview</em> y te mostrará la lista de archivos generados, en este caso sería un archivo<em> Tablename.php</em>, le das <em>Generate</em> y te regresará un mensaje de éxito.</p>
<p>Este es el proceso para crear los modelos de cada tabla, los cuales permitirán la conexión a la base y a dicha tabla.</p>
<p>p.e. Tablename::model()-&gt;findAll();//Con este comando recuperarías todos los registros de la tabla en concreto en forma de <em>array</em> de objetos.</p>
<p><strong>CREACIÓN DE CRUD (CONSULTAS, ALTAS, BAJAS Y CAMBIOS)</strong></p>
<p>A partir de nuestro archivo de modelo generado, podemos crear la consulta, altas, bajas y cambios a nuestra tabla con la opción de <em>Crud Generator</em>, donde sólo ingresaremos el nombre del modelo: <em>Tablename</em></p>
<p>Al seleccionar<em> Preview </em> nos mostrará todos los archivos (un C<em>ontroller</em> y varias vistas) que se van a generar, le damos <em>Generate</em> y listo, podemos empezar a utilizar/modificar según las necesidades del proyecto.</p>
<p><strong>PUNTOS CLAVES</strong></p>
<p><strong>Modelo</strong></p>
<p><em>Apartado de Rules:</em> Reglas que van aplicarse tanto al<em> Create</em> como al <em>Update</em> de los registros de cada modelo.</p>
<p><em>Apartado de AttributeLabels:</em> Permite definir las etiquetas de los campos, es muy útil si a lo largo de todo el proyecto se utilizan porque si hay un cambio sólo se modifica una vez.</p>
<p><strong>Controller</strong></p>
<p>Al principio se define el<em> layout</em> general, recomiendo moficar dicha línea y utilizar <em>layout main</em>,</p>
<p style="text-align: left; background: yellow; width: 215px;" align="right">public $layout=&#8217;//layouts/main';</p>
<p>El apartado de <em>accessRule</em>s  permite definir las reglas de accesso, en la configuración por <em>Default</em> se da acceso a todo(*) a algunas acciones de las clases, a los usuarios logueados(@) a otras y a un usuario en específico a otras (Admin). Este puede ser <em>customizado</em> con opciones como <em>&#8216;expression&#8217;</em>, todo esto viene en la documentación de Yii.</p>
<p>Más adelante están todos los métodos de la clase, los que vienen por <em>Default</em> y los que se crearán para el proyecto.</p>
<p><strong>Views</strong></p>
<p>Gracias al <em>Crud,</em> por cada C<em>ontroller</em> se generán:</p>
<ul>
<li>index.php (Página principal, por<em> Default</em> viene un listado de los elementos de la tabla).</li>
<li>_view.php (Se renderea parcialmente dentro de index.php, representa uno a uno los elementos que se muestran en la lista).</li>
<li>view.php (Es la vista individual de cada elemento de la tabla, si se utiliza el <em>controller tablename/1</em>) dirigirá por<em> Default </em>al <em>View</em> de ID 1</li>
<li>create/update (Contienen<em> al _form</em> que es donde se puede modificar al registro).</li>
</ul>
<p>Entre otras&#8230;</p>
<p><strong>Views site y Layout</strong></p>
<p>En las vistas que vienen generadas desde el principio se encuentran las de <em>Site </em>(vistas básicas, el <em>Index</em> del <em>Home</em>, el contacto y otras. Todas estas son las vistas que serían relativamente estáticas) y las de <em>Layout </em>(main.php contiene el código que envuelve a todas las vistas que se renderean, es decir, el cascarón del sitio).</p>
<p>Espero que esta información les sea de utilidad, aquí les dejos algunos links en donde pueden encontrar más información.</p>
<p><a href="http://www.yiiframework.com/">http://www.yiiframework.com/</a></p>
<p><a href="http://www.yiiframework.com/doc/guide/1.1/en/quickstart.first-app">http://www.yiiframework.com/doc/guide/1.1/en/quickstart.first-app</a></p>
<p><a href="http://www.yiiframework.com/wiki/">http://www.yiiframework.com/wiki/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/first-steps-yii-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reglas de monitoreo de Zend Server 6</title>
		<link>http://blog.eltallerweb.com/reglas-de-monitoreo-de-zend-server-6/</link>
		<comments>http://blog.eltallerweb.com/reglas-de-monitoreo-de-zend-server-6/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 22:40:42 +0000</pubDate>
		<dc:creator><![CDATA[jmosqueda]]></dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[aplicaciones]]></category>
		<category><![CDATA[descarga]]></category>
		<category><![CDATA[monitoreo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[prueba]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Server 6]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=661</guid>
		<description><![CDATA[Por Lillian Domínguez Zend Server es un servidor de aplicaciones Web en plataforma PHP de misión crítica, una de las fortalezas que tiene es su sistema de monitoreo, ahora extendido para los desarrolladores en su ]]></description>
				<content:encoded><![CDATA[<p>Por Lillian Domínguez</p>
<p>Zend Server es un servidor de aplicaciones Web en plataforma PHP de misión crítica, una de las fortalezas que tiene es su sistema de monitoreo, ahora extendido para los desarrolladores en su versión 6.</p>
<p>Zend Server proporciona una vista detallada del ecosistema de las aplicaciones a través de tableros de monitoreo proporcionando mediciones sobre el  performance y la utilización. Las reglas pueden configurarse para satisfacer las necesidades de cada aplicación, teniendo notificación de errores de PHP, uso de memoria alta, ejecución de peticiones lentas y más.</p>
<p>Cuando algo va mal, el seguimiento de código proporciona un aviso instantáneo de la situación, dando a los desarrolladores función por función la penetración en la problemática del código de PHP de manera que permite reducir el tiempo de resolución de los problemas. Por lo que ahora es posible asignarles a los desarrolladores diferentes credenciales con acceso de sólo lectura a las aplicaciones, con seguridad pueden acceder a datos de depuración de la producción y resolver los problemas más rápidamente.</p>
<p>Echa un vistazo a las reglas de monitoreo de Zend Server 6 aquí: <a href="http://www.youtube.com/embed/fQGjAR61rzw">http://www.youtube.com/embed/fQGjAR61rzw</a></p>
<p>Descárgalo aquí y prueba su funcionalidad completa por 30 días: <a href="http://www.zend.com/en/products/server/downloads">http://www.zend.com/en/products/server/downloads</a> , sí requieres apoyo con gusto te asesoramos.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/reglas-de-monitoreo-de-zend-server-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Qué es PECL?</title>
		<link>http://blog.eltallerweb.com/que-es-pecl/</link>
		<comments>http://blog.eltallerweb.com/que-es-pecl/#comments</comments>
		<pubDate>Tue, 16 Apr 2013 23:09:39 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[extensión]]></category>
		<category><![CDATA[extensiones]]></category>
		<category><![CDATA[pclp]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=648</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx PECL es un repositorio de extensiones PHP, de hecho PECL quiere decir PHP Extension Community Library,  es  decir es un lugar donde están las extensiones PHP más comunes y que más ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>PECL es un repositorio de extensiones PHP, de hecho PECL quiere decir PHP Extension Community Library,  es  decir es un lugar donde están las extensiones PHP más comunes y que más son usadas por la comunidad.</p>
<p>Comparte el mismo sistema de empaquetado que su hermana PEAR, sólo que tiene una diferencia grande y fundamental, lo que se guarda en PECL son extensiones PHP, es decir código C que se compila para que  funcione como librería PHP, añadiendo funcionalidad al lenguaje.</p>
<p>Así muchas extensiones comunitarias, antes de llegar a la distribución “normal” de PHP, primero se vuelven conocidas y populares en PECL. Entonces, una extensión escrita por cualquiera necesita cumplir con los requerimientos de PECL, cubrir ciertas necesidades o carencias, documentarla y demás.</p>
<p>Actualmente las 5 extensiones más populares en PECL son:</p>
<p>1      APC</p>
<p>2      memcache</p>
<p>3      imagick</p>
<p>4      timezonedb</p>
<p>5      mongo</p>
<p><strong>¿Cómo instalar una extensión con PECL?</strong></p>
<p>Para instalar una extensión con PECL, solo hay que usar el comando:   pecl install memcache</p>
<p>Esto hará que se descargue el código fuente de la extensión desde el repositorio, se phpizará, se compilará para generar  un archivo .so, que puede ser cargado con la función dl() o añadiendo extension=memcache.so al php.ini.</p>
<p>Con esto ya tendremos funcionando la extensión en nuestro PHP y podremos utilizar su funcionalidad.</p>
<p>Espero que esto les sea de ayuda.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/que-es-pecl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Server 6. Plataforma de aplicación Web y móvil</title>
		<link>http://blog.eltallerweb.com/zend-server-6-plataforma-de-aplicacion-web-y-movil/</link>
		<comments>http://blog.eltallerweb.com/zend-server-6-plataforma-de-aplicacion-web-y-movil/#comments</comments>
		<pubDate>Sat, 02 Mar 2013 05:00:34 +0000</pubDate>
		<dc:creator><![CDATA[jmosqueda]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[6]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[programadores]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=595</guid>
		<description><![CDATA[Por Lillian Domínguez ¿Tienes aplicaciones de producción?. Preveé la próxima crisis de aplicación utilizando Zend Server. Zend Server te apoya en: Detectar y resolver problemas de aplicación de producción de manera más rápida Evitar la ]]></description>
				<content:encoded><![CDATA[<p style="text-align: left;" align="center">Por Lillian Domínguez</p>
<p>¿Tienes aplicaciones de producción?. Preveé la próxima crisis de aplicación utilizando Zend Server.</p>
<p>Zend Server te apoya en:</p>
<ul>
<li>Detectar y resolver problemas de aplicación de producción de manera más rápida</li>
<li>Evitar la degradación del rendimiento</li>
<li>Evitar los desastres de escalamiento y tolerancia a fallos</li>
<li>Automatizar el proceso de implementación para manejar el desarrollo iterativo de la aplicación</li>
<li>Dar visibilidad de la producción a sus desarrolladores en forma segura y controlada</li>
<li>Cumplir con sus compromisos de SLA de aplicación</li>
<li>Te brinda Paneles de métricas de rendimiento que te darán una visión a largo plazo y tendencias</li>
<li>Garantizar la alta disponibilidad con failover de aplicaciones integradas</li>
<li>Recibir notificación de problemas antes de que sean fallos</li>
<li>Mantener la seguridad de la aplicación y cumplimiento</li>
<li>Evitar cambios no autorizados en su entorno</li>
<li>Utilizar Zend Server en cualquier entorno de cloud – pública, privada o híbrido &#8211; para capacidad de flexibilidad y ráfaga</li>
</ul>
<p><strong>Y como desarrollador ¿en qué me apoya?</strong></p>
<ul>
<li>Brinda grabado instantáneas de ejecución de código PHP de línea por línea de interrupción de producción de anoche</li>
<li>Construye el almacenamiento en caché en tus aplicaciones</li>
<li>Evita cuellos de botella de tu código para paralelización de  tareas</li>
<li>Estandariza en la pila PHP más integral y coherente</li>
<li>Depuración avanzada, supervisión y herramientas de generación de perfiles.</li>
</ul>
<p>Zend, la empresa PHP, asegura sus componentes PHP de código abierto son compatibles y tienen las últimas actualizaciones de seguridad.</p>
<p>Conoce sus diferentes versiones: <a href="http://www.zend.com/en/products/server/editions">http://www.zend.com/en/products/server/editions</a>.</p>
<p>Si necesitas orientación, deseas adquirir una licencia o requieres apoyo de soporte con gusto te ayudamos, visita: http://eltallerweb.com</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/zend-server-6-plataforma-de-aplicacion-web-y-movil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¡Nueva versión de Zend Studio!</title>
		<link>http://blog.eltallerweb.com/nueva-version-de-zend-studio/</link>
		<comments>http://blog.eltallerweb.com/nueva-version-de-zend-studio/#comments</comments>
		<pubDate>Fri, 15 Feb 2013 14:57:36 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[lanzamiento]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[programadores]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[zend studio 10]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=572</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx Hace apenas unos días, Zend anunció el lanzamiento de la última versión de su IDE, Zend Studio 10. Esta nueva versión nos ofrece las ya conocidas características de versiones anteriores que ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>Hace apenas unos días, Zend anunció el lanzamiento de la última versión de su IDE, Zend Studio 10.</p>
<p>Esta nueva versión nos ofrece las ya conocidas características de versiones anteriores que nos ayudan a maximizar la productividad, como el PHPUnit, Debugging, perfilado de aplicaciones y Control de versiones(incluyendo Git).</p>
<p>Pero son las nuevas características de esta versión que llaman rápidamente nuestra atención, por ejemplo la posibilidad de crear aplicaciones móviles conectadas a la nube. Así es , desde Zend Studio 10, podemos crear los dos aspectos de una aplicación móvil, el lado cliente generado a partir de HTML y jQuery, y el lado del servidor con <em>web services RESTful</em> creados con PHP y componentes de Zend Framework 2 con la posibilidad de hospedar esto en la nube.</p>
<p>Y ya que hablamos de desarrollar usando la nube, Zend Studio nos da la posibilidad de desplegar nuestro código en “nubes”, que cuentan con <em>stacks</em> de PHP certificados y otras componentes como bases de datos que nos evitan la necesidad de tener que preparar ambientes de desarrollo en máquinas locales u otros servidores, en concreto se trata de la Zend Developer Cloud y la de Red Hat, la OpenShift, ambas gratuitas y abiertas.</p>
<p>Todo esto suena excelente, aunque debo confesar que para un servidor, la característica más atrayente es por mucho la integración del IDE con Zend Framework 2. Y es que el Zend Studio 10 te auxilia muchísimo en el desarrollo de aplicaciones ZF2. Por ejemplo, la creación inicial de la aplicación nos deja ya una estructura muy completa desde la cual podemos empezar a poner nuestro código; además nos ayuda en la creación de módulos, controladores, vistas y otros items del framework. Por si esto fuera poco, cuenta con un localizador de servicios ZF2 con integración a <em>composer</em>, sin mencionar la auto-completación de clases, métodos y <em>namespaces</em> que hace que el desarrollo en ZF2 sea mucho más sencillo.</p>
<p>¿Ya conoces el producto? Cuéntanos que te parecio.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/nueva-version-de-zend-studio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo subir un archivo con jQuery y Ajax + PHP</title>
		<link>http://blog.eltallerweb.com/como-subir-un-archivo-con-jquery-y-ajax-php/</link>
		<comments>http://blog.eltallerweb.com/como-subir-un-archivo-con-jquery-y-ajax-php/#comments</comments>
		<pubDate>Fri, 01 Feb 2013 23:54:00 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[JQUERY]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[archivo]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[subir]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=532</guid>
		<description><![CDATA[Por Juan Carlos Sosa Para subir un archivo con  jQuery y Ajax + PHP, en lugar de  utilizar un plugin ya desarrollado y probado,  podemos utilizar la lógica de cómo se envía un archivo con ]]></description>
				<content:encoded><![CDATA[<p>Por Juan Carlos Sosa</p>
<p>Para subir un archivo con  jQuery y Ajax + PHP, en lugar de  utilizar un <em>plugin</em> ya desarrollado y probado,  podemos utilizar la lógica de cómo se envía un archivo con Ajax:</p>
<p>function uploadAjax(){</p>
<p>var inputFileImage = document.getElementById(&#8220;archivoImage&#8221;);</p>
<p>var file = inputFileImage.files[0];</p>
<p>var data = new FormData();</p>
<p>data.append(&#8216;archivo&#8217;,file);</p>
<p>var url = &#8220;upload.php&#8221;;</p>
<p>$.ajax({</p>
<p>url:url,</p>
<p>type:&#8217;POST&#8217;,</p>
<p>contentType:false,</p>
<p>data:data,</p>
<p>processData:false,</p>
<p>cache:false});</p>
<p>}</p>
<p><strong>Configurando el Html de la página, algo similar tiene que quedar el <em>Input:</em></strong></p>
<p>&lt;input type=&#8217;file&#8217; name=&#8217;archivoImage&#8217; id=&#8217;archivoImage&#8217; /&gt;</p>
<p>&lt;input type=&#8217;button&#8217; id=&#8217;botonSubidor&#8217; onclick=&#8217;uploadAjax()&#8217; /&gt;</p>
<p><strong>También pueden hacerlo con jQuery:</strong></p>
<p>$(document).ready(function() {     $(&#8216;#botonSubidor&#8217;).click(&#8216;uploadAjax&#8217;);})</p>
<p><strong>Obviamente el html tiene que quedar así:</strong></p>
<p>&lt;input type=&#8217;file&#8217; name=&#8217;archivoImage&#8217; id=&#8217;archivoImage&#8217; /&gt;</p>
<p>&lt;input type=&#8217;button&#8217; id=&#8217;botonSubidor&#8217; /&gt;</p>
<p><strong>El archivo upload.php</strong><strong></strong></p>
<p>//upload.php</p>
<p>$return = Array(&#8216;ok&#8217;=&gt;TRUE);</p>
<p>$upload_folder =&#8217;images';</p>
<p>$nombre_archivo = $_FILES[&#8216;archivo&#8217;][&#8216;name&#8217;];</p>
<p>$tipo_archivo = $_FILES[&#8216;archivo&#8217;][&#8216;type&#8217;];</p>
<p>$tamano_archivo = $_FILES[&#8216;archivo&#8217;][&#8216;size&#8217;];</p>
<p>$tmp_archivo = $_FILES[&#8216;archivo&#8217;][&#8216;tmp_name&#8217;];</p>
<p>$archivador = $upload_folder . &#8216;/&#8217; . $nombre_archivo;</p>
<p>if (!move_uploaded_file($tmp_archivo, $archivador)) {</p>
<p>$return = Array(&#8216;ok&#8217; =&gt; FALSE, &#8216;msg&#8217; =&gt; &#8220;Ocurrio un error al subir el archivo. No pudo guardarse.&#8221;, &#8216;status&#8217; =&gt; &#8216;error&#8217;);</p>
<p>}</p>
<p>echo json_encode($return);</p>
<p>Espero que esta información les sea de utilidad ¿Ustedes cómo lo harían?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/como-subir-un-archivo-con-jquery-y-ajax-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Qué es PHPUnit?</title>
		<link>http://blog.eltallerweb.com/que-es-phpunit/</link>
		<comments>http://blog.eltallerweb.com/que-es-phpunit/#comments</comments>
		<pubDate>Wed, 16 Jan 2013 21:18:44 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=516</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx PHPUnit es un framework open source para el desarrollo, orientado a pruebas ó TDD para culquier código PHP. Es decir, es un framework que nos ayuda a probar nuestro código. Ahora, ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>PHPUnit es un <em>framework open source</em> para el desarrollo, orientado a pruebas ó TDD para culquier código PHP. Es decir, es un framework que nos ayuda a probar nuestro código.</p>
<p>Ahora, ¿Por qué probar nuestro código? Bueno, Sebastian Bergmann creador de PHPUnit, dice algo muy cierto, <em>&#8220;todos los programadores cometen errores, pero la diferencia entre los buenos programadores y los malos programadores es que los buenos programadores prueban su código para encontrar esos errores lo más pronto posible</em>&#8220;. Y es que esperar a que el software falle por sí mismo para después corregirlo es muy costoso, lento y dificíl de corregir.</p>
<p>La propuesta de PHPUnit y otros frameworks para pruebas es crear pequeñas unidades que revisen funcionalidades puntuales del código y probar que funcionen como debe, además de la posibilidad de automatizar estas pruebas para ejecutarlas frecuentemente, tanto como el código cambie.</p>
<p>Así, para probar el código no es suficiente recargar el navegador como loco, hay que definir la funcionalidad del mismo, separarla en unidades y revisar que cada una funcione como se supone.</p>
<p>La vía típica para instalar PHPUnit es a través de PEAR, aunque también algunos IDEs como Zend Studio ya lo traen integrado. Una vez instalado hay que crear los tests, que no es otra cosa que métodos clases en PHP, y ejecutarlos por línea de comando o desde nuestro IDE; así obtendremos un resultado para cada test. Para que una prueba sea exitosa, todos los tests unitarios deben pasar y obtener un alto porcentaje en la cobertura de código.</p>
<p>Crear tests unitarios puede complicarse si nuestro código no es testeable, es decir, no se presta mucho para hacerle pruebas, saber si un código es testeable o no, crear pruebas más efectivas es algo que sólo con la práctica lograremos.</p>
<p>Espero esto les sea de utilidad.<br />
Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/que-es-phpunit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Server 6 Beta</title>
		<link>http://blog.eltallerweb.com/zend-server-6-beta/</link>
		<comments>http://blog.eltallerweb.com/zend-server-6-beta/#comments</comments>
		<pubDate>Mon, 31 Dec 2012 15:27:22 +0000</pubDate>
		<dc:creator><![CDATA[jmosqueda]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[prueba]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework 2]]></category>
		<category><![CDATA[Zend Server 6]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=460</guid>
		<description><![CDATA[Por Lillian Domínguez Implementación, monitoreo y administración de aplicaciones como nunca antes. Zend Server 6 está disponible para la evaluación en Windows y Linux, y estará disponible en IBM a principios del 2013. Algunas de ]]></description>
				<content:encoded><![CDATA[<p>Por Lillian Domínguez</p>
<p>Implementación, monitoreo y administración de aplicaciones como nunca antes.</p>
<p>Zend Server 6 está disponible para la evaluación en Windows y Linux, y estará disponible en IBM a principios del 2013. Algunas de las nuevas características incluyen la capacidad para organizar el acceso al servidor de Zend por rol, aprovechar la autenticación LDAP y generar estadísticas sobre el uso de la aplicación y sitio web. Ahora podrás:</p>
<ul>
<li><strong>Entender tus aplicaciones:</strong> Administrar aplicaciones, no servidores, comprender el rendimiento de la aplicación y solucionar problemas de manera instantánea incluso después del hecho, con un sistema de monitoreo mejorado, reglas de almacenamiento en caché, visualización del rendimiento y diagnóstico instantáneo.</li>
<li><strong>Escala hacia la nube:</strong> Se diseña para permitir la alta disponibilidad y escalabilidad en la nube y en local, con servicios de gestión de usuarios, incluyendo IBM, VMware, Red Hat, RightScale, Amazon y otros. Las versiones de producción de Zend Server vienen con soporte telefónico hasta de 24 x 7 x 365, las revisiones de seguridad y actualizaciones a la medida en PHP y Zend Framework (incluyendo versiones anteriores como PHP 5.2).</li>
<li><strong>Asegurar el cumplimiento de la empresa:</strong> Zend Server 6 ayuda como puente en el abismo Desarrollo-Operaciones, permitiendo diferentes niveles de acceso de la producción basado en el rol para depurar un problema presentado en operación con sistemas de auditorias, permitiendo a operaciones conservar el control completo del sistema y la configuración, los desarrolladores  tienen la suficiente visibilidad en el entorno de producción para solucionar problemas sin arriesgar la seguridad de los sistemas de producción, e integración con sistemas de gestión de usuario existentes LDAP.</li>
<li><strong>Usa PHP 5.4 y ZF2: </strong>Zend Server 6 incluye un motor de tiempo de ejecución de PHP 5.4 probado, certificado y compatible, la versión más reciente de la mayor de las bibliotecas de marco, y licencias de producción que incluyen soporte técnico y correcciones de errores para Zend Framework 2.</li>
</ul>
<p>Pruébalo!, descárgalo aquí: <a href="http://www.zend.com/en/products/server/downloads-beta?src=downloadb">http://www.zend.com/en/products/server/downloads-beta?src=downloadb</a></p>
<p>Si requieres asesoría de las soluciones Zend te podremos ayudar, visita: <a href="http://eltallerweb.com">ElTallerWeb.com</a>.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/zend-server-6-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detectando código PHP duplicado con phpcpd</title>
		<link>http://blog.eltallerweb.com/detectando-codigo-php-duplicado-con-phpcpd/</link>
		<comments>http://blog.eltallerweb.com/detectando-codigo-php-duplicado-con-phpcpd/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 23:45:27 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[phpcpd]]></category>
		<category><![CDATA[Programacion]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=428</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx Muchas veces, se dice que al codificar se debe reutilizar código, esto es cierto,  pero no quiere decir que necesariamente se tenga que hacer “copy-paste” de ese código. El duplicar o ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p>Muchas veces, se dice que al codificar se debe reutilizar código, esto es cierto,  pero no quiere decir que necesariamente se tenga que hacer “copy-paste” de ese código. El duplicar o clonar código dentro de un proyecto,  incrementa la dificultad para mantener el mismo aumentando los tiempos y costos.</p>
<p>Sí, al principio es muy simple y rápido hacer “copy-paste” de algunas o muchas líneas de código, pero si luego se detecta un error o se quiere hacer mejoras, la dificultad para lograrlo se multiplicará por el número de veces que se duplicó ese código en el proyecto. Lo ideal para reutilizar código es crear librerías de funciones o clases que sean sencillas y especializadas, de manera que mantenerlas resulte práctico y fácil.</p>
<p>Una herramienta que nos ayuda a detectar código PHP duplicado es <strong>phpcpd</strong> <strong>(Copy/Paste Detector (CPD) for PHP code)</strong> , la cuál fue creada por Sebastian Bergmann, el mismo de <strong>PHPUnit</strong> , y al igual que phploc se instala desde <strong>PEAR</strong>.</p>
<h2>Instalación</h2>
<p>Si no has usado el canal PEAR phpunit.de primero debes “descubrirlo”:</p>
<p>pear channel-discover pear.phpunit.de</p>
<p>pear channel-discover components.ez.no</p>
<p>Y ahora sí podemos instalar el phpcpd</p>
<p>pear install phpunit/phpcpd</p>
<h2>Corriendo una prueba</h2>
<p>/usr/local/zend/bin/phpcpd sigmabol/</p>
<p>phpcpd 1.3.2 by Sebastian Bergmann.</p>
<p>Found 8 exact clones with 550 duplicated lines in 8 files:</p>
<p>&#8211; application/controllers/MatrizinternaController.php:8-163</p>
<p>application/controllers/MatrizController.php:7-162</p>
<p>&nbsp;</p>
<p>&#8211; application/controllers/MatrizinternaController.php:186-240</p>
<p>application/controllers/MatrizController.php:179-233</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Pdf.php:285-292</p>
<p>library/Bvb/Grid/Deploy/Pdf.php:436-443</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Print.php:111-120</p>
<p>library/Bvb/Grid/Deploy/Wordx.php:381-390</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Wordx.php:79-234</p>
<p>library/Bvb/Grid/Deploy/Odt.php:79-234</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Print.php:111-120</p>
<p>library/Bvb/Grid/Deploy/Odt.php:352-361</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Wordx.php:79-233</p>
<p>library/Bvb/Grid/Deploy/Ods.php:79-233</p>
<p>&nbsp;</p>
<p>&#8211; library/Bvb/Grid/Deploy/Print.php:111-118</p>
<p>library/Bvb/Grid/Deploy/Word.php:111-118</p>
<p>&nbsp;</p>
<p>3.64% duplicated lines out of 15116 total lines of code.</p>
<p>Time: 1 second, Memory: 22.25Mb</p>
<p>Al correr el comando nos da una salida con los archivos que tienen líneas de código duplicadas, además un porcentaje de líneas duplicadas respecto al total de líneas del proyecto, el tiempo y memoria que tomó hacer la prueba.</p>
<h2>Conclusiones</h2>
<p>Esta herramienta nos de una buena idea de la forma en la que reutilizamos nuestro código, lo ideal sería que el 0% de nuestro código esté repetido, por supuesto algunas veces esto no será posible y duplicaremos algo de código, pero es bueno mantener esos porcentajes por niveles bajos.</p>
<p>Eso nos ayuda a fomentar buenas prácticas como la creación de librerías comunes y clases extendibles( léase con la facilidad para ser extendidas por clases hijas).</p>
<p>Además phpcpd y las otras herramientas similares pueden ser integradas con servidores de <em>Continuous Integration</em> como Jenkins y phpUnderControl, lo que nos da una visión completa del QA (Quality assurance) en nuestros proyectos PHP.</p>
<p>Saludos.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/detectando-codigo-php-duplicado-con-phpcpd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
