Colocar el logo junto al menú en Prestashop

logo prestashop

Si estas trabajando con Prestashop 1.6,  con la plantilla que trae por defecto y por necesidad de diseño necesitas colocar el logo junto al menú, aquí te doy una solución.

Debes saber que esta solución tendras que tocar el código, por lo que si no tienes experiencia programando, déjalo a alguien que sepa o ve con mucho cuidado.

En el archivo  header.tpl. que hallarás siguiendo la ruta :

 /themes/default-bootstrap/header.tpl 

y comenta el logo actual que está en las líneas siguientes :

<div id="header_logo">
<a href="{if isset($force_ssl) && $force_ssl}{$base_dir_ssl}{else}{$base_dir}{/if}" title="{$shop_name|escape:'html':'UTF-8'}">
<img class="logo img-responsive" src="{$logo_url}" alt="{$shop_name|escape:'html':'UTF-8'}"{if isset($logo_image_width) && $logo_image_width} width="{$logo_image_width}"{/if}{if isset($logo_image_height) && $logo_image_height} height="{$logo_image_height}"{/if}/>
</a>
</div>

Copia el código que acabas de comentar.

Otros post sobre Prestashop

Ahora ve al archivo  blocktopmenu.tpl, que es el encargado de manejar el área del menú.

Su ruta es la que veras debajo:

/themes/default-bootstrap/modules/blocktopmenu/blocktopmenu.tpl

Busca el div  que contiene el menú, que es este:

<div id="block_top_menu" class="sf-contener clearfix col-lg-12"> …

Y  justo antes de el, crea  un div del tipo :

<div class="col-sm-4 clearfix"></div>

 Y dentro pega  dentro lo que has copiado de  header.tpl, quedará algo asi:

<div class="col-sm-4 clearfix">
<a href="{if isset($force_ssl) && $force_ssl}{$base_dir_ssl}{else}{$base_dir}{/if}" title="{$shop_name|escape:'html':'UTF-8'}">
<img class="logo img-responsive" src="{$logo_url}" alt="{$shop_name|escape:'html':'UTF-8'}"{if isset($logo_image_width) && $logo_image_width} width="{$logo_image_width}"{/if}{if isset($logo_image_height) && $logo_image_height} height="{$logo_image_height}"{/if}/></a>
</div>

Puede haber, dependiendo de la versión alguna variación, pero teniendo cuidado de colocar el código correctamente funcionará

Espero haber ayudado a alguien con esto.

Un saludo

Quién va en busca de montañas, no puede detenerse a recoger las piedras del camino.

J. Martí

Búsqueda por incrementos y decremento en Laravel

laravel

Parte de la magia de este framework , es que podemos realizar búsqueda por incrementos y decremento en Laravel, aprovechando las funciones que nos ofrece Eloquent.
Esto puede sernos de mucha utilidad si asignamos valores por ejemplo a los usuarios, por participación y queremos obtener los movimientos en esos valores.

Relaciones en Laravel


Veamos un ejemplo:
En el caso siguiente asignamos inicialmente 50 puntos a cada cliente y luego obtenemos del modelo aquellos que incrementan los puntos y los que los pierden.

 $clientes = Customer::find($customer_id);
 $puntos_acumulados = $clientes->puntos_acumulados + 50;
 $clientes->update(['puntos_acumulados' => $puntos_acumulados]);
 // añadimos puntos
 Cliente::find($customer_id)->increment('puntos_acumulados', 50);
 // eliminamos puntos
 Cliente::find($customer_id)->decrement('puntos_acumulados', 50); 

Otro modo de utilizar incrementos y decrementos es aplicándolo directamente a la variable que representa al modelo por ejemplo en vez de escribir algo como:

 $productos = Producto::find($productos_id);
 $productos ->read_count++;
 $productos ->save();
 Incrementamos o decrecemos directamente asi:
 $productos = Producto::find($productos_id);
 $productos ->increment('read_count');
 O directamente en el modelo
 Producto::find(productos_id)->increment('read_count');
 Producto::find(productos_id)->increment('read_count', 5); // sumo 5
 Producto::find(productos_id)->decrement('stock'); // resto 1 

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

..Subir montaña hermana hombres…..

Encontrar la intersección en dos diccionarios en Python 3

logo python

Podemos  trabajar con intersección en dos diccionarios en Python 3, empleando el método keys.

La forma de expresarlo seria algo como esto

un_dict.keys () & otro_dict.keys 

Lo cual devolverá las claves comunes de los dos diccionarios como un conjunto.

Esta funcionalidad existía desde  Python 2.7, usando el método dict.viewkeys ().

La forma de usar  el list comprehension sería:

[key for key in some_dict if key in another_dict]

Pueden existir otras formas, una que conozco es  emplear el  contains(), pero considero estas menos recomendable.

Su forma es esta

filter (another_dict.__contains__, some_dict.keys())

Espero que sirva de ayuda a alguien.

Más sobre Python en mi blog

Muchas gracias

….un sueño es casi todo  y más que  nada, más que todo al soñarlo, casi nada después……

J.A. Buesa

Laravel nos permite añadir propiedades mutacionales.

laravel

Por si lo necesitamos, debemos saber que Laravel nos permite añadir propiedades mutacionales, que nos permitan por ejemplo obtener el nombre completo de los clientes, aunque los tengamos separados en la base de datos por apellidos y nombre.

 function getNombreCompleto() 
{
 return $this->nombres . ' ' . $this->apellidos;
}

La cual llamaremos luego desde el  modelo Cliente y  con el uso de append, podemos añadirla.

class Cliente extends Model
{
 protected $appends = ['nombre_completo'];
}

Sin embargo no termina ahí, si   quisiéramos organizar a los clientes por el nombre completo no podríamos, o sea no podemos hacer esto:

$clientes = Cliente::orderBy('nombre_completo')->get();  
Pero si organizamos los datos luego de cogerlos, con sortBy si funciona, o sea:
$clients = Client::get()->sortBy('nombre_completo');  

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

..Subir montaña hermana hombres…..

Análisis factorial. Una explicación concentrada

análisis factorial

Cuando tenemos un conjunto de datos, puede ser muy ventajoso realizar un análisis factorial para conocer cómo las variables con que contamos están relacionadas o no.

Por una cuestión lógica, si podemos agrupar en grupos o factores las diferentes variables que tenemos, nos será a la larga más fácil su análisis y comprensión, para estar en posición de tomar decisiones a partir de los datos, que es de lo en que definitiva se trata.

Existen entre los análisis estadísticos, diversas herramientas que se emplean en esta labor, en este caso me refiero al análisis factorial, comúnmente empleado, por su capacidad para agrupar en factores las variables, y analizar su implicación en el conjunto de datos.

El análisis factorial, al que llamaré, muchas veces en este post, simplemente AF; posee diferentes pasos o fases, que intentaré explicar.

Supongamos que tenemos un set de datos, por ejemplo: una encuesta, que ha sido elaborada por profesionales, siguiendo las técnicas adecuadas o no, eso no lo sabemos.

La estructura de un Análisis factorial

Lo primero necesario, seria saber si es posible y oportuno realizar un análisis factorial.

La base de un análisis de este tipo es que existan relaciones entre las variables que permitan justifiquen su agrupación.

En caso una ausencia evidente de relación entre estas, este carece de sentido, entonces para determinar si esta correlación esta presente, se realizan varias pruebas que constituyen la primera parte del AF.

Crear la matriz de correlaciones.

Todo comienza creando la matriz de correlaciones, que es una tabla de doble entrada, que muestra el valor de r (coeficiente de correlación), en cada celda que relaciona ambas variables, con un valor de que va de 0 a 1.

Lo que intenta esta, es expresar el nivel de interdependencia entre cada variable y todas al mismo tiempo.

Existen diferentes métodos, para analizar la matriz de correlación, que se utilizan de modo combinado, para determinar la conveniencia de su uso.

El índice de Kaiser-Meyer-Olkin (KMO)

Conocido por sus siglas KMO, es una medida de adecuación muestral que se emplea para comparar las magnitudes de los coeficientes de correlación general (simple), con las magnitudes de los coeficientes de correlación parcial.

Digamos que los coeficientes de correlación parcial miden o indican la fuerza de la relación existente entre dos variables, sin tener en cuenta la influencia de otras variables.

El KMO expresa que:

Si la sumatoria de los coeficientes de correlación parcial elevados al cuadrado entre todos los pares de variables, es bajo en comparación, con la suma de los coeficientes de correlación al cuadrado, entonces el índice KMO estará próximo a 1.

Los valores aceptados para el son:

KMO > 0.6 = alta correlación y es útil un análisis factorial.

KMO entre 0.5 y 0.6 = correlación media y se acepta un análisis factorial, pero es menos útil.

KMO < 0.5 no es conveniente el AF.

Que el valor sea cercano a la unidad, se considerará positivo, porque indica que las correlaciones que existen entre los pares de variables pueden ser explicadas por el resto, o dicho de otro modo, comparten factores.

En cambio, si sus valores son bajos, no sucede así, y no resulta interesante un AF.

El test de esfericidad de Bartlett

Es una prueba estadística, cuya hipótesis nula es que las variables no están correlacionadas en la población.

Por tanto, intenta comprobar que la matriz de correlaciones es una matriz de identidad, o sea que las intercorrelaciones entre las variables son cero.

Se realiza a partir de una estimación de Chi2, transformando el determinante de la matriz de correlaciones.

Si las variables no están intercorrelacionadas, entonces el test de esfericidad debe presentar un valor (p) superior al límite de 0.05; y en ese caso se rechaza la Hipótesis Nula y se continúa con el AF

El determinante de la matriz de correlaciones.

Es un índice, que mide el tamaño de las correlaciones; por tanto, si el valor del determinante es alto, indica que hay bajas correlaciones dentro de la matriz, mientras que un valor bajo indica correlaciones altas, que justifican un AF.

Para entenderlo mejor, debemos saber que las correlaciones parciales, tienen la tarea de.  representar estimaciones entre factores de carácter único, que deben estar relacionados entre si; y mientras más relacionados estén deben tender a ser próximos a cero o lo que es lo mismo si las variables independientes de nuestro estudio, poseen factores comunes, el coeficiente de correlación parcial entre los pares de variables, debe ser bajo.

Coeficiente de correlación anti-imagen.

Este es un coeficiente de correlación parcial negativo, cuya presencia indica un elevado número de coeficientes altos.

La condición para realizar el AF,  es que se observen pocos valores elevados en términos absolutos y pocos coeficientes con valor cero.

Diagonal de la matriz de correlación anti-imagen.

El rango de sus valores va de 0 a 1, siendo más favorable en la medida que se acercan a 1.

Estos valores son conocidos como MSA por sus siglas (Measure of Sampling Adecuacy), y no son más que las medidas de adecuación que presenta cada variable. Esta medida de adecuación es el resultado de comprobar, variable por variable, si es adecuado realizar el análisis factorial.

Un valor superior a 0,5 es aceptado, para continuar con el AF.

análisis factorial
análisis factorial

Una vez realizados estos tests, teniendo claro su viabilidad podemos a ejecutar el AF.

Este se compone de los siguientes pasos:

Extracción de los Factores Iniciales

Se puede hacer por varios métodos.  El más utilizado y conocido es el llamado de “Componentes Principales”.

Lo que hace, el método de “Componentes Principales” es buscar el factor que explique la mayor cantidad de la varianza en la matriz de correlación, al que se denomina  “factor principal”.

Esta varianza explicada, será luego restada de la matriz inicial lo que da lugar a una matriz residual, de la cual se extraerá a su vez un segundo factor, y así sucesivamente hasta que quede poca o ninguna varianza sin ser explicada.

Estos factores no están relacionados entre ellos y se les denomina ortogonales (perpendiculares) por esa razón.

Si obtenemos la tabla de varianza total explicada, podremos observar el total porcentual de varianza que explican los valores obtenidos, sobre nuestro problema original.

Matriz de factores o de cargas factoriales.

Esta matriz contiene la carga de los factores, es decir, la correlación o correspondencia que existe entre cada variable y dicho factor, por lo que las cargas altas indican que dicha variable es representativa del factor correspondiente.

Un punto a aclarar es que lo adecuado o ideal, sería que cada variable apareciera reflejada en un solo factor, con un valor entre 0.5 y 1, y en el resto de los factores se acercara a 0, pero  no siempre sucede y podríamos en dependencia de la estructura de nuestros datos, tener que  considerar aceptables valores inferiores.

Rotación de los Factores Iniciales

La extracción inicial de factores puede ser rotada, para intentar facilitar su interpretación.

Esto puede hacerse por dos vías, una rotación ortogonal que mantiene la independencia entre los factores rotados (equamax, quartimax y varimax) y una rotación no ortogonal, la cual ofrece nuevos factores que si se relacionan.  

La esencia de la rotación de los factores, es reducir ambigüedades en las cargas factoriales de las variables, buscando una solución nítida de lo que estamos viendo.

Es muy común que tengamos variables ambiguas que no definen bien a que factor pertenecen pues su carga es alta (<0,5) en varios de ellos.

Al aplicar la rotación, los ejes de referencia de los factores son girados alrededor del origen, hasta que alcanzan una nueva posición, donde simplifican filas o columnas de la matriz de factores.

VARIMAX, por ejemplo, redistribuye la varianza a lo largo de todos los componentes en la matriz de carga y esto aproxima las cargas altas a 1 o -1 y las cargas bajas de la matriz no rotada a 0.

De esta forma desambigua los resultados de la matriz no rotada

Denominación a los factores encontrados

El otro paso es renombrar los factores con un nombre nuevo que nos ayude a reconocer su composición (por ejemplo, las variables que lo forman)

Puntuaciones Factoriales

Finalmente toca explicar, las puntuaciones que obtienen individualmente las variables en cada uno de los factores.

Y hasta aquí

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

“Todo como el diamante, antes que luz es carbon”

JMartí

NameError: name ‘raw_input’ is not defined

python error

El mensaje de error «NameError: name ‘raw_input’ is not defined», nos dice que estamos haciendo referencia a un valor que no existe.

La explicación es sencilla, debido a que estamos usando Python 3.x para ejecutar nuestro programa, raw_input() no existe.

El error «NameError: name raw_input is not defined«, se genera cuando intentamos usar el método raw_input () en Python 3.

Para corregir este error, reemplaza todas las instancias de raw_input() con la función input() en tu código.

Otros errores de Python

Una solución que técnicamente funciona, pero que no recomiendo, es asignar el valor de raw_input() a la función input().

Podemos hacer esto, usando la asignación de variables y esto técnicamente permitirá usar raw_input () en Python 3.

Seria algo como esto:

raw_input =  input

Esta declaración, le dice a Python que el valor de raw_input() debe ser igual a input().

No se recomienda

Aunque este técnicamente probada, esta no es una buena solución, y esto es porque otros desarrolladores que lean el código pueden confundirse si ven raw_input() en una base de código de Python 3, teniendo en cuenta que en la documentación oficial de Python 3  se eliminó el nombre raw_input() a favor de input().

Espero que esto sirva de ayuda a alguien

Muchas gracias.

No podía despreciarlo, era el ultimo brindis de un bohemio por una reina

Cómo funcionan las vistas, las rutas y los controladores Laravel

laravel

Si quieres saber cómo funcionan las vistas, las rutas y los controladores Laravel, en este post intentaré explicarlo.

Sabiendo que hay mucho escrito sobre el tema, pretendo explicar muy brevemente que son estos elementos que componen Laravel.

Las vistas son los archivos HTML, donde se muestra la información de la web, las rutas son el camino que damos a esas vistas para que se vean y que pueden incluir elementos, como datos denominaciones y otros, y los controladores son los archivos o espacios donde creamos la lógica de programación o sea se encargan de ejecutar  las acciones que generan los datos.

El gestor de plantillas o vistas en Laravel se llama Blade y es el encargado de crear estas vistas que combinan el lenguaje HTML y el PHP, con una sintaxis propia.

Si escribimos en la consola el comando de artisan :

artisan route list

Obtendremos un listado de todas las rutas que tenemos, con sus nombre los controladores de donde obtienen los datos y la uri que la conforma

Por tanto el  método del controlador devuelve  casi siempre una vista la vista a la que queremos dirigir sus datos. Si el controlador no es un controlador de  recursos (resource controller es aquel que se encarga de crear un CRUD), habrá que escribir en el archivo  web.php dentro de la carpeta routes, la ruta completa que deseamos, si es de recursos, con escribir solo el nombre del modelo bastara para que cree todas las rutas para un CRUD

Route:: resource('/modelos', 'ModeloController');

Cada vez que creemos un controlador habrá que relacionar sus datos con una ruta y una vista si  deseamos que los datos se muestren.

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

…..lo que realmente importa no es lo que te da la vida, sino lo que haces con ello….

Métodos X o Y

laravel

Los métodos X o Y, son algunos de los que posee Eloquent , que agilizan y optimizan operaciones del tipo haz esto y si no esto, algunas de ellas son findOrFail  y firstOrCreate

Más de Laravel

Sin su uso, por ejemplo para lanzar un error cuando no esta usuario que esperamos, haríamos esto:

$user = User::find($id);
if (!$user) { abort (404); }

 si usamos findOrFail seria:

 si usamos findOrFail seria:

Si deseamos hallar el primer usuario con un email dado podemos hacer esto:

$user = User::where('email', $email)->first();
if (!$user) {
  User::create([
    'email' => $email
  ]);
}

O usar el método  firstOrCreate y hacerlo asi

$user = User::firstOrCreate(['email' => $email]);

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Subir montañas hermana hombres……

Translate »