<?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; Joge23</title>
	<atom:link href="http://blog.eltallerweb.com/author/joge23_/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>Reporte de errores a Correo</title>
		<link>http://blog.eltallerweb.com/reporte-de-errores-a-correo/</link>
		<comments>http://blog.eltallerweb.com/reporte-de-errores-a-correo/#comments</comments>
		<pubDate>Thu, 28 May 2015 21:52:07 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=883</guid>
		<description><![CDATA[Buenas tardes a todos Continuando con la construcción de nuestro sitio web con Yii Framework, vamos a ver un tema muy importante para asegurarnos que nuestro servicio esté el mayor tiempo posible cumpliendo con sus objetivos, ]]></description>
				<content:encoded><![CDATA[<div><strong>Buenas tardes a todos</strong></div>
<div></div>
<div>Continuando con la construcción de nuestro sitio web con Yii Framework, vamos a ver un tema muy importante para asegurarnos que nuestro servicio esté el mayor tiempo posible cumpliendo con sus objetivos, y que cualquier error que tengamos podamos rastrearlo. Para esto tenemos que tomar en cuenta que nuestro sistema puede tener fallas si no se realizaron las pruebas necesarias, y que no podemos dejar que los usuarios vean la vista de debug que el framework trae por default ya que no genera confianza y además les permite ver cosas que no deben de ver.</div>
<div></div>
<div>Para esto tenemos que modificar en nuestro sistema operando en producción el archivo index.php que se encuentra en la raíz de nuestro proyecto similar a lo que se apunta a continuación:</div>
<div></div>
<div>
<pre class="brush: php; title: ; notranslate">&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;?php&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;// change the following paths if necessary&lt;/div&gt;
&lt;div&gt;$yii=dirname(__FILE__).'/../../../opt/yii-1.1.14.f0fee9/framework/yii.php';&lt;/div&gt;
&lt;div&gt;$config=dirname(__FILE__).'/protected/config/main.php';&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;// remove the following lines when in production mode&lt;/div&gt;
&lt;div&gt;//defined('YII_DEBUG') or define('YII_DEBUG',true);&lt;/div&gt;
&lt;div&gt;// specify how many levels of call stack should be shown in each log message&lt;/div&gt;
&lt;div&gt;//defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;require_once($yii);&lt;/div&gt;
&lt;div&gt;Yii::createWebApplication($config)-&gt;run();&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;</pre>
</div>
<div></div>
<div>Comentando esas dos lineas, desactivamos la vista de debug, pero nos falta que en la vista de nuestro sistema no aparezca el código y descripción del error, información que es útil para el debug pero no para los usuarios de nuestro sitio, así que en protected/views/site/error, cambiamos el siguiente código:</div>
<div></div>
<div>
<pre class="brush: php; title: ; notranslate">&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;h2&gt;Error &lt;?php echo $code; ?&gt;&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;div class=&quot;error&quot;&gt;&lt;/div&gt;
&lt;div&gt;&lt;?php echo CHtml::encode($message); ?&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;</pre>
</div>
<div>por:</div>
<div>
<pre class="brush: php; title: ; notranslate">&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;h2&gt;Ha ocurrido un problema&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;div class=&quot;error&quot;&gt;&lt;/div&gt;
&lt;div&gt;Es posible que los datos ingresados no sean correctos, favor de verificarlos y de persistir el problema comunicarse con el área correspondiente&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;</pre>
</div>
<div></div>
<div>Con esto, ya no le mostraríamos errores a nuestros usuarios, pero aun tenemos el problema de que nadie del staff que desarrolla el proyecto se enteraría de que hay un problema con el funcionamiento, así que modificaremos nuestro protected/controller/SiteController.php para que nos haga un envió de la información del error:</div>
<div></div>
<div>
<pre class="brush: php; title: ; notranslate">&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;?php&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;public function actionError() {&lt;/div&gt;
&lt;div&gt;        if ($error = Yii::app()-&gt;errorHandler-&gt;error) {&lt;/div&gt;
&lt;div&gt;            if ($error[&quot;code&quot;] != 404 &amp;&amp; $error[&quot;code&quot;] != 403) {&lt;/div&gt;
&lt;div&gt;                $content = &quot;&quot;;&lt;/div&gt;
&lt;div&gt;                foreach ($error as $key =&gt; $item) {&lt;/div&gt;
&lt;div&gt;                    if ($key == &quot;traces&quot;) {&lt;/div&gt;
&lt;div&gt;                        $content.= &quot;$key: &quot;;&lt;/div&gt;
&lt;div&gt;                        $content.= json_encode($item);&lt;/div&gt;
&lt;div&gt;                        $content.= &quot;&lt;br /&gt;&quot;;&lt;/div&gt;
&lt;div&gt;                    } else {&lt;/div&gt;
&lt;div&gt;                        $content.= &quot;$key: $item&lt;br /&gt;&quot;;&lt;/div&gt;
&lt;div&gt;                    }&lt;/div&gt;
&lt;div&gt;                }&lt;/div&gt;
&lt;div&gt;                //echo $content;&lt;/div&gt;
&lt;div&gt;                $remitente=&quot;&lt;a href=&quot;mailto:prueba@prueba.com&quot; target=&quot;_blank&quot;&gt;prueba@prueba.com&lt;/a&gt;&quot;&lt;/div&gt;
&lt;div&gt;funcion_enviar_correo($remitente, $body);&lt;/div&gt;
&lt;div&gt;            }&lt;/div&gt;
&lt;div&gt;            if (Yii::app()-&gt;request-&gt;isAjaxRequest)&lt;/div&gt;
&lt;div&gt;                echo $error['message'];&lt;/div&gt;
&lt;div&gt;            else&lt;/div&gt;
&lt;div&gt;                $this-&gt;render('error', $error);&lt;/div&gt;
&lt;div&gt;        }&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;</pre>
</div>
<div>Lo que hacemos en esta función es que recibimos el error que se presentó, si es error de no encontrado o no autorizado no enviamos ningún correo ya que no debería ser necesario, y si es otro error lo ponemos en texto plano y lo enviamos a través de cualquier función de correo que a ustedes les convenga.</div>
<div></div>
<div>Esto suele ser de mucha utilidad para darte cuenta de errores sin darlo a notar con los usuarios del sistema, así que es muy recomendable. Espero les sea muy útil y sigan programando agilmente.</div>
<div></div>
<div>Felices Códigos</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/reporte-de-errores-a-correo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>HTTPS (Hypertext Transfer Protocol Secure)</title>
		<link>http://blog.eltallerweb.com/https-hypertext-transfer-protocol-secure/</link>
		<comments>http://blog.eltallerweb.com/https-hypertext-transfer-protocol-secure/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 18:34:54 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[certificado]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[pagina web]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[seguridad]]></category>
		<category><![CDATA[sitio]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=624</guid>
		<description><![CDATA[Por Juan Carlos Sosa, @JuanC_Sosa Alguna vez te has preguntado ¿cómo se logra obtener o qué es el famoso HTTPS que vemos en algunas direcciones URL?. ¿Qué es? Utiliza un cifrado basado en SSL/TLS para crear un canal ]]></description>
				<content:encoded><![CDATA[<p>Por Juan Carlos Sosa, <a href="http://twitter.com/#!/@JuanC_Sosa">@JuanC_Sosa</a></p>
<p>Alguna vez te has preguntado ¿cómo se logra obtener o qué es el famoso HTTPS que vemos en algunas direcciones URL?.</p>
<p><strong>¿Qué es?</strong></p>
<p>Utiliza un cifrado basado en SSL/TLS para crear un canal cifrado (cuyo nivel de cifrado depende del servidor remoto y del navegador utilizado por el cliente) más apropiado para el tráfico de información sensible que el protocolo HTTP. De este modo se consigue que la información sensible (usuario y claves de paso normalmente) no pueda ser usada por un atacante que haya conseguido interceptar la transferencia de datos de la conexión, ya que lo único que obtendrá será un flujo de datos cifrados que le resultará imposible de descifrar.</p>
<p>El puerto estándar para este protocolo es el 443. <em>(Fuente: es.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure )</em></p>
<p><strong>¿Cómo obtengo un Certificado SSL para mi sitio web? </strong></p>
<p>A continuación una descripción paso a paso :</p>
<p>&nbsp;</p>
<p><em><strong>1 Asegurate que OpenSSL esté instalado en tu PATH de Linux.</strong></em></p>
<p>&nbsp;</p>
<p><em><strong>2 Crea una llave privada RSA para tu servidor  Apache</strong> </em>(será Triple-DES encriptada y en formato PEM): <strong>$ openssl genrsa -des3 -out server.key 1024</strong></p>
<div>
<p>NOTA: El tamaño de la llave 1024 , 2048 , 4096   &lt;&#8212; Depende del tipo del certificado</p>
</div>
<p>Haz un respaldo del archivo de llave server.key en un lugar seguro. Si quieres ver los detalles de la llave privada que acabas de crear entonces usa el siguiente comando: $ openssl rsa -noout -text -in server.key</p>
<p>Si es necesario puedes crear una versión no encriptada PEM de la llave privada con: <strong>$ openssl rsa -in server.key -out server.key.unsecure</strong></p>
<div>
<p>NOTA: Esto se hace cuando no queremos que nos pida el PASSPRASHE cada vez que iniciamos el Apache (httpd) y así en lugar de usar la llave encriptada en la configuración del dominio agregamos la referencia a la llave no encriptada.</p>
</div>
<p>&nbsp;</p>
<p><strong><em>3 Crea un archivo CSR </em></strong><em>(</em>Certificate Signing Request) utilizando la llave privada RSA que creamos previamente y para esto utilizamos el siguiente comando: <strong>$ openssl req -new -key server.key -out server.csr</strong></p>
<p>En este paso nos pedirá información acerca de el dominio que queremos tener bajo HTTPS, hay que asegurarnos de ingresar el FQDN (&#8220;Fully Qualified Domain Name&#8221;) del servidor cuando el OpenSSL te lo pregunte lo que sería el &#8220;CommonName&#8221;, ejemplo cuando generamos un CSR para un sitio web el cual será accesado de la forma  https://www.foo.dom/,  entonces tendremos que ingresar &#8220;www.foo.dom&#8221; en este campo. Al final después de creado el archivo podrás ver el contenido del CSR utilizando: $ openssl req -noout -text -in server.csr</p>
<p>&nbsp;</p>
<p><em><strong>4  Ahora debemos enviar este el Certificate Signing Request (CSR) a un Autoridad Certificadora (CA)</strong></em> al cual deberás pagar para que te firme o valide. Una vez que el CSR ha sido firmado entonces obtendrás un Certificado el cual podrás usar en tu servidor Apache; el Certificado que te manden lo almacenas en un archivo con terminación .crt (server.crt ). Estas son algunas Autoridades Certificadoras:</p>
<p>Verisign http://digitalid.verisign.com/server/apacheNotice.htm</p>
<p>Thawte http://www.thawte.com/</p>
<p>CertiSign Certificadora Digital Ltda. http://www.certisign.com.br</p>
<p>IKS GmbH http://www.iks-jena.de/leistungen/ca/</p>
<p>Uptime Commerce Ltd. http://www.uptimecommerce.com</p>
<p>BelSign NV/SA http://www.belsign.be</p>
<p>GeoTrust http://www.geotrust.com/</p>
<p>Si desear ver los detalles de tu certificado firmado necesitas usar el siguiente comando: <strong>$ openssl x509 -noout -text -in server.crt</strong></p>
<p>&nbsp;</p>
<p><strong><em>5 Ahora tendremos dos archivos: server.key y server.crt.</em></strong> Estos pueden ser utilizados en tu archivo de configuración httpd.conf  o en el Virtualhost del dominio de la siguiente manera:</p>
<div>
<p>      SSLCertificateFile    /path/to/this/server.crt</p>
<p>SSLCertificateKeyFile /path/to/this/server.key</p>
</div>
<p><strong><em>6 Necesitaras una  IP dedicada para cada SSL si es que en el server alojas más de un dominio,</em></strong>  en este caso deberás solicitarla con tu proveedor de servicios de hosting.<strong> </strong>El archivo server.csr ya no se necesita más.</p>
<p><strong> </strong></p>
<p>Espero que esta información te sea útil.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/https-hypertext-transfer-protocol-secure/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>Zend\Form &#8211; Formularios en ZendFramework 2</title>
		<link>http://blog.eltallerweb.com/zendform-formularios-en-zendframework-2/</link>
		<comments>http://blog.eltallerweb.com/zendform-formularios-en-zendframework-2/#comments</comments>
		<pubDate>Mon, 17 Dec 2012 18:00:44 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[etiquetas]]></category>
		<category><![CDATA[Famework 2]]></category>
		<category><![CDATA[fomas]]></category>
		<category><![CDATA[formularios]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=432</guid>
		<description><![CDATA[Por Juan Carlos Sosa, @JuanC_Sosa Debemos recordar lo complicado que era hacer formularios complejos con el componente Form en ZendFramework 1; un formulario que te llevaba un par de horas se podía extender hasta más de ]]></description>
				<content:encoded><![CDATA[<p>Por Juan Carlos Sosa, @JuanC_Sosa</p>
<p>Debemos recordar lo complicado que era hacer formularios complejos con el componente Form en ZendFramework 1; un formulario que te llevaba un par de horas se podía extender hasta más de cinco horas dependiendo de la complejidad del diseño, debido a que los decoradores (decorators) son un poco ambiguos y a veces, practicamente se lograba el resultado final a prueba y error, sin olvidar los dolores de cabeza y la presión para entregar el resultado.</p>
<p>Afortunadamente para ZendFramework 2 los decoradores han desaparecido, lo que para algunos fueron excelentes noticias (me incluyo) para otros no fue algo con lo que estuvieran muy de acuerdo. Lo que se implementó en el nuevo componente Zend\Form es una separación de los conceptos, es decir, podremos manejar totalmente en partes cada parte que conforma un campo de entrada de datos en un formulario (etiquetas, mensajes de error, campos de texto, checkbox, etc.)</p>
<p>Veremos ahora un poco de código para entender como se hace esto.</p>
<p>Consideren lo siguiente:</p>
<p>&#8211; Un simple formulario con para obtener la contraseña olvidada: caja de texto para correo electrónico y el botón de envío de datos al server.</p>
<p>El código en la clase de formulario sería de la siguiente forma:</p>
<p><em>namespace Application\Form;</em></p>
<p><em>use Zend\Form\Form;</em></p>
<p><em>class ObtenPass extends Form</em></p>
<p><em>{</em></p>
<p><em>     public function __construct($name = null)</em></p>
<p><em>    {</em></p>
<p><em> </em><em>                $this-&gt;add(array(</em></p>
<p><em>                                &#8216;name&#8217; =&gt; &#8217;email&#8217;,</em></p>
<p><em>                                &#8216;type&#8217; =&gt; &#8216;Zend\Form\Element\Text&#8217;,</em></p>
<p><em>                                &#8216;options&#8217; =&gt; array(</em></p>
<p><em>                                &#8216;label&#8217; =&gt; Tu Correo&#8217;,</em></p>
<p><em>                                ),</em></p>
<p><em>                                &#8216;attributes&#8217; =&gt; array(&#8216;id&#8217; =&gt; &#8217;email&#8217;),</em></p>
<p><em>                ));</em></p>
<p><em> </em><em>                $this-&gt;add(array(</em></p>
<p><em>                                &#8216;name&#8217; =&gt; &#8216;submit&#8217;,</em></p>
<p><em>                                &#8216;type&#8217; =&gt; &#8216;Zend\Form\Element\Submit&#8217;,</em></p>
<p><em>                                &#8216;attributes&#8217; =&gt; array(</em></p>
<p><em>                                &#8216;value&#8217; =&gt; &#8216;Obtener&#8217;,</em></p>
<p><em>                                &#8216;class&#8217; =&gt; &#8216;btn-success&#8217;,</em></p>
<p><em>                                </em><em>),</em></p>
<p><em>                ));</em></p>
<p><em> </em><em>    }</em></p>
<p><em>}</em></p>
<p>En el controlador tendríamos lo siguiente:</p>
<p><em>namespace Application\Controller;</em></p>
<p><em>use Zend\Mvc\Controller\AbstractActionController;</em></p>
<p><em>use Application\Form\</em><em>ObtenPass </em><em>as </em><em>ObtenPass</em><em>Form;</em></p>
<p><em>class IndexController extends AbstractActionController</em></p>
<p><em>{</em></p>
<p><em>public function </em><em>obtenPass</em><em>FormAction()</em></p>
<p><em>{</em></p>
<p><em>$form = new </em><em>ObtenPass</em><em>Form();</em></p>
<p><em>return array(&#8216;form&#8217; =&gt; $form);</em></p>
<p><em>}</em></p>
<p><em>}</em></p>
<p>Ahora la parte interesante, ¿cómo lo representamos en la vista (view)?</p>
<p>Veamos más código.</p>
<p><em>$form = $this-&gt;form;</em></p>
<p><em>$form-&gt;setAttribute(&#8216;action&#8217;, $this-&gt;url(obten-pass&#8217;));</em></p>
<p><em> </em><em>$form-&gt;prepare();</em></p>
<p><em> </em><em>echo $this-&gt;form()-&gt;openTag($form) . PHP_EOL;</em></p>
<p><em> </em><em>echo $this-&gt;formLabel($form-&gt;get(&#8217;email&#8217;)) . PHP_EOL;</em></p>
<p><em> </em><em>echo $this-&gt;formInput($form-&gt;get(&#8217;email&#8217;)) . PHP_EOL;</em></p>
<p><em> </em><em>echo $this-&gt;FormElementErrors($form-&gt;get(&#8217;email&#8217;)) . PHP_EOL;</em></p>
<p><em> </em><em>echo $this-&gt;formSubmit($form-&gt;get(&#8216;submit&#8217;)) . PHP_EOL;</em></p>
<p><em> </em><em>echo $this-&gt;form()-&gt;closeTag($form) . </em><em>PHP_EOL;</em></p>
<p>Como se puede observar claramente tenemos cada parte del elemento del formulario por separado, esto gracias a los ViewHelpers que ya se encuentran listos para usar dentro de ZendFramework 2;  de tal formar que podemos insertar cada pieza de este en diferentes tags de HTML y prácticamente acomodarlos a nuestro gusto o adaptarlo a un código HTML que previamente nos hayan proporcionado.</p>
<p>En mi opinión esto es una maravilla. ¿Y tú qué opinas?</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/zendform-formularios-en-zendframework-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comandos básicos de Linux</title>
		<link>http://blog.eltallerweb.com/comandos-basicos-de-linux/</link>
		<comments>http://blog.eltallerweb.com/comandos-basicos-de-linux/#comments</comments>
		<pubDate>Fri, 30 Nov 2012 18:13:21 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=391</guid>
		<description><![CDATA[Por Fernando Sánchez, @razzek Que tal, en esta ocasión me gustaría compartir con ustedes este documento de comandos básicos de Linux, el cual fue recabado directamente del Manual de Linux. Espero les sea de utilidad: ]]></description>
				<content:encoded><![CDATA[<p>Por Fernando Sánchez, @razzek</p>
<p>Que tal, en esta ocasión me gustaría compartir con ustedes este documento de comandos básicos de Linux, el cual fue recabado directamente del Manual de Linux. Espero les sea de utilidad:</p>
<p>$                      Antes de una variable nos permite acceder a su valor</p>
<p>Ejemplo:</p>
<p>$ echo $variable</p>
<p>;                       Separa dos comandos en una misma línea</p>
<p>Ejemplo:</p>
<p>$ read variable ; echo el valor de variable es: $variable</p>
<p>awk                 Escáner de patrones y lenguaje de programación para procesar textos</p>
<p>Ejemplo:</p>
<p>$ echo Hola amigo como estas | awk &#8216;{ print $1, $2 &#8220;!,&#8221;,  $3, $4 &#8220;?&#8221; }&#8217;</p>
<p>Algunos ejemplos de comandos básicos de Linux, que son ayuda para la utilización del sistema operativo son:</p>
<p>cal                    Muestra el calendario del mes actual</p>
<p>cat                   Muestra el contenido de un fichero</p>
<p>cd                     Cambia de directorio de trabajo y si este no se indica, nos traslada a $HOME</p>
<p>chgrp              Cambia el grupo propietario de un fichero</p>
<p>chmod            Cambia los permisos de un fichero</p>
<p>chown             Cambia el propietario de un fichero</p>
<p>clear                Limpia la información que hay en pantalla</p>
<p>cp                     Copia archivos y directorios</p>
<p>Ejemplo:</p>
<p>cp archivo1.txt archivo1_respaldo.txt</p>
<p>cut                   Elimina partes de ficheros</p>
<p>Ejemplo:</p>
<p>echo Hola amigo como estas | cut -d &#8221; &#8221; -f 2</p>
<p>date                 Muestra hora y fecha actual</p>
<p>df                      Muestra el espacio del disco</p>
<p>du                    Calcula el espacio de disco usado</p>
<p>echo                 Imprime en pantalla</p>
<p>env                  Muestra las variables de entorno del programa</p>
<p>exit                  Termina la sesión</p>
<p>export             Exporta una variable al entorno del programa</p>
<p>false                 Falso, boleano</p>
<p>file                    Indica de qué tipo es un fichero</p>
<p>find                  Búsqueda avanzada de ficheros</p>
<p>fmt                   Da formato los párrafos de un fichero</p>
<p>grep                 Busca ocurrencias de una cadena en un fichero</p>
<p>gunzip             Descomprime un fichero comprimido con gzip</p>
<p>gzip                  Comprime un fichero</p>
<p>halt                   Apaga la máquina</p>
<p>head                 Muestra &#8220;n&#8221; líneas del inicio de un fichero (10 por defecto)</p>
<p>kill                    Termina un proceso indicando su PID (Identificador del proceso)</p>
<p>ldd                    Muestra las librerías que usa un programa</p>
<p>less                   Una versión más elaborada de &#8220;more&#8221; que permite desplazarnos por el texto, hacer búsquedas, etc.</p>
<p>ln                      Enlazar (referenciar) ficheros</p>
<p>locate               Busca ficheros</p>
<p>logout              Termina la sesión y muestra el login del sistema</p>
<p>ls                       Muestra el contenido de un directorio</p>
<p>mail                 Programa simple para enviar y leer correo</p>
<p>man                 Muestra la página del manual de un comando</p>
<p>mkdir              Crea directorios</p>
<p>more                Muestra el contenido de un fichero haciendo pausas entre pantallas si el fichero es largo</p>
<p>mv                    Mueve ficheros</p>
<p>passwd             Cambia la contraseña de un usuario</p>
<p>ps                      Muestra los procesos en el sistema</p>
<p>pwd                  Muestra el directorio de trabajo actual</p>
<p>read                 Lee una línea de la entrada estándar y la almacena en una variable</p>
<p>reboot              Reinicia la máquina</p>
<p>reset                 Restaura la terminal de texto</p>
<p>rm                    Borra ficheros</p>
<p>rmdir               Borra directorios (vacíos)</p>
<p>sed                    Realiza transformaciones en flujos de bytes</p>
<p>seq                    Genera una secuencia de números</p>
<p>shutdown       Apaga o reinicia la máquina</p>
<p>sleep                 Detiene el proceso durante &#8220;n&#8221; segundos</p>
<p>sort                   Ordena ficheros de texto</p>
<p>tac                    Concatena ficheros y los muestra a la inversa</p>
<p>tail                   Muestra las &#8220;n&#8221; últimas líneas de un fichero (10 por defecto)</p>
<p>tar                    Empaquetar ficheros</p>
<p>touch               Actualiza la fecha y hora de un fichero, si no existe lo crea</p>
<p>tr                      Elimina o traduce caracteres</p>
<p>true                 Cierto, o uno</p>
<p>uniq                 Lee de &#8220;stdin&#8221; y compara líneas adyacentes escribiendo las líneas únicas a &#8220;stdout&#8221;</p>
<p>wc                     Cuenta lineas, palabras o bytes en ficheros</p>
<p>whereis            Indica donde se puede encontrar un fuente, binario o manual</p>
<p>which               Indica donde está un comando</p>
<p>who                   Quién tiene sesión abierta en la máquina</p>
<p>zcat                   Muestra el contenido de un fichero comprimido con gzip</p>
<p>La intención de compartir estos comandos es que los aprendamos para más adelante ver Programación Shell.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/comandos-basicos-de-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acerca de JSON y PHP</title>
		<link>http://blog.eltallerweb.com/acerca-de-json-y-php/</link>
		<comments>http://blog.eltallerweb.com/acerca-de-json-y-php/#comments</comments>
		<pubDate>Mon, 15 Oct 2012 14:50:56 +0000</pubDate>
		<dc:creator><![CDATA[Joge23]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=225</guid>
		<description><![CDATA[Por Juan Carlos Sosa, @JuanC_Sosa En esta ocasión les hablaré acerca de JavaScript Object Notation (JSON, en español se conoce como Notación de Objetos de JavaScript), que es una notación Javascript para escribir objetos que ]]></description>
				<content:encoded><![CDATA[<p>Por Juan Carlos Sosa, @JuanC_Sosa</p>
<p>En esta ocasión les hablaré acerca de JavaScript Object Notation (JSON, en español se conoce como Notación de Objetos de JavaScript), que es una notación Javascript para escribir objetos que se ha hecho popular en el mundo del desarrollo de webs, componentes (Ajax), entre otros. Es una excelente forma para almacenar la información que deseamos compartir en distintos componentes o lenguajes de las aplicaciones web.</p>
<p>PHP dispone de varias funciones para hacer distintos tratamientos con notación de objetos JSON, que permite convertir un objeto PHP o cualquier otro tipo de variable a un string con notación JSON, así como crear un objeto PHP a partir de un string codificado con JSON.</p>
<p>A partir de PHP 5.2 las funciones JSON están disponibles siempre, pero si utilizamos PHP 4 tendríamos que instalarlas manualmente. Para ello existen varios paquetes de librerías, que provienen de diversas fuentes que tienen funciones para tratar con JSON desde PHP.</p>
<p>&#8211; Paquete JSON de PECL</p>
<p>Este paquete, del repositorio de librerías PHP PECL, es compatible con PHP 4.3.0 o superior. En versiones superiores a PHP 5.2 está disponible por defecto. En versiones anteriores del lenguaje se tendría que instalar de manera separada.</p>
<p>&#8211; Librería JSON-PHP</p>
<p>Es una librería de funciones que se conoce también con el nombre de &#8220;Services_JSON&#8221;. Originariamente escrita por Michal Migurski, en la actualidad se encuentra disponible dentro del framework PHP PEAR: <a href="http://pear.php.net/package/Services_JSON">http://pear.php.net/package/Services_JSON</a></p>
<p>&#8211; JSON Lib en Zend Framework</p>
<p>Es una librería de funciones para tratamiento con JSON que forma parte del framework PHP Zend.</p>
<p>Así que, si nuestro servidor PHP no dispone de las funciones JSON por estar poco actualizado, nos costará mucho menos esfuerzo y dolores de cabeza utilizar otra librería distinta a la básica de PECL. En este caso, por la facilidad de instalación, se recomendaría la utilización de la librería que viene en PEAR, que se puede descargar del propio sitio de PEAR, en la URL <a href="http://pear.php.net/package/Services_JSON">http://pear.php.net/package/Services_JSON</a></p>
<p>JSON es un formato ligero, fácil de escribir y codificar; por lo que ha sido adoptado universalmente. Para más informaciónvisita el sitio <a href="http://www.json.org.">http://www.json.org/.</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/acerca-de-json-y-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
