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 --- *}
Commento di Antonio
Mercoledì 17 Luglio 2013Ciao 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 2013io 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 2013se 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 2013non funziona
Risposta di Marco
mi spiace, non posso controllare, sono molto impegnato.
Commento di juri
Lunedì 16 Marzo 2015questo 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:
Quindi in teoria dovrebbe funzionare tutto anche se non ho fatto un test.
Commento di juri
Venerdì 20 Marzo 2015mi 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