Ocultar método de pago a un producto en Prestashop

En esta guía, vamos a ocultar el método de pago de transferencia bancaria en Prestashop a un producto que se llama “Chorizos de Alcantarilla”.

En este ejemplo, vamos a editar a manorra (pero recordar que lo ideal es hacer un override de la clase del módulo):

Dentro del fichero: modules/bankwire/bankwire.php y dentro de la función del hook -> hookPayment

Recogemos los productos del carrito, comprobamos el ID de un producto en concreto coincide con el que queremos ocultar ese método de pago para ese producto  y dejamos de mostrar el método de pago en Prestashop para el producto “Chorizos de Alcantarilla”:

La función del hookPayment por defecto esta así en el módulo de transferencia bancaria.

public function hookPayment($params)
{
if (!$this->active)
return;
if (!$this->checkCurrency($params['cart']))
return;
$this->smarty->assign(array(
'this_path' => $this->_path,
'this_path_bw' => $this->_path,
'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/'
));
return $this->display(__FILE__, 'payment.tpl');
}

Dentro vamos añadir, la siguiente línea:

$products = $this->context->cart->getProducts();

Para obtener los productos del carrito.

Y para recorrer los productos del carrito, usaremos (un foreach), si alguno de los productos del carrito coincide con el ID del producto que hemos puesto en la comparación, no retornamos nada, y por tanto no se muestra el método de pago del módulo de transferencia bancaria.

if($products)
{
foreach ($products as $productos) {
if ($productos['id_product'] == 'X')
{
return;
}
}
}

Recordar que donde he puesto ‘X’, vosotros tenéis que colocar el ID del producto a ocultar

La función quedaría así:

public function hookPayment($params)
{
$products = $this->context->cart->getProducts();
if($products)
{
foreach ($products as $productos) {
if ($productos['id_product'] == 2)
{
return;
}
}
}
if (!$this->active)
return;
if (!$this->checkCurrency($params['cart']))
return;
$this->smarty->assign(array(
'this_path' => $this->_path,
'this_path_bw' => $this->_path,
'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/'
));
return $this->display(__FILE__, 'payment.tpl');
}
Código para ocultar método de pago por producto en Prestashop

Recordar que lo ideal es hacer un override de la clase del módulo. ¿Cómo se hace un override de la clase de un módulo?

Documento testeado en PrestaShop 1.6.1.14

Print Friendly, PDF & Email

Localizar rutas y nombres de ficheros de módulos en Prestashop

¿Os acordáis del módulo que nos permitía conocer la información de los módulos, como por ejemplo la ruta de los ficheros?

En esta ocasión, vamos hablar y poner un ejemplo, de cómo hacerlo (más simplificado) a nivel de código. (El módulo que estuvimos comentando el otro día es más completo)

El usuario Nemo de la Comunidad de Prestashop, nos proporciona un pequeño truco en un videotutorial en el idioma de Shakespeare que hemos pasado de forma transcrita al idioma de Cervantes.

Vamos a tocar clases originales, pero recordar que lo recomendable es siempre hacer un Override.

Editamos el fichero:

/classes/module/Module.php

Dentro de la función “display” ->  public function display($file, $template, $cache_id = null, $compile_id = null)

Y encima de:

return $result;

Añadimos el siguiente código:

if ($result && _PS_MODE_DEV_ === true) {
$tpl_path = $this->getTemplatePath($template);
$result = '<!-- INICIO ' .$tpl_path. ' -->'. $result. '<!-- FINAL'. $tpl_path.' -->';
}
Debug ficheros TPL de los módulos en Prestashop

Con esta línea:

if ($result && _PS_MODE_DEV_ === true)

Solo mostraremos esta información, si hemos habilitado el debug en Prestashop y si hemos obtenido un resultado.Recordar que para hablitar el debug en Prestashop 1.6, es en: /config/defines.inc.php cambiando el valor “false” de define(‘_PS_MODE_DEV_’, false); por “true“.

En esta línea:
$tpl_path = $this->getTemplatePath($template);

Obtenemos la ruta del fichero “*.tpl”.

En esta línea:

$result = '<!-- INICIO ' .$tpl_path. ' -->'. $result. '<!-- FINAL'. $tpl_path.' -->';

Guardamos resultado en la variable $result que se va usando a lo largo de la misma función y que retorna la función.

Ahora veremos que en el código fuente de la tienda, podemos localizar fácilmente los ficheros “.tpl” de los módulos. (En esta ocasión estamos viéndolo desde Inspeccionar Elemento en Chrome (Botón derecho ratón -> Inspeccionar elemento)

Documento construido bajo Prestashop 1.6.1.14

En Prestashop 1.7, directamente (y sin necesidad de modificar código) si habilitamos el modo depurador (modo debug) desde la pestaña Parámetros Avanzados -> Rendimiento 

Habilitar modo depuración en Prestashop 1.7
Habilitar modo depuración en Prestashop 1.7

Desde el mismo código fuente nos salta la ruta de los “tpls” de los módulos…

Ficheros TPL de los módulos en Prestashop 1.7
Print Friendly, PDF & Email

Prestashop 1.6.1.14 disponible para descargar

Prestashop acaba de publicar hoy (5 de junio del 2017) la versión 1.6.1.14, donde se han corregido mas de 15 errores respecto a su versión anterior.

Errores corregidos en Prestashop 1.6.1.14: Log de cambios

  • Back Office:
    • Bug fix:
      • #4803: Pipes in product names in autocomplete
      • #7908: Fix taxes in credit slip
      • #7806: Fix the refresh button of the stats bloc in the products list
      • #7821: Add API_KEY field to display the map
      • #7622: Set correct value on load to display the right tab
      • #7722: Translation of return merchandise fields
      • #7764: Fix html interpreted as text in carrier’s wizard summary
      • #7755: Fix non well formed numeric value
      • #7765: Fix error in HelperOptions
  • Front Office:
    • Bug fix:
      • #5739: Fix popover with multiple wishlists
      • #7673: Shipping cost indication wrong
      • #7350: Fix 404 bug when query string contains a LF
      • #7758: Fix manufacturer pagination
      • #7798: Fix JS error “Uncaught ReferenceError”
  • Core:
    • Bug fix:
      • #7814: Increase carrier delay length
      • #7917: Send Http 500 error code when we can’t connect to the database instead of a 200 code
      • #7913: Send Http 500 error code when we can’t connect to the database instead of a 200 code
      • #6080: make OrderInvoice overridable
    • Localization
      • Bug fix:
        • #7819: Replace EN (US) by EN (UK) in UK localization pack

Descargar Prestashop 1.6.1.14

Otras versiones de Prestashop: https://www.prestashop.com/es/versiones-anteriores

Print Friendly, PDF & Email

Añadir preguntas frecuentes en Prestashop 1.6 y 1.7

En el año 2012, estuvimos hablando de un módulo que nos permitía simular el funcionamiento típico de las preguntas frecuentes al estilo acordeón (El módulo era independiente de los contenidos creados en la pestaña Preferencias -> CMS).

En esta guía, vamos a realizar una pequeña integración en los contenidos que creamos en la pestaña Preferencias -> CMS, para mostrar preguntas y respuestas de forma que inicialmente solo aparezcan las preguntas y cuando hagamos click sobre la pregunta, aparezca la respuesta.

Implementar preguntas frecuentes en Prestashop
Desplegando preguntas frecuentes en Prestashop

Vamos hacer uso de este código: https://gist.github.com/neilgee/9284745#file-faq-html que hemos obtenido en el repositorio de github del usuario neilgee

Esta guía está realizada bajo Prestashop 1.6, pero también funciona en Prestashop 1.7

El código JavaScript:

$(document).ready(function() {
$('.faq_question').click(function() {
if ($(this).parent().is('.open')){
$(this).closest('.faq').find('.faq_answer_container').animate({'height':'0'},500);
$(this).closest('.faq').removeClass('open');
}else{
var newHeight =$(this).closest('.faq').find('.faq_answer').height() +'px';
$(this).closest('.faq').find('.faq_answer_container').animate({'height':newHeight},500);
$(this).closest('.faq').addClass('open');
}
});
});

Lo vamos a introducir en el fichero:

/themes/plantilla/js/cms.js

Código JavaScript CMS

El siguiente paso es introducir la estructura (código html) de las preguntas frecuentes en los contenidos que vayamos a crear en la pestaña Preferencias -> CMS

La estructura tiene la siguiente forma:

<div class="faq_container">
<div class="faq">
<div class="faq_question">Pregunta 1</div>
<div class="faq_answer_container">
<div class="faq_answer">Respuesta a la pregunta 1</div>
</div>
</div>
</div>
<div class="faq_container">
<div class="faq">
<div class="faq_question">Pregunta 2</div>
<div class="faq_answer_container">
<div class="faq_answer">Respuesta a la pregunta 2</div>
</div>
</div>
</div>
<div class="faq_container">
<div class="faq">
<div class="faq_question">Pregunta 3</div>
<div class="faq_answer_container">
<div class="faq_answer">Respuesta a la pregunta 3</div>
</div>
</div>
</div>

Desde el editor gráfico de contenidos que tenemos en la pestaña Preferencias -> CMS, pulsamos en Herramientas  -> Código Fuente (<>) y colocamos el código.

Insertar código HTML en el editor gráfico en Prestashop
Código HTML Prestashop

Por último, vamos agregar el estilo (css) de las preguntas frecuentes en el CSS de Prestashop, en nuestro caso vamos añadir el siguiente código:

/* CSS Preguntas Frecuentes */
.faq_question {
margin: 0px;
padding: 8px;
display: inline-block;
cursor: pointer;
font-weight: bold;
}
.faq_answer_container {
height: 0px;
overflow: hidden;
padding: 0px;
background:#fff
}
.faq.open .faq_question {
color: #fff;
}
.faq {
background: #e1e1e1;
border-bottom: 3px solid #fff;
}
.faq.open {
background: #635858;
border:none;
}

en el fichero:

/themes/plantilla/css/cms.css

El código javaScript entre otras cosas lo que hace es que cuando pinchamos sobre la pregunta, a la respuesta se le asigna una altura, ya que por defecto la altura (height) de la respuesta (.faq_answer_container) es 0px;

¿Funciona en Prestashop 1.7?

Este “tip” funciona en Prestashop 1.7, te nombro algunas diferencias.

Te recomiendo meter el “CSS“, en el fichero:

/themes/classic/assets/css/custom.css

El javascript, en el fichero:

/themes/classic/assets/js/custom.js

Y en referencia el código html que en Prestashop 1.6 lo insertamos en la pestaña Preferencias -> CMS, en Prestashop 1.7 tal como tenemos comentado en nuestra guía de ubicación de las pestañas en Prestashop 1.7, se encuentra en la pestaña Diseño -> Página  

Preferencias -> CMS en Prestashop 1.7

Continúa leyendo Añadir preguntas frecuentes en Prestashop 1.6 y 1.7

Print Friendly, PDF & Email

Ocultar ficha técnica en Prestashop 1.7

Depende cambiar la ubicación de la ficha técnica en la ficha del producto, en esta ocasión vamos simplemente a ocultarla de la ficha del producto, porque no queremos que se vea en la ficha del producto, pero si queremos que siga funcionando como ficha técnica a nivel del filtro de navegación por facetas, y a nivel del comparador de productos.

En este documento, vamos a realizar la mini guía bajo Prestashop 1.6 y Prestashop 1.7

Ocultar ficha técnica en Prestashop 1.6 en la ficha del producto.
Ocultar ficha del producto en la ficha del producto en Prestashop 1.7

Para Prestashop 1.6, usando la plantilla por defecto, editamos el fichero:

“/themes/default-bootstrap/product.tpl”

Buscamos el siguiente código:

{if isset($features) && $features}
<!-- Data sheet -->
<section class="page-product-box">
<h3 class="page-product-heading">{l s='Data sheet'}</h3>
<table class="table-data-sheet">
{foreach from=$features item=feature}
<tr class="{cycle values="odd,even"}">
{if isset($feature.value)}
<td>{$feature.name|escape:'html':'UTF-8'}</td>
<td>{$feature.value|escape:'html':'UTF-8'}</td>
{/if}
</tr>
{/foreach}
</table>
</section>
<!--end Data sheet -->
{/if}

Y comentamos el código en Smarty

{* {if isset($features) && $features}
<!-- Data sheet -->
<section class="page-product-box">
<h3 class="page-product-heading">{l s='Data sheet'}</h3>
<table class="table-data-sheet">
{foreach from=$features item=feature}
<tr class="{cycle values="odd,even"}">
{if isset($feature.value)}
<td>{$feature.name|escape:'html':'UTF-8'}</td>
<td>{$feature.value|escape:'html':'UTF-8'}</td>
{/if}
</tr>
{/foreach}
</table>
</section>
<!--end Data sheet -->
{/if}
*}
Código de la ficha técnica comentado en Prestashop 1.6

En Prestashop 1.7, editamos el fichero:

/themes/classic/templates/catalog/product.tpl

Y nos encontramos una llamada al fichero:

/themes/classic/templates/catalog/_partials/product-details.tpl

En esta parte del código del fichero  “/themes/classic/templates/catalog/product.tpl

{block name='product_details'}
{include file='catalog/_partials/product-details.tpl'}
{/block}

Este código, no lo vamos a tocar, vamos a ir al fichero:

/themes/classic/templates/catalog/_partials/product-details.tpl

Y buscamos este bloque:

{block name='product_features'}
{if $product.features}
<section class="product-features">
<h3 class="h6">{l s='Data sheet' d='Shop.Theme.Catalog'}</h3>
<dl class="data-sheet">
{foreach from=$product.features item=feature}
<dt class="name">{$feature.name}</dt>
<dd class="value">{$feature.value}</dd>
{/foreach}
</dl>
</section>
{/if}
{/block}

Y aquí podemos comentarlo el código (Smarty)

{* {block name='product_features'}
{if $product.features}
<section class="product-features">
<h3 class="h6">{l s='Data sheet' d='Shop.Theme.Catalog'}</h3>
<dl class="data-sheet">
{foreach from=$product.features item=feature}
<dt class="name">{$feature.name}</dt>
<dd class="value">{$feature.value}</dd>
{/foreach}
</dl>
</section>
{/if}
{/block} *}
Código de la ficha técnica oculto en Prestashop 1.7

Uno de los problemas que nos podemos encontrar, es que en otra parte del código de la plantilla estemos usando el {include file=’catalog/_partials/product-details.tpl’}, para asegurarnos de que realmente este cambio solo se esta aplicando a la ficha del producto y no a otra parte de la plantilla que este usando dicho include, depende comentar el código, podemos usar las variables globales y hacer un condicional que solo muestre el código si no estas en la ficha del producto.

Es decir, dejar el código así:

{if $page.page_name !='product'}
{block name='product_features'}
{if $product.features}
<section class="product-features">
<h3 class="h6">{l s='Data sheet' d='Shop.Theme.Catalog'}</h3>
<dl class="data-sheet">
{foreach from=$product.features item=feature}
<dt class="name">{$feature.name}</dt>
<dd class="value">{$feature.value}</dd>
{/foreach}
</dl>
</section>
{/if}
{/block}
{/if}
Condicional -> Muestro el código solo si no estoy en la ficha del producto

———

Por último, recordar limpiar la cache en la pestaña Parámetros Avanzados -> Rendimiento.

Print Friendly, PDF & Email

Evitar el envío de un email en Prestashop

No estamos hablando de desactivar el envío de un determinado email en base a los estados de pedidos (Pedidos -> Estados)

Realmente es útil para aquellos emails que no podemos deshabilitar en el panel, pero que queremos deshabilitar. (Tampoco hablamos de desactivar el envío de emails en general)

Por ejemplo vamos a desactivar este email, que recibe el cliente nada más el realizar el pedido: (Este email usa la plantilla “order_conf“)

Email del pedido en Prestashop
Email del pedido en Prestashop

Lo que vamos hacer es un “override” de la clase Mail.php y vamos a indicar que si nos llega la plantilla “order_conf” el email no se envía. (Como los envíos de los emails usan la función Send de la clase Mail pues hacemos la comprobación directamente en la clase)

Creamos el fichero con el nombre “Mail.php” que vamos a guardar en el directorio “/overrides/classes/

<?php
class Mail extends MailCore
{
public static function Send($id_lang, $template, $subject, $template_vars, $to,
$to_name = null, $from = null, $from_name = null, $file_attachment = null, $mode_smtp = null,
$template_path = _PS_MAIL_DIR_, $die = false, $id_shop = null, $bcc = null, $reply_to = null)
{
// No envía el email de la plantilla que nosotros vayamos a igualar en el "if"
if ($template == 'order_conf') {
return true;
}
return parent::Send($id_lang, $template, $subject, $template_vars, $to, $to_name, $from, $from_name, $file_attachment, $mode_smtp, $template_path, $die, $id_shop, $bcc, $reply_to);
}
}

Si observáis el código, aquí:

if ($template == 'order_conf')

estamos haciendo la comprobación de la plantilla.

Esto tiene un problema, que, si la misma plantilla la usan otras partes de la tienda, pues tampoco se enviara ese “email” 🙂

Por cierto, en su momento hicimos una guía específica para evitar que el cliente reciba el email de confirmación en Prestashop. (Es una forma diferente, pero más “especifica”, en este ejemplo hablamos de “forma general” para cualquier email que use la plantilla que se usa el email que recibe el cliente al realizar un pedido con el resumen del pedido (hemos puesto un ejemplo, pero podría haber sido con otra plantilla)

Información obtenida en:

https://www.prestashop.com/forums/topic/315165-disable-mail-for-credit-slip/

Documento realizado bajo Prestashop 1.6.1.12

Print Friendly, PDF & Email

Prestashop 1.6.1.13 disponible para descargar

Si recordamos, hace un mes aproximadamente, Prestashop, anuncio la versión 1.6.1.12 de Prestashop, hoy día 25 de Abril Prestashop ha sacado la versión 1.6.1.13, donde se han corregido más de 16 errores con respecto a sus antecesoras.

Algunos de los errores corregidos:

  • Panel de administración (BackOffice):
    • Error corregido en la importación de los temas cuando el directorio cache se vacía
    • Permitir transferencia de Stock entre almacenes bajo la multitienda
    •  Se repara la búsqueda en la gestión avanzada de stock.
    • Generación de facturas en el idioma del usuario
    • etc..
  • Front-Office
    • Precio en las combinaciones cuando existe un descuento por cantidad de la misma.
    • Reparación de los estilos del bloque de categorías del pie de página
    • etc..
  • Núcleo (Core)
    • Optimización de las reglas del carrito
    • etc..

Prestashop 1.6.1.13: Descargar

Log/Registro de cambios: Ver

 

Print Friendly, PDF & Email

Cambiar ficha técnica de ubicación en el producto en Prestashop 1.6

Imaginemos que queremos que la ficha técnica que hemos definido en el producto, se muestre encima del botón “imprimir” de la ficha del producto.

Ubicación de la ficha técnica en Prestashop

 Por defecto, la ficha se muestra en la parte inferior de la ficha del producto.

Ubicación real de la ficha del producto en Prestashop

Para cambiar la ficha de ubicación, vamos al fichero:

“/themes/default-bootstrap/product.tpl”

Buscamos el siguiente bloque de instrucciones:

{if isset($features) && $features}
<!-- Data sheet -->
<section class="page-product-box">
<h3 class="page-product-heading">{l s='Data sheet'}</h3>
<table class="table-data-sheet">
{foreach from=$features item=feature}
<tr class="{cycle values="odd,even"}">
{if isset($feature.value)}
<td>{$feature.name|escape:'html':'UTF-8'}</td>
<td>{$feature.value|escape:'html':'UTF-8'}</td>
{/if}
</tr>
{/foreach}
</table>
</section>
<!--end Data sheet -->
{/if}


Código de la ficha técnica del producto en Prestashop

Y vamos a colocar el código, justo debajo de la siguiente instrucción:

{if isset($HOOK_EXTRA_RIGHT) && $HOOK_EXTRA_RIGHT}{$HOOK_EXTRA_RIGHT}{/if}
Código de la ficha técnica cambiado de ubicación en Prestashop

Continúa leyendo Cambiar ficha técnica de ubicación en el producto en Prestashop 1.6

Print Friendly, PDF & Email

Actualizar masivamente precios en base a la referencia en Prestashop

Este aporte lo vamos hacer con el propio importador de productos de Prestashop, combinándolo con un aporte del usuario Inform-All de la Comunidad de Prestashop.

La idea es hacer la importación, teniendo solo como datos la referencia del producto y los precios (Precios sin impuestos añadidos). (Ningún dato más)

Vamos a cambiar los precios que vemos en la siguiente imagen, que son pertenecientes a unos números de la colección Tiger and Wolf

Referencia y Precios de los productos en Prestashop

El primer paso es instalar el módulo que lo podemos hacer desde la pestaña módulos -> módulos. (al final del post, tenéis el enlace de descarga)

Módulo para agilizar la actualización de precios en los productos en Prestashop

El módulo (para los experimentados) lo que hace es instalar un override del controlador “AdminImportController.php” (/override/controllers/admin/)

¿Tiene alguna configuración el módulo para su funcionamiento?

No, no tiene ninguna configuración adicional, con instalarlo es suficiente.

¿Cómo procedemos a realizar la importación para actualizar los precios en base a las referencias de los productos?

Lo primero es elaborar u obtener el fichero que nos haya pasado el proveedor con los nuevos precios (recordar precio sin impuestos incluidos) y la referencia del producto.

Fichero CSV con precio y referencia en Prestashop

En el siguiente paso, nos vamos a la pestaña Parámetros Avanzados -> Importar CSV

Sección importación de productos en Prestashop

Una vez, hemos accedido a la sección de importación de datos, nos vamos al bloque “Importar” -> Opción “¿Qué tipo de entidad desea importar?” y vemos que ahora tenemos una nueva opción denominada: “NewPriceListImport” que antes no existía, señalamos esa opción.

Opciones de importación en Prestashop

No se nos olvide subir el fichero CSV, que vamos a importar, en la misma sección donde dice “Elige un archivo CSV para importar”.

Subir fichero CSV en la importación

Seleccionamos el fichero a importar que contiene los datos con los precios y referencias de los productos.

Seleccionar Fichero CSV a Importar

Pulsamos “Próximo Paso / Siguiente” para proseguir con el proceso de importación de productos en Prestashop.

Próximo paso en la importación

Verificamos que los datos a importar para actualizar los precios (recuerda importamos precios sin impuestos incluidos) son los correctos y pulsamos en “Importar datos CSV” Continúa leyendo Actualizar masivamente precios en base a la referencia en Prestashop

Print Friendly, PDF & Email

Redireccionar al cliente cuando cierra sesión en Prestashop

Redireccionar al cliente al cerrar sesión en Prestashop

Antes de nada, nosotros vamos a tocar controladores y clases originales, pero recordar que lo optimo es hacer los correspondientes overrides (/override/clases/ si es una clase y /override/controllers/ si es un controlador)

Este miniTip, está realizado bajo Prestashop 1.6

Por ejemplo, vamos hacer que cuando el cliente cierre sesión en la tienda sea redireccionado a una página de contenidos que hemos creado en la pestaña Preferencias -> CMS

Editamos el fichero:

  • classes/controller/FrontController.php

Buscamos la siguiente línea de código: (En Prestashop 1.6.1.12 sobre la línea 295/298)

elseif (isset($_GET['mylogout'])) {
$this->context->customer->mylogout();
Tools::redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null);
}
Código PHP de cuando el cliente cierra sesión en Prestashop.

Y cambiamos la línea:

Tools::redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null);

por:

$enlace =$this->context->link->getCMSLink(3);
Tools::redirect($enlace);
  • Variable “Enlace” almacena el enlace de la página de contenidos.
  • Al ejecutar “Tools::redirect” ejecutamos la redirección, en este caso al valor que contiene la variable enlace.

Continúa leyendo Redireccionar al cliente cuando cierra sesión en Prestashop

Print Friendly, PDF & Email