jueves, 17 de marzo de 2016

Prestashop - Modificar cantidades en lote

Para poner todas las cantidades de todos los productos igual.
La forma sencilla:
UPDATE ps_stock_available SET quantity = 1 

Si tenemos algún problema en la BBDD, por ejemplo, se ha vaciado al pasar tienda a multitienda, podemos asegurarnos, primero vaciando la tabla 'ps_stock_available' y luego con la siguiente sentencia:

INSERT INTO `ps_stock_available`(`id_product`, `id_product_attribute`, `id_shop`, `id_shop_group`, `quantity`, `depends_on_stock`, `out_of_stock`) SELECT `id_product`,0,0,1,100,0,1 FROM `ps_product`

Hay que tener cuidado de que sean productos "simples", sin atributos configurables, compuestos, etc. 

Enlaces de interés:

https://www.prestashop.com/forums/topic/341360-solved-how-can-i-change-quantity-values-to-all-products/

http://stackoverflow.com/questions/26136951/prestashop-change-all-product-quantity-to-1

http://www.w3schools.com/sql/sql_insert_into_select.asp

miércoles, 16 de septiembre de 2015

Mostrar más información en la lista de proveedores.

El problema base a solucionar va a ser, en la lista de proveedores (suppliers), no se muestra ningún dato respecto a la dirección, sólo título, imagen y descripción.

Vamos a usar el caso de mostrar por ejemplo la dirección y el móvil en el listado.

En este caso, lo primero a modificar es el resultado del método getSuppliers que lógicamente está en /classes/Supplier.php

Original: $query->select('s.*, sl.`description`');
Modificado: $query->select('s.*, sl.`description`, ad.`phone_mobile`, ad.`address1`');

Añadir la línea en negrita:
$query->leftJoin('supplier_lang', 'sl', 's.`id_supplier` = sl.`id_supplier` AND sl.`id_lang` = '.(int)$id_lang); 
$query->leftJoin('address', 'ad', 'ad.`id_supplier` = s.`id_supplier`'); 

El siguiente paso, es ya modificar (añadir a) la vista: {directorio_plantilla}/supplier-list.tpl  

<div class="description">
          {l s="Móvil: "}{$supplier.phone_mobile}<br/>
          {l s="Dirección: "}{$supplier.address1}
          {*$supplier.description|truncate:180:'...'*}

 </div> 

 Ver también: Añadir campos a los proveedores

Añadir campos en Proveedores - Suppliers

Para añadir nuevos campos en los proveedores hay que modificar 3 partes:

1. Crear el campo en la base de datos, en la tabla {prefijoBD}_supplier creamos el/los campos que necesitemos.
2. Añadir el atributo a su clase /classes/Supplier.php
Ejemplo de añadir mail:
/** @var string Mail */
    public $mail;

{..}
public static $definition = array(
        'table' => 'supplier',
        'primary' => 'id_supplier',
        'multilang' => true,
        'fields' => array(
            'name' =>                array('type' => self::TYPE_STRING, 'validate' => 'isCatalogName', 'required' => true, 'size' => 64),

            'mail' =>                array('type' => self::TYPE_STRING, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128),
{..}  

3. Añadir el campo al formulario de la administración /controllers/admin/AdminSuppliersController.php 
Ejemplo de añadir mail:
public function renderForm()
    {

{...} 
               array(
                    'type' => 'text',
                    'label' => $this->l('Name'),
                    'name' => 'name',
                    'required' => true,
                    'col' => 4,
                    'hint' => $this->l('Invalid characters:').' &lt;&gt;;=#{}',
                ),
               
array(
                    'type' => 'text',
                    'label' => $this->l('Email'),
                    'name' => 'mail',
                    'required' => true,
                    'col' => 4,
                    'hint' => $this->l('Invalid characters:').' &lt;&gt;;=#{}',
                ),
 
 4. Posible ejemplo de uso en supplier.tpl
<fieldset>
               <label class="attribute_label">Email</label>
               <div class="attribute_list">{$supplier->mail}</div>
</fieldset>

Igualmente para modificar fabricantes - manufactures se puede aplicar a su clase, controlador y vista fácilmente.

Ejemplo de uso en la tienda online vinumplus.es  

miércoles, 15 de enero de 2014

Crear modulo prestashop 1.5 (a partir de otro)

Manual para crear un módulo para Prestashop 1.5 a partir del módulo homefeatured que viene por defecto en la instalación básica de la tienda online.

  1. Ir a la carpeta /modules/homefeatured, copiar y pegar, y cambiar el nombre, por ejemplo por homefeaturedcustom.
  2. Cambiar el nombre también a todos los archivos que contiene, así como las referencias varias que haya dentro de la carpeta, llamadas a archivos, declaraciones de clase, etc (incluido config.xml).
  3. Lo que pongas dentro del config.xml en la etiqueta <author> te servirá también para filtrar desde la administración después, y encontrar tu módulo rápidamente (con estos pasos bien hechos, ya debería salirte, aunque la funcionalidad, obviamente será la misma que el módulo copiado). Hasta aquí te serviría para por ejemplo tener el módulo duplicado, por si quieres tenerlo 2 veces en la misma posición, con varios otros en medio.
  4. Lo podemos instalar ya. En la pantalla que vemos, los mensajes y opciones que nos aparecen, son las definidas en homefeaturedcustom.php, por ejemplo donde veamos HOME_FEATURED_NBR podemos sustituirlo por otro nombre esa variable, sino, pues ese panel de opciones no sirve, puesto que se solapará valores con el otro módulo, con la misma declaración.
  5. Un paso interesante a implementar extra, para aprender a darle utilidad a esta "modificación" del módulo, es seguir el siguiente tutorial: newfieldstut que lo que hace es enseñarnos a crear nuevas pestañas en la ficha de producto en la administración, y nuevos campos dentro de ella para estos.
    • Está en inglés, pero muy bien redactado, y con muchas imágenes, fácil de seguir.
    • Además tiene código inicial para seguirlo, y código final (funciona bien) por si en algún paso no te aclaras.
  6. Ahora tenemos un campo por el que filtrar lo que queremos mostrar. Por ejemplo, en ese campo podemos poner unos productos que sean "destacados". Y en el homeproductcustom.tpl, hay un bloque tal que así (por la línea 30 aproximadamente) :        <code>{foreach from=$products item=product name=homeFeaturedProducts}</code>
  7. Pues justo en la línea de abajo ponermos esto: <code> {if $product.custom_field eq "destacado"} </code>. Y sólo pasará esto con las imágenes que cumplan con ese valor en el campo nuevo creado, y sino, pues podemos poner un "else" o y hacer otra cosa, o simplemente no mostrarlos.
Pues ya está, ya tenemos un bloque para los productos "destacados". Ahora queda en nuestra mano, manipular el código para que salga una cantidad u otra de productos, crear un slide con ellos, darles otro formato/imagen, mostrar información distinta, etc.

miércoles, 11 de diciembre de 2013

WordPress Plugin - Qtranslate, la clave multidioma

Lo primero es descargarse el plugin, he instalarlo (yo siempre lo suelo hacer mediante el cliente FTP)
Enlace de descarga en repositorio oficial de wordpress

El siguiente paso es poner activo y como predefinido el Español.
Lo siguiente confirmar que las URL's estan con el formato deseado

Es muy posible que la última versión no funcione en tu instalación de WordPress, aquí va un enlace a la última versión en desarrollo, y a la tabla de equivalencias entre versiones de wordpress y versiones de qtranslate:
Tabla de versiones

Para la cuestión de añadir idiomas que no estan por defecto, enlace a la tabla de códigos para poner en el formulario de creación
Códigos de idiomas

Ya está listo para empezar a  poner nuestra web primero:
  • Contenido: es bastante sencillo, hay que rellenar en cada campo (título y contenido) en su respectivo idioma, viene bien, porque esto será lo que tendrán que ir traduciendo cada administrador del contenido futuro en la web, que se pretende que no sea el mismo que su creador, ahí la gracia de usar wordpress.
  • Widgets, menus, título/descripción de la web y demás datos puestos desde la administración, habrá que separar las traducciones mediante el uso de [:ID], para muestra un botón: [:es]Esto es Esparta[:ca]Això es Esparta[:en]This is Esparta
  • Contenido de la plantilla: Es la parte más usado para los desarrolladores, un poco más larga, pero que sólo habrá que usar en el momento del desarrollo de la web,y  más tarde en la creación de algún widget o plugin necesario, aquí va otro "botón": <code><?php echo "<!--:es-->Esto es Esparta<--:--><!--:en-->This is Esparta<--:--><!--:ca-->Això es Esparta<--:-->" ;?></code>
Selector idioma en la web hay 2 maneras:
  1. Usar el widget por defecto, con opciones básicas de mostrar nombre, bandera o ambas
  2. Crearlo por código, con un poco de html y css, es simplemente poner enlaces según la opcion que elijamos en  "Configuraciones Avanzadas --> Modo de modificación de URL" y ya darle la funcionalidad/apariencia que queramos.
Con esto en principio ya tenemos todo listo para que nuestra web se visualize en los idiomas que queramos.

Un punto que he visto en un post de Creativasfera (por cierto, blog muy recomendado de seguir), lo añado aquí, sería para elegir que código ejecutar según el idioma en el que estés, usa el ejemplo del logo
<code>
 <?php 
  if(qtrans_getLanguage() == "es") {
echo    "<img src=\"" .  get_bloginfo('stylesheet_directory') . "/images/nombre_imagen_es.jpg" />"   ;
}
?>
 <?php 
  if(qtrans_getLanguage() == "en") {
echo    "<img src=\"" .  get_bloginfo('stylesheet_directory') . "/images/nombre_imagen_en.jpg" />"     ;
}
?>
</code>

Esto se podría incluso a cargar distintas cabeceras
<code>
 <?php 
  if(qtrans_getLanguage() == "es") { get_header();
}
?>
 <?php 
  if(qtrans_getLanguage() == "en") { get_header("ingles"}
?>
</code>Y a partir de ahí, pues distintas zonas de widgets, etc, hasta lo que se te ocurra.
Enjoy it!

jueves, 4 de abril de 2013

Manual ShortCodes en WordPress (completísimo) III

Última parte del manual completo del manejo de los shortcodes (atajos) en wordpress, en esta parte vamos a introducir un uso amigable y sencillo de estos desde el editor de contenido tinymce.
Al fin y al cabo, lo que se pretende es que el autor de las entradas necesite saber lo mínimo posible sobre código, y si lo necesario es nada, mejor para todos.
Habrá que hacer los siguiente:
  • Crear un archivo JavaScript para la creación del botón.
  • Registrar el archivo y el botón.
 El archivo JS se usa para registrar el plugin con la API TinyMCE.
Creamos un archivo nuevo llamado my-short-code.js en el directorio /js/ de nuestra plantilla (si no existe, crearlo) y ponemos lo siguiente:

(function() {
   tinymce.create('tinymce.plugins.recentposts', {
      init : function(ed, url) {
         ed.addButton('recentposts', {
            title : 'Recent posts',
            image : url+'/recentpostsbutton.png',
            onclick : function() {
               var posts = prompt("Number of posts", "1");
               var text = prompt("List Heading", "This is the heading text");

               if (text != null && text != ''){
                  if (posts != null && posts != '')
                     ed.execCommand('mceInsertContent', false, '[recent-posts posts="'+posts+'"]'+text+'[/recent-posts]');
                  else
                     ed.execCommand('mceInsertContent', false, '[recent-posts]'+text+'[/recent-posts]');
               }
               else{
                  if (posts != null && posts != '')
                     ed.execCommand('mceInsertContent', false, '[recent-posts posts="'+posts+'"]');
                  else
                     ed.execCommand('mceInsertContent', false, '[recent-posts]');
               }
            }
         });
      },
      createControl : function(n, cm) {
         return null;
      },
      getInfo : function() {
         return {
            longname : "Últimos post",
            author : 'Antonio García',
            authorurl : 'http://mipasapersonal.blogspot.es',
            infourl : 'http://www.coodex.es',
            version : "1.0"
         };
      }
   });
   tinymce.PluginManager.add('recentposts', tinymce.plugins.recentposts);
})();



En el código básicamente lo que se hace es crear un nuevo plugin, se piden los dos parámetros, y según lo que introduzcamos se inserta un código en el editor, se crea un botón con una imagen y al final se añade nuestro plugin al gestor de plugins del TinyMCE.


Ya solo queda registrar el botón (lo añadimos a la lista de botones del editor):
function register_button( $buttons ) {
   array_push( $buttons, "|", "recentposts" );
   return $buttons;
}

y enlazar nuestro JS creado al ppio:
function add_plugin( $plugin_array ) {
   $plugin_array['recentposts'] = get_template_directory_uri() . '/js/mi-short-code.js';
   return $plugin_array;
}



Y aquí el enlace "fuente" de este manual (en inglés), obviamente, todo esto no me lo he inventado ni a salido de la nada :D
http://wp.smashingmagazine.com/2012/05/01/wordpress-shortcodes-complete-guide/
Al final de éste, hay unos cuantos ejemplos más de shortcodes, como para añadir un googlemaps, por ejemplo, y también unos plugins que van bien para crear shortcodes sin tener que tocar tanto código como ahora.

lunes, 1 de abril de 2013

Empezando a trastear con windows 8

Bueno, lo primero que he conseguido a sido que de repente, la app maravillosa de IE 10 de "Mi Metro" haya "desaparecido", así que, fácilmente, 1º infiernas al nuevo SO, luego dudas de tu nueva máquina, luego razonas que no es culpa de ellos, que lo habrás desinstalado mientras estabas poseído y no lo recuerdas, y ya al final piensas que "tal vez" haber instalado Chrome (me imagino que con otros navegadores pasará igual) haya tenido algo que ver.
Pues si, aunque te lo bajes, lo instales, lo ancles, etc... no volverá a salir igual que al principio, se te abrirá con el estilo ventana antigua, dentro del escritorio, no con ese estilo tan "indomable" desde un sobremesa.
La solución, una vez conocida, es bastante fácil, rápida y sencilla (para cuando vuelvas a instalar otro navegador, y te vuelva a pasar.)
Vas a tu ventana anticuada de IE, le das a al icono de la tuerca --> Opciones de internet --> Programas --> Establecer asociaciones --> Seleccionar todos y Clic en guardar.
Voilà, solucionada 1ª liadita con "Mi Metro" que se ha ganado una publicación, voy a seguir trasteando a ver cuantas liaditas por día consigo.
Nota: también he leido que la resolución mínima para ver la versión indomable de IE 10 es 1024x768, revísalo, por si nunca has llegado a verlo así.