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

Generar array con números aleatorios únicos

Para generar array con números aleatorios únicos aquí dejo una función:

/**
 * Genera un numero aleatorio dentro del rango maximo pasado por parametro, que no este dentro del array
 *
 * @param $array
 * @param $num_max
 * @param $num_min
 * @return int
 */
function generateUniqueRandom( $array, $num_max, $num_min=1 ){
    $rand = rand($num_min, $num_max);
    $is_new_rand = true;

    for( $j = 0; $j < count($array); $j++ ){
        if( $array[$j] == $rand ){
            $is_new_rand = false;
        }
    }
    if( $is_new_rand == false ){
        $rand = generateUniqueRandom( $array, $num_max );
    }

    return $rand;
}

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.

Plantilla ejemplo css responsive

Poner en el head:

<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">

Ejemplos:

@media only screen and (min-width: 760px) and (max-width: 1020px) {
}
@media only screen and (min-width: 470px) and (max-width: 760px) {
}
@media only screen and (max-width: 470px) {
}

@media screen and (max-width:760px) {
}
@media screen and (max-width:1020px) {
}
@media screen and (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (min-resolution: 300dpi) {
}

Shortcode mostrar últimas entradas – WordPress

//////////////////////////////////////////////////////////////////
// Name:			Mostrar entradas							//
// Version: 		2.0.0v										//
// Last updated:	3-12-2014									//
//////////////////////////////////////////////////////////////////
add_shortcode('mostrar_entradas', 'dgg_mostrar_entradas');
function dgg_mostrar_entradas($atts, $content = null) {
    $me_theme_textdomain = 'Avada';
    extract(shortcode_atts(array(
        'titulo' 		=> 'Últimas entradas',//Título del shortcode
        'cantidad' 		=> '3',//Número de entradas
    ), $atts));

    $mostrar_entradas = '<div id="mostrar_entradas">';
    $mostrar_entradas .= '<h2><span class="icon"></span><span>'.$titulo.'</span></h2>';

    query_posts( array(
        'blog' => 'wordpress',
        'posts_per_page' => $cantidad )
    );
    while( have_posts() ) : the_post();
        if( is_plugin_active('sitepress-multilingual-cms/sitepress.php') ){
            $me_link = get_permalink( icl_object_id(get_the_ID(), get_post_type(get_the_ID()), true) );
        } else{
            $me_link = get_permalink( get_the_ID() );
        }

        $mostrar_entradas .= 	'<div class="me_post">
										<div class="me_general">
											<div class="me_img">'.get_the_post_thumbnail( get_the_ID(), 'medium' ).'</div>
											<h2 class="me_titulo">'.get_the_title().'</h2>
											<div class="me_cont">'.limitePalabras( get_the_content(), 25 ).'</div>
											<div class="me_button_small me_button">
												<a href="'.$me_link.'">
													'.__('Seguir leyendo',$me_theme_textdomain).'
												</a>
											</div>
											<div class="me_cb"></div>
										</div>
									</div>';
    endwhile;

    $mostrar_entradas .= '</div>';
    wp_reset_query();

    return $mostrar_entradas;
}

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.

Poner contraseña al tu web con .htaccess

Para conocer nuestra ruta del htpasswd la podemos encontrar con:

find / -name htpasswd

Nos dirigimos al directorio de la web y si no tenemos creado el fichero .htpasswd necesitamos este comando:

/usr/bin/htpasswd -cb .htpasswd name password

Si el fichero ya esta creado necesitaremos este otro:

/usr/bin/htpasswd -b .htpasswd name password

El último paso añadimos al .htaccess el siguiente código para que nos pida la autentificación creada anteriormente:

AuthName "Restricted Area"
AuthType Basic
AuthUserFile /var/www/ejemplo.com/.htpasswd
require valid-user