Para la integración de nuestra tienda online con la empresa de transportes Correos Express, hemos elaborado un módulo que genera un documento compatible con su software, una plataforma llamada AlerEti. Este documento debe cumplir las especificaciones que el transportista indica a la hora de hacer la integración, como el número de campos y la longitud y caracteres permitidos en los mismos.
1 - Estructura de archivos de Wordpress
Vamos a analizar de manera breve y sesgada la estructura de directorios de una instalación típica de Wordpress para entenderlo mejor y ser más eficientes.
![]() |
Estructura de directorios de una instalación de Wordpress |
![]() |
Contenido de wp-content |
![]() |
Tema básico de Wordpress |
/images | Carpeta con las imágenes del tema. |
/js | Carpeta con los archivos de JavaScript |
style.css | Hoja de estilos del tema. Obligatoria para que el tema funcione. |
index.php | Obligatorio para que el tema funcione. Por defecto será la página principal. |
screenshot.png | Muestra la imagen en miniatura que se verá en el panel de adminsitración en Apariencia > Temas. |
favicon.ico | La imagen que se verá en el navegador y al guardar el marcador. |
header.php | Módulo que contiene la cabecera del tema. |
sidebar.php | La barra lateral del tema. Nota: Si queremos más de una barra lateral, se habrán de configurar de modo manual. |
footer.php | Módulo que contiene el pie de página del tema. |
single.php | Este archivo indica cómo se ve una entrada de blog. |
category.php | Muestra cómo se ve la página de resultados de una categoría. |
tag.php | Muestra cómo se ve la página de resultados de una etiqueta. |
search.php | Muestra cómo se ve la página de resultados de búsqueda. |
template.php | Plantilla de página que a título de ejemplo llamaremos template. |
functions.php | Archivo con las funciones de nuestro tema de WordPress. |
Estuvimos administrando una tienda online con Prestashop 1.4, para lo que elaboramos unos módulos personalizados para una gestión de stock rápida y fácil. La forma de gestionar el stock ha cambiado desde la versión de Prestashop 1.5, versión que nos hemos saltado por varios motivos (hay muchas discusiones al respecto).
Después de consultar las fuentes que figuran al pie de esta entrada, ahora conocemos mejor cómo las nuevas versiones como Prestashop 1.6 controlan el stock de los productos. Intuimos que este cambio ha sido causado por la aparición de software ERP programado por varias empresas (y la necesidad de éste para tiendas con amplio catálogo y variedad de combinaciones de producto).
Stock en la base de datos
Hola!
A ver en la tabla "ps_stock_available" tienes de cada producto y
para cada tienda una entrada con el stock final, eso si, siempre que en
Preferencias > Productos tengas la administración avanzada de
stock a "no". Si la tienes en sí, el stock se calcula sumando los movimientos de stock de cada almacén de ps_stock_mvt.
En esa tabla se indexan las cantidades del producto por combinaciones. Nuestro módulo filtra las combinaciones de cada producto y las divide según el grupo de atributos que necesitamos. En el caso concreto de www.lacasadeljamon.com.es, el grupo de atributos que controla el stock es el conjunto de pesos de cada producto. Este caso concreto tiene 40 combinaciones por cada peso de cada producto. Teniendo este dato, hemos elaborado un módulo que actualiza las cantidades de estas combinaciones.
Para los productos con combinaciones, en ps_stock_available se establecen las catidades para cada combinación. Hay que añadir otro registro, con id_product_attribute = 0, por cada producto con combinaciones (si no, no se mostrará el botón del carrito en la página del producto). Nuestro módulo tiene una línea concreta en su código para hacer esto.
Sobre los impuestos de los productos
http://www.prestashop.com/forums/topic/284753-problema-a-intentar-importar-archivo-catalago-productos-xampp/
Problema al importar CSV de gran tamaño: http://programadorphp.es/script-para-importar-productos-y-categorias-en-prestashop#comment-14249
La columna de la tabla ps_product que informa de los impuestos del producto NO da la ID FINAL de los impuestos, hay que hacer otra consulta a otra tabla que sí relaciona los campos id_tax_rules_group con id_tax.
No es lo mismo un impuesto (p. ej. IVA 21%) que una regla de impuestos (p. ej. no aplicar IVA a las Islas Canarias), y debemos entender bien este concepto a la hora de trabajar con Prestashop, ya que nos permitirá configurar correctamente los impuestos para determinadas localizaciones.
Sobre el catálogo y los atributos y combinaciones
Encontramos sólo leves diferencias en la base de datos en lo concerniente a las combinaciones de productos. La más notable es de nuevo la inclusión de tablas y campos relativos a la funcionalidad de multitienda que incorpora Prestashop 1.6.
Las siguientes tablas no cambian:
ps_attribute_impact
ps_attribute_lang
ps_attribute_group_lang
ps_product_attribute_combination
*ps_product_attribute_image - de momento no usamos esta tabla
Estas tablas son de la nueva versión exclusivamente:
ps_product_attribute_shop
ps_attribute_shop
ps_attribute_group_shop
Las siguientes tablas cambian un poco:
ps_attribute: incluye un nuevo campo position
ps_attribute_group: incluye un nuevo campo position y group_type
ps_product_attribute: nuevo campo available
Sobre otras tablas de Prestashop
Tablas que no tienen que ver con productos o combinaciones, pero que incluimos:
ps_order_state: En la nueva versión tiene nuevos campos relativos a los estados del pedido.
ps_order_state_lang: Las tablas son iguales en las dos versiones.
Importación de clientes
Tablas ps_customer de versiones de Prestashop 1.4 y 1.6.
Los asteriscos indican los campos nuevos de la nueva versión.
TABLA ps_customer Prestashop 1.4 (20 campos)
id_customer
id_gender
id_default_group
secure_key
note
email
passwd
last_passwd_gen
birthday
lastname
newsletter
ip_registration_newsletter
newsletter_date_add
optin
firstname
active
deleted
is_guest
date_add
date_upd
TABLA ps_customer Prestashop 1.6 (31 campos)
id_customer
id_shop_group*
id_shop*
id_gender
id_default_group
id_lang*
id_risk*
company*
siret*
ape*
firstname
lastname
email
passwd
last_passwd_gen
birthday
newsletter
ip_registration_newsletter
newsletter_date_add
optin
website*
outstanding_allow_amount*
show_public_prices*
max_payment_days*
secure_key
note
active
is_guest
deleted
date_add
date_upd
Importación de pedidos
TABLA ps_orders Prestashop 1.4 (32 campos)
id_order
id_carrier
id_lang
id_customer
id_cart
id_currency
id_address_invoice
id_address_delivery
reference
secure_key
payment
conversion_rate
module
recyclable
gift
gift_message
shipping_numbre
total_discounts
total_paid
total_paid_real
total_products
total_products_wt
total_shipping
carrier_tax_rate
total_wrapping
invoice_number
delivery_number
invoice_date
delivery_date
valid
date_add
date_upd
TABLA ps_orders Prestashop 1.6 (44 campos)
id_order
reference
id_shop_group*
id_shop*
id_carrier
id_lang
id_customer
id_cart
id_currency
id_address_invoice
id_address_delivery
current_state*
secure_key
payment
conversion_rate
module
recyclable
gift
gift_message
mobile_theme*
shipping_number
total_discounts
total_discounts_tax_incl*
total_discounts_tax_excl*
total_paid
total_paid_tax_incl*
total_paid_tax_excl*
total_paid_real
total_products
total_products_wt
total_shipping
total_shipping_tax_incl*
total_shipping_tax_excl*
carrier_tax_rate
total_wrapping
total_wrapping_tax_incl*
total_wrapping_tax_excl*
invoice_number
delivery_number
invoice_date
delivery_date
valid
date_add
date_upd
CAMPOS AÑADIDOS DE LA VERSIÓN NUEVA:
id_shop_group*
id_shop*
current_state*
mobile_theme*
total_discounts_tax_incl*
total_discounts_tax_excl*
total_paid_tax_incl*
total_paid_tax_excl*
total_shipping_tax_incl*
total_shipping_tax_excl*
total_wrapping_tax_incl*
total_wrapping_tax_excl*
SOBRE OTRAS TABLAS:
En relación a las tablas de pedidos, destacamos:
- En la nueva versión no existe la tabla ps_order_discount.
- La tabla ps_order_history es idéntica.
Tablas de los transportistas:
Prestashop 1.4:
ps_carrier
ps_carrier_group
ps_carrier_lang
ps_carrier_zone
Prestashop 1.6:
ps_carrier
ps_carrier_group
ps_carrier_lang
ps_carrier_shop*
- id_carrier
- id_shop - para multitienda, si no se tiene multitienda siempre es 1
ps_carrier_tax_rules_group_shop*
- id_carrier
- id_tax_rules_group
- id_shop
ps_carrier_zone
Importar lista de clientes, productos, direcciones... con un archivo CSV
Hemos elaborado un módulo que nos permite generar los CSV para importar a Prestashop, gracias al análisis que hemos realizado de los cambios de las tablas de la base de datos.
Algunos de los datos no se puden importar con un CSV, debido a que la plataforma no incluye el recurso para importar esa información. Estos datos los "importamos" con una consulta MySQL que realiza otro módulo personalizado. Lo siguiente es una captura de este módulo, que hemos denominado "setraspasa".
![]() |
El módulo que copia registros de una base de datos de 1.4 a otra de 1.6 |
Adición de código CSS para implementar diseño responsivo.
Se recomienta leer: http://www.desarrolloweb.com/articulos/regla-media-css.html
Fuente: http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=CSS3MediaQueries
Este código a añadir establecerá las directivas de diseño según el tamaño de la pantalla, y los siguientes fragmentos se refieren a algunos de los tamaños de pantalla más utilizados hasta la fecha.
/* Para las resoluciones más pequeñas */
@media only screen and (max-width: 340px) and (min-width: 5px) {
/*reglas css*/
}
/* Para 480px */
@media only screen and (max-width: 500px) and (min-width: 341px) {
/*reglas css*/
}
/* Para 600px */
@media only screen and (max-width: 620px) and (min-width: 501px) {
}
/* Para 800px */
@media only screen and (max-width: 820px) and (min-width: 621px) {
/*reglas css*/
}
/* Para 960px */
@media only screen and (max-width: 980px) and (min-width: 821px) {
/*reglas css*/
}
/* Para mínimo 980px */
@media only screen and (min-width: 981px) {
}
Velocidad de carga
Las siguientes imágenes muestran la velocidad de carga más alta conseguida después de habilitar la compresión para HTML en el servidor.
![]() |
Velocidad de carga en dispositivos móviles |
![]() |
Velocidad de carga en ordenadores de sobremesa |
Usar setInterval(función, milisegundos) para ejecutar una función con un retraso de milisegundos.
No lo hace repetidamente, pero una estrategia común es ejecutar el código y llamar a setTimeout al final del script.
Usando el siguiente div:
<div id="probando"
style="display:block;height:50px;width:50px;"
onclick="myFunction()">
Prueba con javascript
</div>
Vamos a realizar algunos ejercicios con el evento onclick de javascript.
Es posible obtener cierta información sobre los equipos conectados a un router WiFi, si disponemos de acceso al router, que normalmente cuenta con la dirección IP con un formato parecido a 192.168.x.x.
![]() |
Desde Microsiervos, el universo observable visto por el artista Pablo Carlos Budassi |
Actualmente tengo dos maneras de crear un trigger en una tabla de una base de datos MySQL.
Uso de la librería: http://core.tcl.tk/tcllib/doc/trunk/embedded/www/tcllib/files/modules/struct/matrix.html#9
# Para empezar a trabajar
package require struct
# Creamos matriz vacía
::struct::matrix mymatrix
# Información sobre la matriz
mymatrix cells
mymatrix rows
mymatrix columns
# Añadir filas y columnas
#Añadimos valores fijos, tenemos una matriz de 1x1
mymatrix add column 5
mymatrix add column 5
mymatrix add row 5
mymatrix add row 5
mymatrix cells
mymatrix rows
mymatrix columns
# Para verla
mymatrix format 2string
# Próximas funciones para estudiar
# matrixName insert column column ? values?
# matrixName insert row row ? values?
![]() |
Versión 1.6 |
![]() |
Herramienta de personalización |
![]() |
Vistazo breve al Back Office, estadísticas |
Una consulta cruzada es una consulta MySQL que toma datos de varias tablas que comparten campos. Por ejemplo, la tabla ps_product contiene un campo id_product, al igual que la tabla ps_product_lang.
A la hora de utilizar imágenes en el diseño de una página web, es necesario tener en cuenta varios factores que permitan su apropiada visibilidad y consumo de recursos.
Comando Send de Autoit *
Problema: Nuestro smartphone se queda sin memoria cada cierto tiempo, por mucho que intentemos liberar espacio, siempre le falta memoria.
Explicación: Una cosa es la memoria interna, memoria de "sistema", y otra la memoria de nuestra tarjeta SD. Es probable que la memoria interna acabe pronto llena por actualizaciones, aplicaciones preinstaladas y demás (atención a la aplicación Servicios de Google Play, necesaria para el funcionamiento de otras aplicaciones, que consume mucha memoria y gasta mucha batería, y de la que se habla aquí: http://www.elandroidelibre.com/2013/11/el-inexplicable-gasto-de-bateria-provocado-por-google-play-services-no-solo-te-ocurre-a-ti.html y también aquí: http://foros.softonic.com/moviles/servicios-google-play-115239).
Solución: Debemos liberar espacio de nuestra memoria interna y utilizar la tarjeta de memoria SD. Para ello podemos rootear el terminal y así poder usarlo de manera más eficiente. Lamentablemente, el proceso de rootear un smartphone depende del modelo y sus características, por lo que no podemos explicarlo de manera eficiente aquí. Sin embargo, podemos deciros que anula la garantía, aunque es un proceso completamente reversible. Y si estás realmente interesado en el tema, consulta alguna de nuestras fuentes:
- Interesante entrada al respecto: http://www.poderpda.com/editorial/6-razones-para-rootear-tu-android/
- Una guía para empezar a rootear varios modelos de smarthpones: http://www.xatakandroid.com/tutoriales/aprende-a-rootear-tu-android-de-manera-facil-y-rapida
- Rootear un LG-E400:
https://www.youtube.com/watch?v=e38drkQHCRE
- Rootear y flasheo de un LG-E400:
https://www.youtube.com/watch?v=MsVyE-sh9C4
http://www.androidpit.es/borrar-aplicaciones-preinstaladas-android
¿Cómo cumplir con la Ley orgánica de Protección de Datos (LOPD)?
La LOPD establece las obligaciones que los responsables de los ficheros o
tratamientos y los encargados de los tratamientos, tanto de organismos
públicos como privados, han de cumplir para garantizar el derecho a la
protección de los datos de carácter personal.
Cuando un negocio cambia de dirección y añade unas cámaras de seguridad para su local, necesita de la modificación de sus ficheros en la AEPD (Agencia Española de Protección de Datos) y de la inscripción de nuevos ficheros.
Para la modificación de ficheros existentes:
1- Entrar en www.agpd.es
2- Canal del responsable > Inscripción de ficheros
3- Obtención del Formulario NOTA
4- Debajo del todo: "Formulario NOTA de titularidad privada"
Es necesario modificar los apartados que incluyen la dirección física del negocio:
1- Responsable del fichero
2- Derechos de oposición.
Para un posible error "Problema de renegociación de SSL - Firefox":
Escribir en la barra de direcciones del navegador about:config y cambiar security.ssl.allow_unrestricted_renego_everywhere__temporarily_available_pref
de false a true.
Necesitamos el código de inscripción que nos dio la Agencia cuando inscribimos el fichero por primera vez. Por lo que es necesario solicitar una copia de los ficheros que incluya el código de inscripción. Vamos a resumir esto último:
1 - Nos dirigimos al apartado sede.electronica@ (columna derecha).
2 - Vamos a "Solicitud de Copia de la Inscripción de Ficheros". Se puede solicitar con firma electrónica o por correo ordinario, imprimiendo y firmando un documento descargable.
Para obtener la firma electrónica (si no se dispone de ella):
1 - El certificado eletrónico para la mayoría de organismos públicos lo expede www.cert.fnmt.es/
2 - Es aconsejable instalar un sotfware para configurar el equipo/navegador para el uso de firma electrónica, y ejecutarlo con permisos de administrador. Se pedirá que los navegadores sean cerrados para una correcta instalación. También un reinicio del sistema al finalizar.
3 - Luego de solicitarlo mediante el formulario disponible en su portal, hay que recogerlo personalmente en alguna de sus oficinas. Se muestra un mapa con las localizaciones de todas las oficinas de España.
Tienes dos maneras:
1- Pulsando en el icono de notificaciones (la bola del mundo) y dejando el ratón sobre la notificación del juego en cuestión, aparece un aspa para bloquearla.
2- O bien vas a Configuración > Bloqueos, y allí puedes bloquear invitaciones de usuarios concretos o bien de aplicaciones concretas (juegos), solamente escribiendo el nombre.
![]() |
Configuración |
![]() |
Configuración > Bloqueos |
Somos animales de costumbres. Siempre he tomado apuntes a mano, elaborando esquemas y resúmenes que me ayudan a ordenar mis pensamientos.
La imagen que muestro a continuación es un escaneo de los apuntes que tomaba mientras me llamaba mi asesor de Google. Gestiono las cuentas y herramientas de Google de uno de mis clientes.
Es cierto que mi caligrafía es pésima y algo "sucia", pero tened en cuenta que estaba hablando por teléfono mientras escribía.
Escribirlo en un papel me sirve para memorizarlo mejor, y no lo tengo que volverlo a leer, ya que son herramientas relativamente fáciles de usar y que miramos cada día.
Breves notas sobre algunos cambios en la plantilla por defecto de la versión de Prestashop 1.5 - procedimiento en el que elaboramos un archivo de texto que sirvió como log para llevar al día las modificaciones realizadas en la plantilla. En esta entrada sólo se incluye el principio del archivo.
![]() |
Después de la entrada anterior, Prestashop y MRW, le toca a otra agencia importante en España, por la calidad y la versatilidad de su servicio de transporte de paquetería. Es el turno de NACEX, cuyo logotipo luce así:
![]() |
Etiqueta generada por el módulo e impresa con la etiquetadora |
![]() |
Aspecto del módulo de Nacex en el B.O. |
Vía RecorteX: http://www.planetacodigo.com/recortex/recorte/43
<select name="provincia"> <option value="">- selecciona -</option> <option value="15">A coruña</option> <option value="1">Álava</option> <option value="2">Albacete</option> <option value="3">Alicante</option> <option value="4">Almería</option> <option value="33">Asturias</option> <option value="5">Ávila</option> <option value="6">Badajoz</option> <option value="7">Baleares</option> <option value="8">Barcelona</option> <option value="9">Burgos</option> <option value="10">Cáceres</option> <option value="11">Cádiz</option> <option value="39">Cantabria</option> <option value="12">Castellón</option> <option value="51">Ceuta</option> <option value="13">Ciudad Real</option> <option value="14">Córdoba</option> <option value="16">Cuenca</option> <option value="99">Extranjero</option> <option value="17">Girona</option> <option value="18">Granada</option> <option value="19">Guadalajara</option> <option value="20">Guipúzcoa</option> <option value="21">Huelva</option> <option value="22">Huesca</option> <option value="23">Jaén</option> <option value="26">La rioja</option> <option value="35">Las palmas</option> <option value="24">León</option> <option value="25">Lleida</option> <option value="27">Lugo</option> <option value="28">Madrid</option> <option value="29">Málaga</option> <option value="52">Melilla</option> <option value="30">Murcia</option> <option value="31">Navarra</option> <option value="32">Ourense</option> <option value="34">Palencia</option> <option value="36">Pontevedra</option> <option value="37">Salamanca</option> <option value="38">Santa cruz de tenerife</option> <option value="40">Segovia</option> <option value="41">Sevilla</option> <option value="42">Soria</option> <option value="43">Tarragona</option> <option value="44">Teruel</option> <option value="45">Toledo</option> <option value="46">Valencia</option> <option value="47">Valladolid</option> <option value="48">Vizcaya</option> <option value="49">Zamora</option> <option value="50">Zaragoza</option> </select>
![]() |
Mapa de las 52 provincias de España |