domingo, 14 de septiembre de 2014

Imágenes en la web

A la hora de utilizar imágenes en el diseño de una página web, es necesario tener en cuanta varios factores que permitan su apropiada visibilidad y consumo de recursos.

- Tamaño (ancho x alto).
- Proporciones (ancho : alto).
- Puntos por pulgada (se aconseja 72 ppp para visualizar en pantalla).
- Modo de color (RGB 8 bits).
- Formato de archivo, que identificamos por la extensión: jpg, gif, png. Derivado de esto, tener en cuenta los canales alfa, si las hubiera (hay formatos que no admiten
- Tener en cuenta el formato del archivo según los distintos navegadores con los que testear el diseño y la usabilidad de la página.
- Alineación con el texto.
- Atributo HTML alt.
- Atributo HTML title.
- Especificación del tamaño real de la imagen en clase o identificador CSS para optimizar la carga de la página.
- Ajuste de calidad de la imagen para minimizar espacio en disco.  Si se han tenido en cuenta las reglas anteriores, esta quizá está de más.

martes, 2 de septiembre de 2014

Prestashop 1.6, stock y combinaciones al actualizar

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 para importar grande csv: 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.

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*


Realizar consultas Mysql en los módulos de Prestashop

SELECT:

$result = Db::getInstance()->ExecuteS("SELECT * FROM  `"._DB_PREFIX_."aw_attribute_wizard`");

INSERT:

Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'nombre_tabla` (`nombre_campo`) VALUES ("valor")');

Ordenar alfabéticamente los atributos de los productos

Modificar el archivo classes/Product.php, la línea que reza:

ORDER BY ag.`position` ASC, a.`position` ASC, agl.`name` ASC';

Ha de ser cambiada por la siguiente:

ORDER BY ag.`position` ASC, pac.`id_product_attribute`, a.`position` ASC, agl.`name` ASC';

Alineación de los atributos con botones de radio:

En themes/nombre_tema/product.css , añadir a  #attributes .attribute_list ul li la propiedad width:100%. Así los elementos de la lista ocuparán todo el ancho disponible y no se amontonarán en la misma línea.



Fuentes
http://www.prestashop.com/forums/topic/336616-reordenar-valores-de-atributos-en-prestashop-16/
http://evamariamontero.com/blog/como-actualizar-un-stock-con-combinaciones-en-prestashop-1-5-6-a-partir-de-un-excel/
http://www.prestashop.com/forums/topic/262154-solucionado-%C2%BFtabla-en-la-que-se-guardan-las-cantidades-de-producto/

lunes, 1 de septiembre de 2014

Liberar espacio de smartphone con Android

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 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

sábado, 16 de agosto de 2014

Crear Widget de Wordpress


Un Widget de Wordpress se compone de dos partes:
  • Una función que instancia al Widget.
  • Una clase para nuestro Widget, que extiende al objeto WP_Widget.
Incluir el archivo widget.php en la carpeta
wp-content/widget/widget.php.

Contenido de widget.php:

 <?php

/*
Plugin Name: Mi primer Widget mpw
Plugin URI: http://www.txtplano.blogspot.com.es/
Description: Crea un Widget para añadir a cualquier Sidebar.
Version: 1.0
Author: JorgeGL
Author URI: http://www.txtplano.blogspot.com.es/
*/

/* Función que instancia el Widget 

mpw viene de “Mi Primer Widget”, el nombre de la función podéis cambiarlo como queráis
 */


function mpw_create_widget(){   
    include_once(plugin_dir_path( __FILE__ ).'/widget/widget.php');
    register_widget('mpw_widget');
}
add_action('widgets_init','mpw_create_widget');
 

/* Extendemos la clase WP_Widget */

class mpw_widget extends WP_Widget {
    function mpw_widget(){
        // Constructor del Widget.
        $widget_ops = array('classname' => 'mpw_widget', 'description' => "Descripción de Mi primer Widget" );
        $this->WP_Widget('mpw_widget', "Mi primer Widget", $widget_ops);
    }
    function widget($args,$instance){
        // Contenido del Widget que se mostrará en la Sidebar

        echo $before_widget;    
        ?>
        <aside id='mpw_widget' class='widget myp_widget'>
            <h3 class='widget-title'>Mi Primer Widget</h3>
            <p><?=$instance["mpw_texto"]?></p>
        </aside>
        <?php
        echo $after_widget;

   }

    function update($new_instance, $old_instance){
        $instance = $old_instance;
        $instance["mpw_texto"] = strip_tags($new_instance["mpw_texto"]);
        // Repetimos esto para tantos campos como tengamos en el formulario.
        return $instance;  
    }


     function form($instance){
        ?>
         <p>
            <label for="<?php echo $this->get_field_id('mpw_texto'); ?>">Texto del Widget</label>
            <input class="widefat" id="<?php echo $this->get_field_id('mpw_texto'); ?>" name="<?php echo $this->get_field_name('mpw_texto'); ?>" type="text" value="<?php echo esc_attr($instance["mpw_texto"]); ?>" />
         </p>
         <?php
    }

}


?>

Este widget incluye un formulario para incluir texto desde el administrador de Wordpress y mostrarlo directamente en la página.

Luego sólo tendremos que activar el plugin desde el gestor de plugins de WordPress. Hecho esto, vamos a Apariencia > Widgets y lo arrastramos a la Sidebar que mejor nos convenga.

Crear un sidebar par nuestros widgets

Ahora tenemos la posibilidad de crear un sidebar personalizado para anclar nuestros widgets. Con la sidebar no nos referimos a la barra lateral, sino a una zona cualquiera de la plantilla. Debemos elegir dónde insertar el código: si en functions.php o bien en el widget en cuestión. Se recomienda esto último, para no tener que editar el código del theme.

<?php
function miplugin_register_sidebars(){
    register_sidebar(array(
        "name" => "Nombre de la Sidebar",
        "id" => "id-unico-para-la-sidebar",
        "descripcion" => "Descripción de la Sidebar",
        "class" => "clase-del-elemento",
        "before_widget" => "<li id='%1$s' class='%2$s'>",
        "after_widget" => "</li>",
        "before_title" => "<h2 class='titulodelwidget'>",
        "after_title" => "</h2>"
    ));
}
add_action('widgets_init','miplugin_register_sidebars');
?>


Fuentes de referencia:

http://codex.wordpress.org/es:Escribiendo_un_Plugin
https://codex.wordpress.org/Plugin_API/Action_Reference
http://www.codigonexo.com/blog/wordpress-programadores/crear-sidebars-en-wordpress/
http://www.domestika.org/es/forums/6-programacion-servidor/topics/94200-como-crear-tu-propio-sidebar-personalizado-en-wordpress 
http://joanartes.com/blog/sidebar-wordpress/
https://wordpress.org/plugins/multiple-sidebars/installation/ -- Plugin para crear sidebars desde el administrador de Wordpress 

jueves, 14 de agosto de 2014

AEPD, ficheros - resumen de acción administrativa

¿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.
 

miércoles, 23 de julio de 2014

Bloquear notificaciones de juegos de Facebook

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

Fuente: http://www.tuexperto.com/2014/02/04/como-desactivar-notificaciones-de-juegos-en-facebook/