Archivo de la categoría: Prestashop

Apartado para el mundo de la programación en Prestashop

Mostrar el NIF en la factura

Para mostrar el NIF en la factura que genera Prestashop debemos modificar el archivo “/pdf/invoice.tpl” y añadimos los datos de nuestra empresa. Ahora podreis ver un ejemplo de como quedaría la parte a modificar el archivo.

<!-- ADDRESSES -->
<table style="width: 100%">
	<tr>
        <td style="width: 30%; padding-left: 10pt">
            <span style="font-weight: bold; font-size: 10pt; color: #9E9F9E">Mimalos</span>
            <br/>
            NIF: XXXXXXX<br/>
            Provincia - País<br/>
            Tfno: XXX XXX XXX
        </td>
        <td style="width: 70%">
			{if !empty($delivery_address)}
				<table style="width: 100%">
					<tr>
						<td style="width: 50%">
							<span style="font-weight: bold; font-size: 10pt; color: #9E9F9E">{l s='Delivery Address' pdf='true'}</span><br />
							 {$delivery_address}
						</td>
						<td style="width: 50%">
							<span style="font-weight: bold; font-size: 10pt; color: #9E9F9E">{l s='Billing Address' pdf='true'}</span><br />
							 {$invoice_address}
						</td>
					</tr>
				</table>
			{else}
				<table style="width: 100%">
					<tr>

						<td style="width: 50%">
							<span style="font-weight: bold; font-size: 10pt; color: #9E9F9E">{l s='Billing & Delivery Address.' pdf='true'}</span><br />
							 {$invoice_address}
						</td>
						<td style="width: 50%">

						</td>
					</tr>
				</table>
			{/if}
		</td>
	</tr>
</table>
<!-- / ADDRESSES -->

Listado de productos del wishlist – Prestashop

El código que se muestra a continuación muestra un listado de todos los productos del wishlist sin diferenciar a que wishlist pertenecen. Puede ser fácilmente modificado cambiando la consulta a la base de datos para que nos recoja una wishlist en concreto, etc.

Añadimos al controlador de la vista:

$this->context->smarty->assign(array(
	'wishlist_products' => $wishlist_products,
    'wishlist_products_images' => $this->_getWishlistImagesProducts($wishlist_products)
));

/**
     * Devuelve un array con todos los productos del wishlist del cliente activo
     *
     * @return array
     * @throws PrestaShopDatabaseException
     */
    public function _getWishlistProducts(){
        $products = array();
        $current_user = (int)$this->context->cookie->id_customer;

        $products_wishlist = Db::getInstance()->ExecuteS(
            'SELECT * FROM '._DB_PREFIX_.'wishlist_product WHERE id_wishlist = ANY ( SELECT id_wishlist FROM '._DB_PREFIX_.'wishlist WHERE id_customer = "'.$current_user.'" )',
            true,
            false
        );

        foreach( $products_wishlist as $product ){
            $products[] = new Product($product['id_product'], false, (int)Context::getContext()->language->id );
        }

        return $products;
    }

    /**
     * A partir de un array de productos devuelve las imagenes de estas en un array[id_product][url_image]
     *
     * @param $products
     * @return array
     */
    public function _getWishlistImagesProducts( $products ){
        $wImages = array();

        foreach( $products as $product ){
            $images = Image::getImages( (int)Context::getContext()->language->id, $product->id) ;

            $wImages[$product->id] = (int)$images[0]['id_image'];
        }

        return $wImages;
    }

En la plantilla de la vista añadimos:

			
{foreach $wishlist_products as $wProduct}
	<div class="w_product">
		<a href="/{$lang_iso}/home/{$wProduct->id}-{$wProduct->link_rewrite|escape:'html':'UTF-8'}.html" title="{$wProduct->name|escape:'html':'UTF-8'}">
        	<div class="w_image">
            	<img src="{$link->getImageLink($wProduct->link_rewrite, $wishlist_products_images[$wProduct->id], 'product_list')}" alt="{$wProduct->name|escape:'html':'UTF-8'}" itemprop="image" />
           </div>

           <div class="w_name">
           		{$wProduct->name}
           </div>
        </a>
    </div>
{/foreach}

Como crear un HOOK en Prestashop

Para crear un HOOK con administración en Prestashop v1.6 debemos seguir los siguientes pasos (realizamos un ejemplo):

1. Añadir el HOOK a la base de datos

Primero iremos a la base de datos y buscaremos la tabla PREFIX_hook y añadiremos el nuevo HOOK.

id_hook name title description position live_edit
dejamos en blanco nombreDelHook Titulo del hook Descripción del hook boolean [0,1] boolean [0,1]

Ahora puedes escoger entre recoger el hook en el controlador y después mostrarlo en el tpl (puntos 2.1 y 2.2) o directamente recogerlo y mostrarlo en el tpl ( punto 3.1 )


2.1. Recoger el HOOK en el controlador

En el ejemplo vamos a crear un override de FrontControllerCore para ello iremos a “/override/classes/controller/” y crearemos una fichero llamado FrontController.php y pondremos:

<?php

class FrontController extends FrontControllerCore
{
    /**
     * Initializes common front page content: header, footer and side columns
     */
    public function initContent()
    {
        parent::initContent();

        $this->context->smarty->assign(array(
            HOOK_NOMBRE_DEL_HOOK' => Hook::exec('nombreDelHook'),
        ));
    }
}

Esta clase sobreescribirá a la FrontControllerCore cuando Prestashop llame a la función initContent(), por ello no debemos olvidar de poner la llamada a la función “parent::initContent()” para que la funcionalidad de Prestashop no se vea afectada pero si se lleve a cabo nuestra asignación del contenido del hook.

2.2. Mostramos el HOOK en el tpl

{if isset($HOOK_NOMBRE_DEL_HOOK)}
	{$HOOK_NOMBRE_DEL_HOOK}
{/if}

3.1. Recogemos y mostramos el hook directamente en el tpl

{capture name='nombreDelHook'}{hook h='nombreDelHook'}{/capture}

{if $smarty.capture.nombreDelHook}
    {$smarty.capture.nombreDelHook}
{/if}

Con estos pasos ya tendremos el nuevo HOOK creado. Ahora tenemos que asignar módulos al HOOK en caso de que no nos aparezca el HOOK en la lista de “Posiciones de los módulos” podemos hacer lo siguiente.
Vamos a la base de datos y buscamos la tabla PREFIX_hook_module y insertamos la relación manualmente del módulo con el HOOK.

id_module id_shoop id_hook position
ID del módulo ID de la tienda ID del HOOK (mirar la tabla PREFIX_hook) posicion en el HOOK

Modificar datos del cliente en la factura

#/classes/AddressFormat.php
#class AddressFormatCore extends ObjectModel

/**
	 * Generates the full address text
	 * @param address is an instanciate object of Address class
	 * @param patternrules is a defined rules array to avoid some pattern
	 * @param newLine is a string containing the newLine format
	 * @param separator is a string containing the separator format
	 * @return string
	 */
	public static function generateAddress(Address $address, $patternRules = array(), $newLine = "\r\n", $separator = ' ', $style = array())
	{
		$addressFields = AddressFormat::getOrderedAddressFields($address->id_country);
		$addressFormatedValues = AddressFormat::getFormattedAddressFieldsValues($address, $addressFields);

		$addressText = '';
		foreach ($addressFields as $line)
			if (($patternsList = preg_split(self::_CLEANING_REGEX_, $line, -1, PREG_SPLIT_NO_EMPTY)))
				{
					$tmpText = '';
					/*foreach ($patternsList as $pattern)
						if ((!array_key_exists('avoid', $patternRules)) ||
								(array_key_exists('avoid', $patternRules) && !in_array($pattern, $patternRules['avoid'])))
							$tmpText .= (isset($addressFormatedValues[$pattern]) && !empty($addressFormatedValues[$pattern])) ?
								(((isset($style[$pattern])) ?
									(sprintf($style[$pattern], $addressFormatedValues[$pattern])) :
									$addressFormatedValues[$pattern]).$separator) : '';*/

                    foreach ($patternsList as $pattern){
                        if( (!array_key_exists('avoid', $patternRules)) || (array_key_exists('avoid', $patternRules) && !in_array($pattern, $patternRules['avoid'])) ){
                            if( isset($addressFormatedValues[$pattern]) && !empty($addressFormatedValues[$pattern]) ){
                                if( isset($style[$pattern]) ){
                                    $tmpText .= sprintf($style[$pattern], $addressFormatedValues[$pattern]);
                                } else{
                                    if( isset($style[$pattern]) ){
                                        $tmpText .= sprintf($style[$pattern], $addressFormatedValues[$pattern]).$separator;
                                    } else{
                                        if( $pattern == 'dni' ){
                                            $tmpText .= 'DNI/CIF: '.$addressFormatedValues[$pattern].$separator;
                                        } else if( $pattern == 'phone' ){
                                            $tmpText .= 'Teléfonos: '.$addressFormatedValues[$pattern].$separator;
                                        } else{
                                            $tmpText .= $addressFormatedValues[$pattern].$separator;
                                        }
                                    }
                                }
                            } else{
                                $tmpText .= '';
                            }
                        }
                    }

					$tmpText = trim($tmpText);
					$addressText .= (!empty($tmpText)) ? $tmpText.$newLine: '';
				}

		$addressText = rtrim($addressText, $newLine);
		$addressText = rtrim($addressText, $separator);

		return $addressText;
	}

Modificar los datos del cliente en el PDF de la factura

Para poder modificar los datos del cliente en el PDF de la factura Prestashop nos permite de manera sencilla pero también limitada, gestionar los campos que aparecerán en la factura. Si vamos a Localización => Países => Pais (modificar) => Formato de dirección. Los campos que aparecen aquí son los campos que aparecerán luego en el PDF de la factura. Por ejemplo podemos añadir el campo DNI u ordenar los campos que ya se están mostrando.

Crear un nuevo controlador – Prestashop

Creamos un nuevo fichero en el directorio “controllers/front/TestController.php”. Y en el fichero ponemos una estructura básica de:

class TestControllerCore extends FrontController{
	public $php_self = 'test';

	/**
     * Initialize order confirmation controller
     * @see FrontController::init()
     */
    public function init()
    {
        parent::init();
    }

	/**
     * Show content
     */
    public function initContent(){
		parent::initContent();

		$this->setTemplate(_PS_THEME_DIR_.'test.tpl');
	}
}

Como podeis observar llamamos a test.tpl este archivo no existe y lo tenemos que crear en el directorio del tema.

Una vez realizado esto lo que debemos hacer es eliminar el archivo “cache/class_index.php” y a continuación nos dirigimos al admin de prestashop accedemos a la sección “SEO + URLs” y añadimos una nuevo para “Test” que aparecerá en el desplegable.

Mostrar los atributos del producto en la lista de la categoría – Prestashop

En /controllers/front/CategoryController.php en la función initContent() agregamos lo siguiente:

$combinations = $this->getProductAttributeCombinations($this->cat_products);
$this->context->smarty->assign('combinations', $combinations);

Declaramos la nueva funcion getProductAttributeCombinations().

/**
 * MOSTRAR LOS ATRIBUTOS DEL PRODUCTO
 *
 * function to get all necessary data of products combinations
 * @param $products An array of products data
 * @return array products combinations
 */
public function getProductAttributeCombinations($products) {
	$combinations = array();

    foreach($products as $product){
    	// load product object
        $product = new Product ($product['id_product'], $this->context->language->id);

        // get the product combinations data
        // create array combinations with key = id_product
        $combinations[$product->id] = $product->getAttributeCombinations($this->context->language->id);
    }

    return $combinations;
}

Ahora vamos al archivo themes/name_theme/product-list.tpl y donde queramos que aparezca los atributos de cada producto agregamos el siguiente código:

{foreach from=$combinations key=k item=comb}
    	{if $k == $product.id_product}
            {foreach from=$comb item=attr}
            	{if $attr.group_name == 'Talla'}
                	{$attr.attribute_name}
                {/if}
			{/foreach}
        {/if}
{/foreach}

En este caso estamos filtrando todos los atributos del producto más los atributos que sean del grupo Talla.

Para que también aparezcan los atributos cuando utilicemos la paginación deberemos ir a /modules/blocklayered/blocklayered.php buscamos la función ajaxCall() y en la asignación de las variables de smarty ( $smarty->assign ) agregamos la siguiente línea:

'combinations' => $this->getProductAttributeCombinations($products),

Y volvemos a declarar la función getProductAttributeCombinations().

Ordenar los productos por descuento – Prestashop

Para poder ordenar los productos por descuento debemos acceder al archivo “controllers/front/CategoryController.php” y añadimos en la función initContent() antes de la asiganción de las varaibles a smarty el siguiente código:

$this->sortProductsByReductionPrice();

Y declaramos esta nueva función:

/**
 * Ordena los productos por descuento de mayor a menor
 */
protected function sortProductsByReductionPrice(){
	if( !isset($_GET['orderby']) ){
		$products_sorted = $this->cat_products;

        for( $i=0; $i<count($products_sorted); $i++ ){
        	for( $j=0; $j<count($products_sorted); $j++ ){
            	if( $products_sorted[$i]['specific_prices']['reduction'] > $products_sorted[$j]['specific_prices']['reduction'] ){
                	$aux = $products_sorted[$i];
                    $products_sorted[$i] = $products_sorted[$j];
                    $products_sorted[$j] = $aux;
                 }
             }
        }
        $this->cat_products = $products_sorted;
    }
}