<?phprequire_once ('aplicacion.php');require_once ('../framework/paginator.php');require_once ('../framework/automatizacion_productos.php');use Paginator\Paginator;// Bloqueamos el seguimiento de enlaces a los robots (dado que muchos enlaces no seran correctos al 100% y esta es una pagina dinamica)define('robots', 'noindex, nofollow');class Buscador extends Aplicacion {    public $modelsToSearch;    public $paginator = false;    public $linkVerTodos = true;    function execute() {        $this->min_len = 3; // Caracteres minimos para ejecutar la busqueda        if (isset($_REQUEST['buscador'])) {            $this->loadModelsSearch();            if (isset($_REQUEST['type']) and isset($this->modelsToSearch[$_REQUEST['type']])) {                $this->buscar($_REQUEST['buscador'], $_REQUEST['type'], true);                $this->linkVerTodos = false;            } else {                $this->buscar($_REQUEST['buscador']);            }        } /* elseif (isset($_REQUEST['marca'])) {          $this->filtra_marca($_REQUEST['marca']);          } */ else {            $this->show_default();        }        $this->showFromPlantilla('buscador.php');    }    function show_default() {            }    function loadModelsSearch() {        // TODO: Refactorizar a una interfaz        // Preparamos un array con las clases donde se buscara        // Estas clases deben tener el metodo "buscar" de la siguiente forma:        // static public function buscar($elem, $onlyCount = false, $limit = '')        // 		$elem = texto a buscar        //		$onlyCount devolvera el TOTAL DE REGISTROS encontrados        //		$limit aÃ¯Â¿Â½adira una sentencia "LIMIT" recibida del paginador (solo hay que concatenarla)        // la consulta debe retornar el campo 'id', 'id2' (opcional), 'titulo' (y 'descripcion' opcionalmente) que se usara para mostrar el titulo de cada cosa        // revisa un ejemplo ya hecho antes de hacerlo de cero (o copia y pega)        // SOBRE EL ARRAY:        // La KEY principal es la CLASE que se va a ejecutar        //		model: Ruta relativa al archivo model (si no se especifica se usara la KEY para buscar en "model"        //		mapper: Nombre del Mapper (ApartadosMapper...)        //		resulPorPag: Maximo de registros en cada pagina        // 		url: URL completa (incluido el =) en la cual solo hay que concatenar el "id"        //		url2 (opcional): URL que se concatena justo despuÃ¯Â¿Â½s del ID en el cual se incluye "id2" (campo que se debe devolver en Mapper::buscar())        //		texto: Texto a mostrar como titulo del bloque        // Una vez aplicado el bucle, se le aÃ¯Â¿Â½aden a cada principal los siguientes campos:        // 		resul: contiene la SQL para recorrer        // 		paginator: Contiene el paginador, del cual podemos sacar toda la informacion acerca de la cantidad de registros        // IMPORTANTE: Si en alguno de los casos NO HAY REGISTROS, este sera descartado del array automaticamente        // IMPORTANTE (productos): Notese que se ha montado al reves el GET de "nprod" y "categoria"        $this->modelsToSearch = array();        $this->modelsToSearch = array(            'noticias' => array(                'mapper' => 'NoticiasMapper',                'resulPorPag' => 10,                'url' => 'blog.php?item=',                'texto' => TXT_NOTICIAS            ),);        /*          'apartados' => array(          'mapper' => 'ApartadosMapper',          'resulPorPag' => 10,          'url' => 'apartado.php?id=',          'texto' => LBL_APARTADOS          ),         *          'noticias' => array(          'mapper' => 'NoticiasMapper',          'resulPorPag' => 10,          'url' => 'blog.php?item=',          'texto' => TXT_NOTICIAS          ),          'proyectos_categorias' => array(          'mapper' => 'ProyectosCategoriasMapper',          'resulPorPag' => 10,          'url' => 'proyectos.php?categoria=',          'texto' => LBL_CATEGORIAS_PROYECTOS          ),         *           'proyectos_productos' => array(          'mapper' => 'ProyectosProductosMapper',          'resulPorPag' => 10,          'url' => 'proyectos.php?item=',          'url2' => '&categoria=',          'texto' => LBL_PRODUCTOS_PROYECTOS          ),          'marcas' => array(          'mapper' => 'MarcasMapper',          'resulPorPag' => 20,          'url' => '../controladores/catalogo.php?marca=',          'texto' => TXT_MARCAS          )          );                 if (Conf::$ecommerce) {            $this->modelsToSearch = array_merge($this->modelsToSearch, array(                /*                  'categorias' => array(                  'mapper' => 'CategoriasMapper',                  'resulPorPag' => 10,                  'url' => 'catalogo.php?categoria=',                  'texto' => LBL_CATEGORIAS                  ),                                 'productos' => array(                    'mapper' => 'ProductosMapper',                    'resulPorPag' => 10,                    'url' => 'catalogo.php?seccion=catalogo&nprod=',                    'url2' => '&categoria=',                    'texto' => LBL_PRODUCTOS                )            ));        }        */    }    function buscar($elem, $type = '', $paginacion = false) {        Aplicacion::preparaSubtitulo(LBL_RESULTADOS_SOBRE . ' "' . $elem . '" ');        //$elem = Mapper::filtrar($elem);        $modelsToSearch = $this->modelsToSearch;        // Comprobacion extra por descuidos        if ($type != '' and ! isset($modelsToSearch[$type])) {            $type = '';        }        if (strlen($elem) >= $this->min_len) {            // Paginador principal            $this->paginator = null;            // Filtro por tipo especifico (sino esta especificado buscara en todas las secciones)            if ($type != '') {                // Nos quedamos solo con el que vamos a buscar                $modelsToSearch = array($type => $modelsToSearch[$type]);            }            // recorremos todos los model en los que hay que buscar            foreach ($modelsToSearch as $type => $data) {                $resul = $this->buscarEnMapper($elem, $type, $data, $paginacion);                if (!$resul) {                    unset($modelsToSearch[$type]);                } else {                    // Obtendremos el array original modificado                    $modelsToSearch[$type] = $resul;                }            }            $this->modelsToSearch = $modelsToSearch;        } else {            $this->minium_len = true;        }    }    /**     * Funcion auxiliar que busca utilizando el mapper cargado y prepara la paginacion para el elemento     * @param type $elem     * @param type $type     * @param type $data     * @param type $paginacion     * @return boolean     */    private function buscarEnMapper($elem, $type, $data, $paginacion = false) {        // Incluimos el archivo mapper        if (!isset($data['model']))            require_once ('../model/' . $type . '.php');        else            require_once ($data['model']);        $mapper = $data['mapper'];        if (!method_exists($mapper, 'buscar'))            return false;        // Comenzamos la busqueda        $records = $mapper::buscar($elem, true);        // Hay registros        if ($records > 0) {            // Creamos el paginador con la info            if ($paginacion) {                $paginator = new Paginator();                $paginator->records = $data['resulPorPag']; // Registros por pagina                $paginator->total_records = $mapper::buscar($elem, true); // Total de registros                $paginator->paginate();                // Es el paginador con mas resultados?                if ($this->paginator == null or $this->paginator->total_records < $paginator->total_records)                    $this->paginator = $paginator;                // Guardamos la paginacion                $data['paginator'] = $paginator;                $data['first'] = $paginator->first_record + 1;                $limit = $paginator->first_record . ',' . $paginator->records;            } else {                $limit = ' 0,' . $data['resulPorPag'];                $data['first'] = 1;            }            $resul = $mapper::buscar($elem, false, $limit);            if ($resul) {                // Cargamos los registros                $data['resul'] = $resul;                // Devolvemos los datos actualizados                return $data;            }        }        return false;    }    /* function filtra_marca($marca) {      include_once ('../model/marcas.php');      $datos_marca = MarcasMapper::getById($marca);      if (isset($datos_marca->id) and $datos_marca->id == $marca) {      switch ($_SESSION['idioma']) {      case 'es':      $this->marca = $datos_marca->i1_nombre;      break;      default:      $this->marca = $datos_marca->i2_nombre;      }      } else {      $this->marca = "???";      }      include_once ('../model/productos.php');      $this->result_productos = ProductosMapper::getByMarcaPVPVisible($marca);      if ($this->result_productos->count_all() > 0) {      $this->hay_prods = true;      }      } */}$ctrl = new Buscador();$ctrl->execute();?>