<?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</title>
	<atom:link href="http://blog.eltallerweb.com/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>¿PMP, SCRUM, MAGTIC, CMMI? Y todo esto ¿con qué se come?</title>
		<link>http://blog.eltallerweb.com/pmp-scrum-magtic-cmmi-y-todo-esto-con-que-se-come/</link>
		<comments>http://blog.eltallerweb.com/pmp-scrum-magtic-cmmi-y-todo-esto-con-que-se-come/#comments</comments>
		<pubDate>Thu, 28 May 2015 21:59:06 +0000</pubDate>
		<dc:creator><![CDATA[Patricia Lopez]]></dc:creator>
				<category><![CDATA[Gestión de Proyectos]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=880</guid>
		<description><![CDATA[Imagen tomada de http://qlu.ac.pa/ Si bien en la universidad llegue a estudiar alguno de estos temas fue hasta el ámbito laboral donde tuve mis primeras experiencias con la gestión de proyectos. Antes de explicar el ]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.eltallerweb.com/wp-content/uploads/2015/05/Proyectos.jpg"><img class=" size-medium wp-image-881 aligncenter" src="http://blog.eltallerweb.com/wp-content/uploads/2015/05/Proyectos-300x156.jpg" alt="Proyectos" width="300" height="156" /></a></p>
<p style="text-align: center; font-size: 10px; color: #878787;">Imagen tomada de http://qlu.ac.pa/</p>
<p></br>Si bien en la universidad llegue a estudiar alguno de estos temas fue hasta el ámbito laboral donde tuve mis primeras experiencias con la gestión de proyectos.</p>
<p></br>
<p style"text-align:justify">Antes de explicar el porque de cada metodología o modelo, es importante mencionar que en la administración de proyectos existen tres términos básicos que debemos diferenciar, el primero es el <strong>producto</strong>, por ejemplo, el sitio WEB, sistema, aquello que se va a crear y/o modificar, segundo el <strong>proyecto</strong>, es decir, la serie de actividades y recursos que nos ayudaran a generar el producto y tercero, el <strong>entregable</strong> refiriéndonos a la serie de documentos donde se definen las características del producto y/o del proyecto según sea el caso.</p>
<p></br>PMP se enfoca a la gestión de cualquier tipo de <strong>proyecto</strong> tomando en cuenta 9 áreas de conocimiento <i>(Integración, Alcance, Tiempo, Costos, Calidad, Recursos, Comunicación, Riesgos, Adquisiciones)</i> y 5 grupos de procesos <i>(Inicio, Planificación, Ejecución, Seguimiento y Control, Cierre)</i> mientras que las metodologías ágiles y tradicionales como SCRUM, XP, RUP se basan en la gestión de proyectos exclusivamente de desarrollo de software es decir su principal enfoque esta en <strong>el producto</strong> cada una con sus ventajas y desventajas.</p>
<p></br>Se han creado también modelos para la mejora de los procesos y medición de estos durante el desarrollo de productos y servicios tecnológicos y es aquí donde entra CMMI, ITIL, COBIT.</p>
<p></br>Finalmente tenemos MAAGTIC, un manual que define una serie de procesos para la administración de TIC&#8217;s de manera ágil y oportuna en las instituciones de gobierno, este manual fue emitido por la Secretaría de la Función Publica hace algunos años y concentra las mejores prácticas internacionales como 6Sigma, COBIT, ISO, CMMI, PMI, ITIL, MoProSoft, Rational Unified Process.</p>
<p></br>En conclusión, independientemente del tipo de proyecto siempre es necesario contar con una guía para gestionar las actividades a realizar durante este proceso con el fin de cubrir las necesidades y expectativas del cliente así como las de la empresa o institución.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/pmp-scrum-magtic-cmmi-y-todo-esto-con-que-se-come/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Que siempre&#8230; Visual Studio Code para Linux y OSX</title>
		<link>http://blog.eltallerweb.com/que-siempre-visual-studio-code-para-linux-y-osx/</link>
		<comments>http://blog.eltallerweb.com/que-siempre-visual-studio-code-para-linux-y-osx/#comments</comments>
		<pubDate>Tue, 19 May 2015 17:40:06 +0000</pubDate>
		<dc:creator><![CDATA[jmosqueda]]></dc:creator>
				<category><![CDATA[Tecnología]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[multiplataforma]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=866</guid>
		<description><![CDATA[Pues sí, el universo de los editores de código es un universo muy competido: de los clásicos como Vim o Emacs (la eterna lucha), hasta Sublime Text y Atom pasando por pesos pesados como TextPad ]]></description>
				<content:encoded><![CDATA[<p>Pues sí, el universo de los editores de código es un universo muy competido: de los clásicos como Vim o Emacs (la eterna lucha), hasta Sublime Text y Atom pasando por pesos pesados como TextPad o DreamWeaver, la oferta es tremenda y <strong>Microsoft</strong>, en su conferencia <a href="http://www.buildwindows.com/">Build 2015</a> celebrada en San Francisco hace tan algunos días ha presentado<strong>Visual Studio Code</strong>, el juguete nuevo  de muy buen ver en el mundo de los editores de código.</p>
<p>El editor (que <a href="http://go.microsoft.com/fwlink/?LinkID=533688" target="_blank">ya está disponible</a> para todo el que lo requiera) cuenta con múltiples lenguajes, como <strong>Node.js, TypeScript y JavaScript, entre muchos otros</strong>, los cuales también cuentan con diversas características enriquecidas, para así brindar a los programadores un mayor abanico de opciones a la hora de desarrollar sus softwares.También si te gusta jugar un rato, puedes configurar tu Visual Studio Code para poder correr un proyecto ASP.NET.</p>
<p><strong>Gratuito, multiplataforma</strong> (Windows, Linux y MAc), elegante, con soporte integrado para Git, auto-detección (y coloreado de sintaxis y autocompletar) de decenas de lenguajes,<strong>completo debugeador</strong>&#8230; las razones de este recién salido del horno Visual Studio Code son bastantes poderosas y le meten de lleno en la pelea.</p>
<p>Sin duda este inesperado movimiento dará mucho que hablar en la comunidad, y es que parece que a Microsoft se le han quitado todos los complejos a la hora de ofrecer productos multiplataforma. De hecho, durante la presentación del Visual Studio Code les hemos visto utilizarlo tanto en OS X como en Ubuntu. ¿Qué tal?.</p>
<p><a href="http://blog.eltallerweb.com/wp-content/uploads/2015/05/code_multi.jpg"><img class="alignnone size-full wp-image-868" src="http://blog.eltallerweb.com/wp-content/uploads/2015/05/code_multi.jpg" alt="code_multi" width="650" height="332" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/que-siempre-visual-studio-code-para-linux-y-osx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducción a Sharepoint</title>
		<link>http://blog.eltallerweb.com/introduccion-a-sharepoint/</link>
		<comments>http://blog.eltallerweb.com/introduccion-a-sharepoint/#comments</comments>
		<pubDate>Tue, 19 May 2015 17:36:45 +0000</pubDate>
		<dc:creator><![CDATA[Oscar Reyes]]></dc:creator>
				<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=864</guid>
		<description><![CDATA[¿Qué es Sharepoint? Es una plataforma de colaboración empresarial que permite de forma ágil, flexible y escalable poder construir soluciones para comunidades,  contenido, búsquedas, inteligencia de negocios, aplicaciones, sitios internos y externos. ¿Por que usar ]]></description>
				<content:encoded><![CDATA[<h1>¿Qué es Sharepoint?</h1>
<p>Es una plataforma de colaboración empresarial que permite de forma ágil, flexible y escalable poder construir soluciones para comunidades,  contenido, búsquedas, inteligencia de negocios, aplicaciones, sitios internos y externos.</p>
<p><a href="http://blog.eltallerweb.com/wp-content/uploads/2015/05/tortamoss2010.png"><img class=" size-medium wp-image-873 aligncenter" src="http://blog.eltallerweb.com/wp-content/uploads/2015/05/tortamoss2010-300x284.png" alt="tortamoss2010" width="300" height="284" /></a></p>
<h2>¿Por que usar Sharepoint?</h2>
<p>Al ser una plataforma que permite agilidad y flexibilidad se puede tener una forma regulada conforme a las normativas de la empresa y permitir una mejor colaboración entre los empleados y poder poner el conocimiento a disposición de todos. Esto ayuda a tener una mejor gestión de los proyectos.</p>
<p><strong>Ventajas</strong></p>
<ul>
<li>Se tiene una gestionar de forma ágil y rápida en toda la información de la empresa.</li>
<li>Poder compartir archivos de una forma centralizada.</li>
<li>Fomenta el trabajo en colaboración.</li>
<li>Se tiene una gran reducción de la duplicidad de tareas.</li>
<li>En cualquier momento y desde cualquier lugar se hace una búsqueda rápida de la información.</li>
</ul>
<p><strong>Beneficios</strong></p>
<ul>
<li>Con las herramientas de colaboración se tiene un gran aumento de la productividad.</li>
<li>Permite grandes ventaja competitiva gracias al incremento de la eficiencia.</li>
<li>Enriquece la colaboración en toda la empresa y con terceros.</li>
<li>Con una única infraestructura se tiene una reducción de costes.</li>
<li>Mejora la capacidad de respuesta antes las necesidades de la empresa.</li>
</ul>
<h2>Característica de sitios en Sharepoint</h2>
<p><strong>Experiencia de usuario</strong></p>
<ul>
<li>Edición sencilla de contenido.</li>
<li>Utilización con la cinta de office.</li>
<li>Sincronización offline con Sharepoint Workspace.</li>
</ul>
<p><strong>Acceso universal</strong></p>
<ul>
<li>Cliente para dispositivos móviles.</li>
<li>Edición de3 documentos con las aplicaciones de Office.</li>
<li>Soporte milti-navegador (IE, Firefox, Safari).</li>
</ul>
<p><strong>Plataforma universal</strong></p>
<ul>
<li>Colaboración en entornos Intranet y extranet.</li>
<li>Interoperabilidad mediante estándares.</li>
<li>Cumple estándar de accesibilidad WCAG 2.0.</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/introduccion-a-sharepoint/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>Usar stored procedures desde Zend Framework 2</title>
		<link>http://blog.eltallerweb.com/usar-stored-procedures-desde-zend-framework-2/</link>
		<comments>http://blog.eltallerweb.com/usar-stored-procedures-desde-zend-framework-2/#comments</comments>
		<pubDate>Mon, 18 May 2015 22:06:47 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Zend Framework 2]]></category>
		<category><![CDATA[base de datos]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=809</guid>
		<description><![CDATA[En esta ocasión veremos cómo usar stored procedures desde Zend Framework 2, en realidad, ejecutar o llamar un stored procedure no es muy diferente de ejecutar cualquier otra consulta. Pero veamos un ejemplo para ver ]]></description>
				<content:encoded><![CDATA[<p><!-- P { margin-bottom: 0.08in; } --><span style="font-family: DejaVu Sans,sans-serif;">En esta ocasión veremos cómo usar stored procedures desde Zend Framework 2, en realidad, ejecutar o llamar un stored procedure no es muy diferente de ejecutar cualquier otra consulta. Pero veamos un ejemplo para ver esto más claramente.</span></p>
<p><span style="font-family: DejaVu Sans,sans-serif;">Partamos de una tabla en MySQL con el siguiente contenido:</span></p>
<p><span style="font-family: FreeMono,monospace;">+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+ </span></p>
<p><span style="font-family: FreeMono,monospace;">| cvepedido | total | usuario | status | </span></p>
<p><span style="font-family: FreeMono,monospace;">+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+ </span></p>
<p><span style="font-family: FreeMono,monospace;">| 1 | 82.65 | 4 | abierta | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 2 | 11.60 | 7 | abierta | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 3 | 76.56 | 10 | cerrada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 4 | 50.23 | 7 | cerrada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 5 | 65.43 | 4 | cancelada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 6 | 91.03 | 5 | cancelada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 7 | 40.69 | 8 | cancelada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 8 | 53.92 | 5 | cancelada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 9 | 58.28 | 6 | abierta | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 10 | 21.96 | 4 | enviada | </span></p>
<p><span style="font-family: FreeMono,monospace;">| 11 | 92.72 | 7 | enviada | </span></p>
<p><span style="font-family: FreeMono,monospace;">+&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;+ </span></p>
<p><span style="font-family: DejaVu Sans,sans-serif;">De esta tabla lo más importante para nuestro ejemplo serám las columna total y status, pues las usaremos en el siguiente stored procedure:</span></p>
<p><span style="font-family: FreeMono,monospace;">CREATE PROCEDURE promedioStatus(IN estado varchar(20),OUT promedio float(10,2)) </span></p>
<p><span style="font-family: FreeMono,monospace;">BEGIN </span></p>
<p><span style="font-family: FreeMono,monospace;">select AVG(total) into promedio from pedidos where status=estado; </span></p>
<p><span style="font-family: FreeMono,monospace;">END</span></p>
<p><span style="font-family: DejaVu Sans,sans-serif;">Este procedimiento, es simple, recibe 2 parámetros uno de entrada y otro de salida, el de entrada es el status que se usará para calcular el promedio del total de los pedidos, promedio que será almacenada en el parametro de entrada “promedio”.</span></p>
<p><span style="font-family: DejaVu Sans,sans-serif;">Ahora entramos al Zend Framework 2 usaremos un patrón Table Module con el componente Zend\Db de Zend Framework 2. Lo primero sería colocar la configuración de BD y el adaptador.</span></p>
<pre class="brush: php; title: ; notranslate">

&lt;?php
return array(

'db' =&gt; array(

'driver' =&gt; 'pdo_mysql',

'host' =&gt; 'localhost',

'username' =&gt; 'xxxx',

'password' =&gt; 'xxxxxxxx',

'dbname' =&gt; 'xxxxxx'

),

'service_manager' =&gt; array(

'factories' =&gt; array(

'DbAdapter' =&gt; 'Zend\Db\Adapter\AdapterServiceFactory'

)

)

);

</pre>
<p><span style="font-family: DejaVu Sans,sans-serif;">Ahora hay que crear la clase para la Tabla</span></p>
<pre class="brush: php; title: ; notranslate">

&lt;?php

namespace Application\Model;

use Zend\Db\TableGateway\TableGateway;

use Zend\Db\Adapter\Adapter;

class PedidosTable

{

/**
*
* @var TableGateway
*/

protected $tableGateway;

public function __construct(Adapter $adapter)

{

$this-&gt;tableGateway=new TableGateway('pedidos', $adapter);

}

}

</pre>
<p align="LEFT"><span style="color: #000000;"><span style="font-family: DejaVu Sans,sans-serif;"><span style="font-size: small;">Aquí en el constructor recibimos el adaptador de BD y creamos el Objeto TableGateway que estará dentro de una propiedad, desde el podremos llamar cualquier operación de BD y la idea es envolver esas operaciónes, querys y llamadas a store procedures dentro de métodos que describan esas operaciones en terminos de funcionalidad de clase y no funcionalidad de tabla, es decir que digan, insertar, actualizar, borrar, sino, obtener, cambiar, quitar.</span></span></span></p>
<p align="LEFT"><span style="color: #000000;"><span style="font-family: DejaVu Sans,sans-serif;"><span style="font-size: small;">Así creamos el siguiente método que ejecuta nuestro stored procedure:</span></span></span></p>
<pre class="brush: php; title: ; notranslate">

public function obtenerPromedio($status)

{

$sql=&quot;CALL promedioStatus('{$status}',@res)&quot;;

$statement = $this-&gt;tableGateway-&gt;getAdapter()-&gt;createStatement($sql);

$statement-&gt;execute();

$query = $this-&gt;tableGateway-&gt;getAdapter()-&gt;query(&quot;select @res as resultado&quot;);

$fila=$query-&gt;execute();

$resultado=$fila-&gt;current();

return $resultado['resultado'];

}

</pre>
<p align="LEFT"> <span style="color: #000000;"><span style="font-family: DejaVu Sans,sans-serif;"><span style="font-size: small;">Dentro de este módulo tomamos el adaptador y creamos una sentencia que llame nuestro store procedure y lo ejecutamos, el resultado se almacenará en la variable @res, luego simplemente hay que hacer un query que seleccione esa variable y hacer un fetch de ese resultado.</span></span></span></p>
<p align="LEFT"> <span style="color: #000000;"><span style="font-family: DejaVu Sans,sans-serif;"><span style="font-size: small;">Lo que seguiría sería crear un servicio de esta clase para poder invocarla desde cualquier lugar donde tangamos acceso desde cualquier lugar en el que exista </span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/usar-stored-procedures-desde-zend-framework-2/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>Caso de éxito: Offers.com</title>
		<link>http://blog.eltallerweb.com/caso-de-exito-offers-com/</link>
		<comments>http://blog.eltallerweb.com/caso-de-exito-offers-com/#comments</comments>
		<pubDate>Wed, 17 Jul 2013 23:34:08 +0000</pubDate>
		<dc:creator><![CDATA[jmosqueda]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[caso]]></category>
		<category><![CDATA[exito]]></category>
		<category><![CDATA[offers]]></category>
		<category><![CDATA[php. xml]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[zend server]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=765</guid>
		<description><![CDATA[Por Lillian Domínguez Offers es subsidiaria de Vertive, Inc., su corporativo se encuentra en Austin, Texas. Todos los días Offers.com ofrece más de 15,000 ofertas, promociones, cupones, ensayos libres y liquidación de productos de las ]]></description>
				<content:encoded><![CDATA[<p>Por Lillian Domínguez</p>
<p>Offers es subsidiaria de Vertive, Inc., su corporativo se encuentra en Austin, Texas.</p>
<p>Todos los días Offers.com ofrece más de 15,000 ofertas, promociones, cupones, ensayos libres y liquidación de productos de las principales tiendas online que representa a más de 3,000 marcas reconocidas como Home Depot, American Express, Travelocity y Banana Republic.</p>
<p><strong>Su objetivo</strong>: Entregar miles de ofertas en línea de primeras marcas, que requieren que los productos puedan ser categorizados, verificados, clasificados y actualizados todos los días. Permiten a los clientes personalizar sus compras para ver tiendas, categorías, ofertas específicas y recibir actualizaciones cuando se agregan ofertas o cambios.</p>
<p>Offers.com ayudar a los consumidores a ahorrar tiempo y dinero,  a demás de encontrar las mejores ofertas para tiendas online con viajes, artículos para el hogar, ropa, software, entre otros.</p>
<p><strong>Su desafío:</strong> Crear un verdadero entorno Web 2.0 que requiere tecnología de alto rendimiento confiable y sólido bajo las mejores prácticas para apoyar este nivel de personalización, colaboración e interactividad.</p>
<p><strong>La Solución:</strong> Offers.com eligió Zend Framework, el IDE Zend Studio y el servidor de aplicaciones Web; Zend Server para una completa pila PHP probada para apoyar el ciclo de vida completo de la aplicación para sus activos de la Web de e-commerce. Zend fue elegido por su capacidad para optimizar el desarrollo de aplicaciones y gestión, reducir el tiempo para comercializar y cumplir con los objetivos de negocio para la disponibilidad y rendimiento.</p>
<p>Offers señala que &#8220;Nuestro grupo tenía experiencia en implementación de aplicaciones PHP en nuestros sitios anteriores y se estaba preparando para que Offers.com fuera una propiedad importante de la Internet. La necesidad de aumentar rápidamente nuevos desarrolladores y facilidad de mantenimiento es una gran prioridad. Entonces empezamos a utilizar el IDE Zend Studio para PHP, y nos hemos quedamos con el desde entonces. Zend Studio nos da el soporte multiplataforma para Linux y Windows que permite maximizar los recursos existentes y trabajar desde cualquier lugar&#8221;. El grupo mantiene varios entornos de desarrollo, y cada desarrollador tiene una máquina virtual. En un momento dado, este grupo maneja muchos casos de prueba del sitio.</p>
<p>Durante su primer año con Zend Server, Offers.com se convirtió en un sitio de mucho tráfico con más de 15,000 páginas. Con el aumento de tráfico a 450% interanual, el sitio está creciendo a un ritmo enérgico y el grupo está bien equipado para manejar el impacto de este crecimiento.</p>
<p>Zend Server se configura fácilmente para supervisar el rendimiento diario desde una única consola Web en todo el sitio y para enviar notificaciones por correo electrónico instantáneo cuando se detectan problemas. Podemos comprobar monitor y registros de la red a voluntad, se determina si problemas necesita atención inmediata o pueden abordarse tiempo después.</p>
<p>&#8220;Zend Server fue simple de implementar y ha sido un impulso de la productividad real en nuestro servicio a socios externos. Zend Server mejora la escalabilidad en Apache haciéndose cargo de descargas de contenidos estáticos y pasándolos a un proceso dedicado, está optimizado para descargas paralelas. Ahora podemos servir grandes archivos XML directamente del servidor de Zend más rápidamente, sin ocupar recursos del servidor.&#8221;</p>
<p>Ve aquí la historia completa porque Offers.com utiliza PHP como tecnología núcleo de largo plazo.</p>
<p><iframe style="border: 1px solid #CCC; border-width: 1px 1px 0; margin-bottom: 5px;" src="http://www.slideshare.net/slideshow/embed_code/24358790" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="479" height="511"></iframe></p>
<div style="margin-bottom: 5px;"><strong> <a title="Offers" href="http://www.slideshare.net/eltallerweb/offers-24358790" target="_blank">Offers</a> </strong> from <strong><a href="http://www.slideshare.net/eltallerweb" target="_blank">El Taller Web</a></strong></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/caso-de-exito-offers-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creación de imágenes de Amazon con API Tools</title>
		<link>http://blog.eltallerweb.com/creacion-de-imagenes-de-amazon-con-api-tools/</link>
		<comments>http://blog.eltallerweb.com/creacion-de-imagenes-de-amazon-con-api-tools/#comments</comments>
		<pubDate>Fri, 12 Jul 2013 22:26:41 +0000</pubDate>
		<dc:creator><![CDATA[preack]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=751</guid>
		<description><![CDATA[Por Ivan Jiménez En esta ocasión les voy a mostrar cómo realizar respaldos de sus instancias EC2 de Amazon por medio de las API Tools de manera automática. Las herramientas de la API de Amazon ]]></description>
				<content:encoded><![CDATA[<p>Por Ivan Jiménez</p>
<p>En esta ocasión les voy a mostrar cómo realizar respaldos de sus instancias EC2 de Amazon por medio de las API Tools de manera automática.</p>
<p>Las herramientas de la API de Amazon son los paquetes de S<em>cripts</em> de línea de comandos para el servicio web de AWS (Amazon Web Services) que se utilizan para administrar instancias.</p>
<p>Existen otras herramientas de desarrollo proporcionadas por Amazon, pero las más utilizadas para administrar instancias EC2 son:</p>
<p><strong>Amazon EC2 API Tools (http://aws.amazon.com/developertools/351). </strong></p>
<p>Estas herramientas sirven como interfaz de cliente para el servicio Web de Amazon EC2, son utilizadas para registrar, lanzar instancias, gestionar grupos de seguridad, etc.</p>
<p><strong>Amazon EC2 AMI Tools (http://aws.amazon.com/developertools/368).</strong></p>
<p>Las AMI Tools son herramientas en líneas de comandos que sirven para crear una AMI (Amazon Machine Image) existente o volumen instalado.</p>
<p>* Para instalar estas herramientas consulte la documentación de Amazon.</p>
<p>Tomando en cuenta que ya se tienen instaladas las herramientas de Amazon, procederemos con la creación del <em>Script</em>.</p>
<p><strong>Creación del <em>Script</em></strong></p>
<p>Las Tools de Amazon al no ser un programa que se instale, sino un conjunto de <em>Scripts</em> y comandos que se utilizan por terminal, es necesario definir las variables de entorno.</p>
<p><a href="http://blog.eltallerweb.com/wp-content/uploads/2013/07/script.jpg"><img class=" wp-image-752 alignnone" title="script" src="http://blog.eltallerweb.com/wp-content/uploads/2013/07/script.jpg" alt="" width="651" height="260" /></a></p>
<p><strong>Explicando el <em>Script</em></strong></p>
<p>En la primera parte del <em>Script</em> se configuran las variables de entorno, certificados y llaves Amazon, ruta de las AMI y API Tools, ruta de archivos binarios.</p>
<p><a href="http://blog.eltallerweb.com/wp-content/uploads/2013/07/crear.jpg"><img class="wp-image-755 alignnone" title="crear" src="http://blog.eltallerweb.com/wp-content/uploads/2013/07/crear.jpg" alt="" width="647" height="128" /></a></p>
<p>El comando para describir instancias es &#8220;ec2-describe-instances &#8211;headers&#8221;, pero para obtener sólo los datos que necesitamos aplicamos unos filtros con los siguientes comandos:</p>
<p><a href="http://blog.eltallerweb.com/wp-content/uploads/2013/07/describir.jpg"><img class=" wp-image-756 alignnone" title="describir" src="http://blog.eltallerweb.com/wp-content/uploads/2013/07/describir.jpg" alt="" width="660" height="20" /></a></p>
<ul>
<li>grep Name: Nos mostrará nuestras instancias listadas por nombre.</li>
</ul>
<p>TAG     instance            i-abcd   Name    nombre-instancia</p>
<ul>
<li>awk {&#8216;print $3&#8243; &#8220;$5&#8242;}: Imprimimos las columnas 3 y 5.</li>
</ul>
<p>i-abcd nombre-instancia</p>
<ul>
<li>sed &#8220;s/[ ][ ]*/:/g&#8221;: Eliminamos los espacios entre columnas y ponemos &#8220;:&#8221; como separador.</li>
</ul>
<p>i-abcd:nombre-instancia</p>
<p>Esta salida la guardaremos en un archivo de texto, en este caso llamado imagenes.txt, el cual guardará el ID y nombre de nuestras instancias con el formato que le dimos.</p>
<p>El comando para la creación de imagenes es &#8220;ec2-create-image instance_id  &#8211;name  name                           &#8211;description  description&#8221;. Como los datos los vamos a obtener de nuestro archivo de texto necesitamos leerlo y obtener la información deseada por medio de un <em>while</em> y filtros.</p>
<p><a href="http://blog.eltallerweb.com/wp-content/uploads/2013/07/crear1.jpg"><img class=" wp-image-757 alignnone" title="crear" src="http://blog.eltallerweb.com/wp-content/uploads/2013/07/crear1.jpg" alt="" width="652" height="129" /></a></p>
<ul>
<li>/bin/echo $line: Lee línea por línea el archivo imagenes.txt.</li>
<li>/bin/cut -d: -f1: Selecciona la primera columna delimitada por &#8220;:&#8221;.</li>
</ul>
<p>ec2-create-image i-abcd</p>
<ul>
<li>/bin/cut -d: -f2`_`date +%d-%m-%Y`: Para el nombre de la instancia se selecciona la segunda columna delimitada por &#8220;:&#8221;, también le agregamos la fecha actual en el formato dd:mm:aaaa.</li>
</ul>
<p>ec2-create-image i-abcd &#8211;name nombre-instancia_dd:mm:aaaa</p>
<ul>
<li>/bin/cut -d: -f2`_`date +%d-%m-%Y`: Para la descripción se utiliza el mismo nombre de la instancia y de igual manera se le agrega la fecha actual.</li>
</ul>
<p>ec2-create-image i-abcd &#8211;name nombre-instancia_dd:mm:aa &#8211;description nombre-instancia_dd:mm:aaaa</p>
<p>Finalmente, para que esta tarea se haga de forma automática, lo tenemos que programar en el <em>cron</em>, en este caso el <em>Script</em> se ejecutará todos los domingos a las 2:00 am</p>
<p>0 2 * * 7 root sh /ruta-script/script.sh</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/creacion-de-imagenes-de-amazon-con-api-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El componente Zend\Cache en ZF2</title>
		<link>http://blog.eltallerweb.com/el-componente-zendcache-en-zf2/</link>
		<comments>http://blog.eltallerweb.com/el-componente-zendcache-en-zf2/#comments</comments>
		<pubDate>Wed, 19 Jun 2013 18:33:36 +0000</pubDate>
		<dc:creator><![CDATA[igormx]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[caché]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[ZF2]]></category>

		<guid isPermaLink="false">http://blog.eltallerweb.com/?p=738</guid>
		<description><![CDATA[Por Carlos Nacianceno, @igormx El componente para el manejo de cache en ZF2, Zend\Cache ha sido completamente reescrito, ahora hace uso de muchísimas interfaces, plugins y clases abstractas. Sin embargo, al igual que su predecesor ]]></description>
				<content:encoded><![CDATA[<p>Por Carlos Nacianceno, @igormx</p>
<p dir="ltr">El componente para el manejo de cache en ZF2, Zend\Cache ha sido completamente reescrito, ahora hace uso de muchísimas interfaces,<em> plugin</em>s y clases abstractas. Sin embargo, al igual que su predecesor en ZF1, Zend\Cache sigue contando con soporte para gran número de medios de almacenaje para el caché; por ejemplo Xcache, Memcache, Redis, sistema de archivos, etc.</p>
<p><span style="font-size: 1.5em;">¿Cómo guarda la información Zend\Cache?</span></p>
<p>Principalmente a través de los<em> Adapters</em>, estos son quienes se conectan al medio de almacenaje correspondiente, servicio, base de datos, sistema de archivos, etc; su funcionalidad está descrita por algunas interfaces del componente.</p>
<p>Hay algunas clases llamadas <em>capabilities</em>, que indican capacidades de comportamiento del almacenaje. También existen clases <em>Plugins</em> que añaden funcionalidad al adaptador, normalmente cuentan con<em> listeners</em> que escuchan <em>triggers</em> de los adaptadores y tienen que ver más con el tratamiento de los datos o acciones adicionales a las tomadas por los adaptadores.</p>
<p><span style="font-size: 1.5em;">¿Qué tipo de información puede guardar Zend\Cache?</span></p>
<p>Zend\Cache tiene una serie de clases Patrón, que describen desde donde se puede guardar la información en caché. Por ejemplo CallbackCache, nos sirve para guardar en caché una respuesta de una función <em>callback</em>, OutputCache nos sirve para guardar un <em>output</em> generado por un <em>script</em>.</p>
<p><span style="font-size: 1.5em;">Un ejemplo</span></p>
<p>$cacheSalida = Zend\Cache\PatternFactory::factory(&#8216;output&#8217;, array(</p>
<p dir="ltr">   &#8216;storage&#8217; =&gt; &#8216;memcache&#8217;,<br />
));</p>
<p>$cacheSalida-&gt;start(&#8216;idCacheSalida&#8217;);<br />
echo “Esto se va a guardar en el cache”;</p>
<p dir="ltr">printf(“Esto también”);<br />
$cacheSalida-&gt;end();</p>
<p>En el ejemplo anterior, se usa el PatternFactory para “fabricar” un objeto OutputCache que use el adaptador Memcache, ya teniendo toda la salida desde el <em>start</em> hasta el <em>end</em> será guardada por el adaptador en<em> memcache</em> con el identificadir idCacheSalida.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eltallerweb.com/el-componente-zendcache-en-zf2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
