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 Pasa Personal.
Programación, web, CMS, WordPress, Magento, CSS, HTML5, jQuery, y lo que surja.Mi pasa personal
jueves, 17 de marzo de 2016
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
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:').' <>;=#{}',
),
array(
'type' => 'text',
'label' => $this->l('Email'),
'name' => 'mail',
'required' => true,
'col' => 4,
'hint' => $this->l('Invalid characters:').' <>;=#{}',
),
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
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:').' <>;=#{}',
),
array(
'type' => 'text',
'label' => $this->l('Email'),
'name' => 'mail',
'required' => true,
'col' => 4,
'hint' => $this->l('Invalid characters:').' <>;=#{}',
),
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.
- Ir a la carpeta /modules/homefeatured, copiar y pegar, y cambiar el nombre, por ejemplo por homefeaturedcustom.
- 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).
- 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.
- 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.
- 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.
- 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>
- 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.
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:
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>
Esto se podría incluso a cargar distintas cabeceras
<code>
Enjoy it!
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>
- Usar el widget por defecto, con opciones básicas de mostrar nombre, bandera o ambas
- 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.
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:
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.
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.
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í.
Suscribirse a:
Entradas (Atom)