Telefono: +39 392 33 73 731

Prestashop: avviso disclaimer per foto erotiche

Dovendo preparare un sito e-commerce di quadri e disegni d'arte, mi è stata chiesta questa particolare esigenza, potrebbe capitare che ci siano opere di nudo.
A prescindere dal giudizio morale o artistico, è innegabile che in certi Stati e per certe fasce di età esistano leggi specifiche che vietano la visione di questo tipo di contenuti. Dobbiamo quindi tutelarci, e scaricare la responsabilità dell'eventuale violazione della legge sull'utente. Per farlo dobbiamo avvisarlo, e fargli compiere una scelta per la visione o meno di questi contenuti.

Di seguito ho preparato uno script che si avvale di Jquery e di Smarty, attenzione che funziona per Prestashop 1.5.4, non so se funziona in modo simile anche nelle versioni precedenti.
In pratica lo script prevede una finestra Fancybox totalmente opaca, che oscura la pagina, viene esposto il messaggio con tutte le informazioni necessarie, alla fine viene fatta la domanda "Vuoi aprire questa pagina?" e sono presenti due bottoni: "SI! ACCETTO" e "NO! NON ACCETTO". Nel primo caso la pagina si apre e viene memorizzato un cookie che dura un giorno, l'utente continuerà a vedere il sito senza più vedere la finestra di avviso. Se invece sceglie "no" allora torna indietro e continua a visitare le altre aree del sito, se dovesse tornare in una pagina con il disclaimer allora viene riproposto il messaggio con la scelta.

La guida è in 4 punti davvero facili, Prestashop contiene già tutto il necessario:

1. Creo in amministrazione la categoria che deve contenere i prodotti, ad esempio "Stampe Erotiche", mi segno il numero di ID che poi uso nello script.

2. Apro il file "override/controllers/front/CategoryController.php", se non esiste lo creo copiandolo dal file originale in "controllers/front/". Dentro a setMedia() devo inserire le due righe di codice che riporto di seguito, servono a caricare il javascript ed il css di Fancybox. Faccio questo perché voglio che il disclaimer appaia non solo in scheda prodotto, ma anche nella pagina della categoria.

da così...

if ($this->context->getMobileDevice() == false)
{
	//TODO : check why cluetip css is include without js file
	$this->addCSS(array(
		_THEME_CSS_DIR_.'scenes.css' => 'all',
		_THEME_CSS_DIR_.'category.css' => 'all',
		_THEME_CSS_DIR_.'product_list.css' => 'all',
	));
	if (Configuration::get('PS_COMPARATOR_MAX_ITEM') > 0)
		$this->addJS(_THEME_JS_DIR_.'products-comparison.js');
}

a così...

if ($this->context->getMobileDevice() == false)
{
	//TODO : check why cluetip css is include without js file
	$this->addCSS(array(
		_THEME_CSS_DIR_.'scenes.css' => 'all',
		_THEME_CSS_DIR_.'category.css' => 'all',
		_THEME_CSS_DIR_.'product_list.css' => 'all',
	));
	
	$this->addCSS(_PS_CSS_DIR_.'jquery.fancybox-1.3.4.css', 'screen');
	$this->addJqueryPlugin(array('fancybox', 'idTabs', 'scrollTo', 'serialScroll'));

	if (Configuration::get('PS_COMPARATOR_MAX_ITEM') > 0)
		$this->addJS(_THEME_JS_DIR_.'products-comparison.js');
}

3. Apro il file "header.tpl" del tema e giusto prima di chiudere </head> inserisco la plugin per i cookies di JQuery, è presente nel pacchetto di Prestashop, ma normalmente non è caricata in template.

<script src="{$base_dir}js/jquery/plugins/jquery.cookie-plugin.js"></script>

4. Sempre in "header.tpl" dopo l'apertura del <body> inserisco il seguente pezzo di codice. Nel mio caso la categoria erotica ha ID 6. Devo racchiudere il codice javascript con i marcatori Smarty {literal}...{/literal} per evitare problemi con il codice di Prestashop. Le istruzioni sono commentate, in pratica setto un cookie con valore "si" alla prima apertura della pagina, se viene confermato lo lascio salvato, altrimenti se clicco su "no" lo svuoto (vedi azioni onclick dei button).
Ho previsto anche la possibilità che il messaggio sia tradotto, controllo con Smarty il codice ISO della lingua.

{* -- inizio popup erotico --- *}
{if $category->id == 6}
<script language="javascript">
{literal}
$(document).ready(function() {
// popup automatico
//$.cookie("visitato", null);    // per svuotare il cookie

var handle = $.cookie("visitato"); // ottenere il valore del cookie
if (handle != "si") {
$.cookie("visitato", "si", { expires: 1 }); // settare il valore a "si" e durata 1 giorno

	$.fancybox(
             $("#hiddenModalContent").html(),
             {
            'padding':30,
            'overlayOpacity': 1,
		    'speedIn':      300,
		    'speedOut':     300,
		    'transitionIn': 'elastic',
		    'transitionOut': 'elastic',
		    'easingIn':     'swing',
		    'easingOut':    'swing',
		    'titleShow' : false
             }
        );
}	
});
{/literal}
</script>
<div id="hiddenModalContent" style="display:none">
{if $lang_iso == it}
<h2><strong>Attenzione!</strong> Presenza di immagini erotiche</h2>
<p>Stai per aprire una pagina con immagini che l'amministratore del sito ritiene di carattere Erotico.</p>
<p>Potresti ritenere questo contenuto offensivo o inappropriato. Inoltre, relativamente alla tua età o luogo di provenienza, la legge potrebbe vietare la visione di questo tipo di immagini.</p>
<p>Crediamo sia necessario avvisarti della presenza di questo tipo di immagini. L'amministrazione di questo sito non si assume alcuna responsabilità per la legalità delle tue azioni.</p>
<br />
<strong>Vuoi aprire questa pagina?</strong>
<br /><br />
<input type="button" onClick="$.fancybox.close();" value="SI! ACCETTO">
<input type="button" onClick="$.cookie('visitato', null);history.go(-1);" value="NO! NON ACCETTO">
{/if}
{if $lang_iso == en}
<h2><strong>Attention!</strong>Viewing of erotic photos</h2>
<p>You are about to view a page containing image(s) that the site administration deemed relevant to the Erotic category.</p>
<p>You may find this content offensive or inappropriate for viewing. In addition, depending on your age and your location, laws may restrict the viewing of such images.</p>
<p>We believe it is necessary to warn you about the possible content of such images. The administration of this site assumes no responsibility for the legality of your actions when viewing these images.</p>
<br />
<strong>Open this page?</strong>
<br /><br />
<input type="button" onClick="$.fancybox.close();" value="YES! I AGREE">
<input type="button" onClick="history.go(-1);" value="NO! I DISAGREE">
{/if}
</div>
{/if}
{* -- fine popup erotico --- *}
Lunedì 10 Giugno 2013
(6 commenti)
CSS

Commento di Antonio

Mercoledì 17 Luglio 2013

Ciao Marco, ho provato il tuo 'disclaimer' ...molto bello!
C'è un problema però, l'utente ha la possibilità di chiudere il popup bypassando le due opzioni e trovarsi nella categoria 'protetta'!
Pensi che si possa ovviare?
Grazie!

Risposta di Marco

Si, per togliere il bottone "X" basta aggiungere nei parametri dello script in header.tpl

'showCloseButton' : false

 

Commento di andrea

Martedì 15 Ottobre 2013

io vorrei mettere l'avviso a tutto il sito.
no solo a una categoria in particolare

Risposta di Marco

A quel punto togli il controllo iniziale {if $category->id == 6} e la relativa chiusura finale {/if}

Commento di andrea

Mercoledì 16 Ottobre 2013

se levo solo {if $category->id == 6} e {/if} non funziona.
non è che il codice da incollare in CategoryController.php in questo caso và inserito in qualche altra parte?
grazie!

Risposta di Marco

Si hai proprio ragione, usando CategoryController.php metteresti il codice CSS e JS solo nelle pagine categoria, ma a te serve che siano sempre presenti in tutte le pagine.

Prova con /override/classes/controller/FrontController.php

Mettilo dentro la classe tipo così (non ho provato però, al momento sono troppo impegnato per testare):
<?php
class FrontController extends FrontControllerCore
{
    public function setMedia()
    {
$this->context->controller->addCSS(_PS_CSS_DIR_.'jquery.fancybox-1.3.4.css', 'screen');
$this->context->controller->addJqueryPlugin(array('fancybox', 'idTabs', 'scrollTo', 'serialScroll'));
    }
}

Commento di andrea

Giovedì 17 Ottobre 2013

non funziona

Risposta di Marco

mi spiace, non posso controllare, sono molto impegnato.

Commento di juri

Lunedì 16 Marzo 2015

questo metodo si può utilizzare anche per prestashop 1.6? se volessi far apparire un'immagine con i due tasti entra esci come dovrei fare? Grazie per l'aiuto.

Risposta di Marco

Si, anche in Prestashop 1.6:

  • Smarty è ancora usato
  • controllers/front/CategoryController.php è ancora al suo posto
  • la plugin Fancybox è presente
  • C'è anche JQuery Cookie, ma in questo caso ho notato una differenza nel nome del file, si sono persi una "e", forse un errore di distrazione? Cmq, in Prestashop 1.6 il file è questo: "js/jquery/plugins/jquery.cooki-plugin.js"

Quindi in teoria dovrebbe funzionare tutto anche se non ho fatto un test.

Commento di juri

Venerdì 20 Marzo 2015

mi da questa stringa in alto prima di tutto, la fancybox si vede a volte si a volte no poi non la vedo più, non ho il tema di default.

Notice: Undefined index: category in /var/www/vhosts/miosito.it/httpdocs/tools/smarty/sysplugins/smarty_internal_templatebase.php(171) : eval()'d code on line 138 Notice: Trying to get property of non-object in /var/www/vhosts/miosito.it/httpdocs/tools/smarty/sysplugins/smarty_internal_templatebase.php(171) : eval()'d code on line 138 Notice: Trying to get property of non-object in /var/www/vhosts/miosito.it/httpdocs/tools/smarty/sysplugins/smarty_internal_templatebase.php(171) : eval()'d code on line 138

Risposta di Marco

Questo errore Smarty è strano, non so di preciso da cosa dipenda, però so che tra versioni diverse di Smarty ci sono delle incompatibilità, quindi problemi in template pensati per versioni di Prestashop/Smarty differenti (sono cose cmq abbastanza rare).

Propongo un fix, che è più che altro un workaround: apri il file tools/smarty/smarty.class.php
Modifica la seguente variabile da true a false.

public $inheritance_merge_compiled_includes = false;

Poi cancella il file "cache/class_index.php" (perché deve venire rigenerato).

Aggiungi un commento

Nome
E-mail (non verrà pubblicata)
Sito Web
Commento