restringir categorías de un sitio web

Restringir categorías o productos en osCommerce

10 junio, 2014 0 comentarios

En determinadas ocasiones, resulta imprescindible por cuestiones legales ocultar cierta información de productos o categorías de una tienda virtual a los visitantes hasta que se verifique su edad. Esto se debe llevar a cabo en tiendas donde se venden bebidas alcohólicas, productos relacionados con el tabaco o artículos eróticos, por ejemplo. Dependiendo de la naturaleza y del sector de nuestro negocio, puede que sea necesario ocultar todo el contenido de la web o sólo limitar el acceso a ciertos productos o zonas (categorías o subcategorías).


En el siguiente artículo se detalla cómo adaptar nuestra tienda online desarrollada con osCommerce a la normativa legal. En concreto, la solución adoptada consiste en crear una ventana modal que informa al usuario que está a punto de acceder a una sección donde el contenido sólo está permitido para mayores de 18 años. Si el usuario no indica que es mayor de edad, se redirigirá a otra URL, por ejemplo, a la página de inicio.

CONSIDERACIONES PREVIAS

La siguiente modificación se ha llevado a cabo sobre OsCommerce 2.3.4 y se ha comprobado su funcionamiento con los navegadores:

  • Google Chrome 36.0.1985.125
  • Internet Explorer 9
  • Mozilla Firefox 30.0

Antes de comenzar con el proceso, es buena práctica realizar una copia de seguridad de la base de datos. También se recomienda hacer una copia de los ficheros .php que se van a editar:

  • /index.php
  • /product_info.php
  • /includes/filenames.php
  • /includes/header.php
  • /includes/template_top.php

Al finalizar el proceso, se habrán creado también dos ficheros .php:

  • /includes/edad.php
  • /includes/languages/spanish/edad.php

ALMACENAR QUÉ CATEGORÍAS O SECCIONES RESTRINGIR

Para dejar reflejadas las categorías y subcategorías que no se mostrarán por defecto a los usuarios, se deben añadir sus identificadores en la tabla configuration de la base de datos. En el código siguiente, se restringirán las categorías con identificadores 3 y 21.

INSERT  INTO configuration VALUES
    (NULL, 'Control de edad', 'CATEGORIA_POR_EDAD', '3,21', 'Introduzca los identificadores de las categorias
    separadas por comas. Al introducir el id de una categoria padre, quedara restringida ella y sus
    subcategorias.', 1, 50, NULL, NOW(), NULL, 'tep_cfg_textarea(');

COMPROBAR LA RESTRICCIÓN DE UNA CATEGORÍA

En el fichero index.php busca el código require(DIR_WS_INCLUDES . ‘template_top.php’), que está aproximadamente en la línea 36 y a continuación añade:

require(DIR_WS_INCLUDES . FILENAME_EDAD_PAGE);

De esa forma, se conseguirá evaluar si la categoría a la que el cliente desea acceder, está restringida.

COMPROBAR LA RESTRICCIÓN DE UN PRODUCTO

Abre el fichero product_info.php. De forma análoga al caso anterior, se ha de evaluar si el producto al cual el cliente desea acceder pertenece a una categoría restringida. Por lo cual, de nuevo, se debe buscar el código código require(DIR_WS_INCLUDES . ‘template_top.php’); (en torno a la línea 25) y a continuación se debe añadir:

require(DIR_WS_INCLUDES . FILENAME_EDAD_PAGE);

AÑADIR DEFINICIONES

Abre el fichero includes/filenames.php. Justo antes del cierre de PHP, añade la definición de FILENAME_EDAD_PAGE insertando la siguiente línea de código:

define('FILENAME_EDAD_PAGE', 'edad.php'); //Restringir categoría por edad

LÓGICA DE COMPROBACIÓN

Abre el fichero includes/header.php. Al final se debe añadir el siguiente código:

<?php
/* BOF Restringir por edad */
for($cat = 0; $cat < sizeof($cPath_array);$cat++) {
   if( in_array($cPath_array[$cat], explode(",",CATEGORIA_POR_EDAD)) ){
      if(!isset($_REQUEST['edad'])){ //Opción 1
?>
          <script language="javascript">
            $(document).ready(function(){
               $('#edad-background').fadeIn();
               $('#edad-modal').fadeIn();
            });
          </script>
<?php
       }elseif (isset($_REQUEST['edad']) && $_REQUEST['edad']==BOTON_NO) {    //Opción 2
?>
           <script language="javascript">
             window.location.href = "index.php";
           </script>
<?php
       }
    }
}
/*  EOF Restringir por edad  */
?>

Se comprueba si la categoría a la que se accede está configurada desde el apartado de gestión de osCommerce como una categoría restringida.
Si es una categoría restringida, se evaluará si el cliente no ha indicado aún si es mayor de edad, en cuyo caso (Opción 1), se mostrará la ventana modal mediante las funciones fadeIn() propias de JQuery.
Si el cliente indicó que no era mayor de edad (opción 2) se redirige en este ejemplo a la página principal. Obviamente se podría redirigir a cualquier otra URL.
En cualquier otro caso, se mostrará la información de la categoría o el producto en cuestión.
Como se observa, no se añade la comprobación de si el cliente indicó que es mayor de edad. Tal opción, se evaluará en el siguiente fichero.

COMPROBAR LA MAYORÍA DE EDAD

Abre el fichero includes/template_top.php. En este fichero, antes de las líneas de código:

<!DOCTYPE html>
<html <?php echo HTML_PARAMS; ?>>

que están en torno a la línea 24. Tenemos el cierre de un bloque de PHP. Antes de ese cierre ?> añadimos el siguiente código en PHP.

/* BOF Restringir por edad */
require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_EDAD_PAGE);
if(isset($_REQUEST['edad']) &amp;&amp; $_REQUEST['edad']==BOTON_SI) { //Opción 3
   setcookie("edad", BOTON_SI, time()+3600);
}
/*  EOF Restringi por edad  */
?>

Lo primero que se indica es el fichero de idioma que debe usar.
Por otro lado, se evalúa si el cliente indicó con anterioridad que es mayor de edad. De ser así, se opta por la generación de una variable de tipo cookie.

CREAR EL FICHERO INCLUDES/EDAD.PHP

El fichero edad.php contendrá la ventana modal donde mediante un formulario se le preguntará al cliente si es mayor de edad. Para ello, se definen las capas necesarias mediante HTML y su aspecto mediante CSS.

Se puede observar que se tienen dos capas cuyos identificadores son edad-modal y edad-background. Dichos identificadores se emplean en header.php para mostrar las capas mediante fadeIn().
Dentro de la capa edad-modal se dispone de un formulario cuya información se carga mediante variables definidas en los ficheros de idiomas.

<div id="edad-modal" class="edad">
    <form  method="post" >
    	<h1><?php echo TITULO_EDAD; ?></h1>
        <p><?php echo TEXT_EDAD_INFO; ?></p>
        <p><strong><?php echo TEXT_EDAD_VERIFICAR; ?></strong></p>
        <p class="centro">
            <input type="submit" name="edad" value="<?php echo BOTON_SI; ?>"   />
            <input type="submit" name="edad" value="<?php echo BOTON_NO; ?>"  />
        </p>
   </form>
</div>
<div id="edad-background"></div>

<style type="text/css">
#edad-background {
    display: none;
    position: fixed;
    background: #900;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
	z-index:1;
    box-sizing: border-box;
	opacity:0.9;
	filter: alpha(opacity=90); /* For IE8 and earlier */
}

#edad-modal {
	display:none;
    position: fixed;
    top: 10%;
    left: 30%;
    box-sizing: border-box;
    z-index: 10;
}

#edad-modal.edad {
    width: 40%;
    max-height: 350px;
    min-width: 100px;
    overflow: auto;
    background: #fff;
    padding: 12px 14px;
    border: 1px solid;
    border-color: #aaa #999 #888;
    border-radius: 3px;
    -webkit-border-radius: 3px;
    border-radius: 3px;
    box-shadow: 0 3px 14px -4px #000;
    -ms-box-shadow: 0 3px 14px -4px #000;
    -moz-box-shadow: 0 3px 14px -4px #000;
    -webkit-box-shadow: 0 3px 14px -4px #000;
    box-shadow: 0 3px 14px -4px #000;
}
#edad-modal.edad h1{
	color:#900;
	margin:0;
	padding:0;
	text-align:center;

}
#edad-modal.edad p{
	color:#000;
	font-size:12px;
	text-align:justify;
}
#edad-modal.edad .centro{
	text-align:center;
}
#edad-modal.edad input{
	border:groove;
	border:1px solid #333;
	border-radius:0px;

}
</style>

CREAR EL FICHERO INCLUDES/LANGUAGES/SPANISH/EDAD.PHP

La información que se mostrará en el formulario definido en el fichero anterior, se declara para cada idioma en un fichero similar al siguiente:

<?php
define('TITULO_EDAD', 'Aviso - Contenidos para adultos');
define('TEXT_EDAD_INFO', 'Texto indicando que accedes a una seccion donde el contenido es para mayores de edad. Texto indicando que accedes a una seccion donde el contenido es para mayores de edad. Texto indicando que accedes a una seccion donde el contenido es para mayores de edad. ');
define('TEXT_EDAD_VERIFICAR','Eres mayor de edad?');
define('BOTON_SI', 'SI');
define('BOTON_NO', 'No');
?>

LA GESTIÓN

Para indicar qué categorías o subcategorías queremos restringir, se ha de acceder al apartado de gestión de oscommerce.
En el menú Configuration > My store se encuentra la opción Control de edad. Tras seleccionarla y pulsar Editar, se podrán indicar las categorías que nos interesan evaluar. Lo único que se debe hacer es introducir los identificadores de cada una de ellas, separadas por coma.

LA COMPROBACIÓN

Ya sólo queda comprobar que se han realizado todos los pasos correctamente.

Cuando el cliente pulse sobre una categoría, subcategoría o producto restringido, aparecerá la ventana modal que se muestra a continuación:

aviso-restriccion-edad

Verificar la edad como paso previo para acceder a una web

En ocasiones todo el sitio web muestra contenido para adultos y no sólo una categoría o subcategoría concreta de nuestra web, así que puede que lo que te interese como programador es comprobar la edad del usuario para mostrar no ya una categoría concreta sino para acceder al sitio web al completo. Si este es tu caso, tendrás que tener en cuenta algunas consideraciones además de lo ya descrito anteriormente:

Se debería hacer una copia de seguridad de los ficheros a modificar:

  • /includes/filenames.php
  • /includes/header.php
  • /includes/template_top.php

Se observa que respecto al caso anterior, no se necesitará añadir ningún registro en la tabla configuration de la base de datos y tampoco se modificarán los ficheros index o product_info.

Se crearán dos ficheros .php:

  • /includes/edad.php
  • /includes/languages/spanish/edad.php

Salvo en el caso del fichero includes/header.php, el código será exactamente igual que en el caso anterior. Por lo tanto, sólo me centraré en dicho archivo.

EDITAR EL FICHERO INCLUDES/HEADER.PHP

Al final del archivo, se añadirá el siguiente código

<?php
/* BOF Restringir por edad */
if(!isset($_REQUEST['edad'])){
   ?>
   <script language="javascript">
		$(document).ready(function(){
			$('#edad-background').fadeIn();
			$('#edad-modal').fadeIn();
		});
   </script>
   <?php
}elseif (isset($_REQUEST['edad']) && $_REQUEST['edad']==BOTON_NO) {
	?>
	   <script language="javascript">
		window.location.href = "index.php";
	   </script>
	<?php
}
require(DIR_WS_INCLUDES . FILENAME_EDAD_PAGE);
/*  EOF Restringir por edad  */
?>

Respecto al mostrado en el supuesto anterior, se destaca que no se comprueba si se está evaluando una categoría.
Además, con independencia de la página a la que se accede, se añade el fichero includes/edad.php
Se ha de indicar a qué dirección se desea realizar la redirección si el cliente no es mayor de edad; sustituye index.php por la dirección deseada.

Espero que este artículo haya servido de ayuda para poder personalizar vuestra tienda online. Para cualquier duda, podéis utilizar los comentarios.

Volver al blog

Deja un comentario