Antakarana Posted April 27, 2013 Share Posted April 27, 2013 Hola a todos, Me gustaría saber si existe la posibilidad de que en caso de desactivar un producto, si alguien accede a la URL del producto se le redireccione automáticamente a la home... He buscado en el foro información al respecto pero solo he encontrado temas relacionados con redireccionamiento 301 y no estoy seguro de si esto es lo correcto o de como hacerlo. Gracias Link to comment Share on other sites More sharing options...
Enrique Gómez Posted April 27, 2013 Share Posted April 27, 2013 (edited) Puedes modificar (haciendo copia de seguridad por si las moscas) el archivo .htaccess que se encuentra en el directorio raíz de prestashop. Añadiendo al principio RewriteRule ^url_producto_desactivado$ /index.php [L] Lo malo es que hay que ir uno por uno..se podría automatizar que al desactivar un producto se añadiese la regla automáticamente, pero para salir del paso... Edited April 27, 2013 by egomezpe (see edit history) 1 Link to comment Share on other sites More sharing options...
Antakarana Posted April 27, 2013 Author Share Posted April 27, 2013 Puedes modificar (haciendo copia de seguridad por si las moscas) el archivo .htaccess que se encuentra en el directorio raíz de prestashop. Añadiendo al principio RewriteRule ^url_producto_desactivado$ /index.php [L] Lo malo es que hay que ir uno por uno..se podría automatizar que al desactivar un producto se añadiese la regla automáticamente, pero para salir del paso... Gracias por la respuesta... Y de qué modo se podría automatizar? por ahora no hay demasiados productos a los que hubiera que hacer eso pero en caso de haberlos sería interesante incorporar algún tipo de proceso automatizado para que con solo "desactivar" el producto redireccionara a la home o a la categoría o a lo que interesara... Link to comment Share on other sites More sharing options...
Enrique Gómez Posted April 28, 2013 Share Posted April 28, 2013 Una opción sencilla es que en el archivo ProductController.php (controllers/front/ProductController.php) para la versión 1.5.4.0 línea 128: Comentes lo que hace por defecto (página 404, producto no disponible) y hagas una redirección al home (que es lo que hace el código que le sigue) /*header('HTTP/1.1 404 Not Found'); header('Status: 404 Not Found'); $this->errors[] = Tools::displayError('This product is no longer available.');*/ $id_lang = Context::getContext()->language->id; $shop = Context::getContext()->shop; $url = 'http://'.$shop->domain.$shop->getBaseURI().Language::getIsoById($id_lang).'/'; header('HTTP/1.1 301 Moved Permanently'); header('Location: '.$url); Ten en cuenta que futuras actualizaciones de Prestashop machacarán estos cambios. Link to comment Share on other sites More sharing options...
nadie Posted April 28, 2013 Share Posted April 28, 2013 Ten en cuenta que futuras actualizaciones de Prestashop machacarán estos cambios. Buenas días, ¿Se podria hacer un override para solventar ese problema? ¿no? Link to comment Share on other sites More sharing options...
Enrique Gómez Posted April 28, 2013 Share Posted April 28, 2013 (edited) Se puede sobrescribir el método init() en override/controllers/front/ProductController.php pero no quedaría tampoco muy limpio porque si copiamos todo el código (con la modificación) y lo metemos en esta clase hija, necesitamos que llame al código de la clase "abuela"..., en fin un rollo de herencia. Si que se puede copiar una buena parte del código y mirar de hacer algo. Pero bien mirado también esta la opción de en el init de esta clase hija poner: <?php class ProductController extends ProductControllerCore { public function init(){ parent::init(); //Habría que mirar también que en los errores estuviese el error de este producto no disponible... if(in_array('Status: 404 Not Found', headers_list() )){ header_remove('Status'); $id_lang = Context::getContext()->language->id; $shop = Context::getContext()->shop; $url = 'http://'.$shop->domain.$shop->getBaseURI().Language::getIsoById($id_lang).'/'; header('HTTP/1.1 301 Moved Permanently'); header('Location: '.$url); } } } A mi en local también me va bien, lo que hace es mirar si hay un 404, aunque se debería mirar en concreto que exista el error de producto no disponible (pero el error sera diferente en cada idioma ya que no se guarda ningún código...) En este caso la herencia funciona bien porque dejamos al código de prestashop hacer su trabajo y luego hacemos lo nuestro. Edited April 28, 2013 by egomezpe (see edit history) Link to comment Share on other sites More sharing options...
Sergio Ruiz Posted April 28, 2013 Share Posted April 28, 2013 Me cuelo por aqui para molestar como de costumbre. ¿Y como se haría el override completo depende editar el fichero directamente, para que funcionara en este caso? Link to comment Share on other sites More sharing options...
Enrique Gómez Posted April 28, 2013 Share Posted April 28, 2013 (edited) Me parece que esto debería funcionar class ProductController extends ProductControllerCore { public function init(){ //llamamos al init() del Abuelo $reflectionMethod = new ReflectionMethod(get_parent_class(get_parent_class($this)), 'init'); $reflectionMethod->invoke($this); //Código modificado de ProductControllerCore if ($id_product = (int)Tools::getValue('id_product')) $this->product = new Product($id_product, true, $this->context->language->id, $this->context->shop->id); if (!Validate::isLoadedObject($this->product)) { header('HTTP/1.1 404 Not Found'); header('Status: 404 Not Found'); $this->errors[] = Tools::displayError('Product not found'); } else { $this->canonicalRedirection(); //**************** ETC ETC***************************************************************************** } Edited April 28, 2013 by egomezpe (see edit history) Link to comment Share on other sites More sharing options...
Sergio Ruiz Posted April 28, 2013 Share Posted April 28, 2013 Me parece que esto debería funcionar class ProductController extends ProductControllerCore { public function init(){ //llamamos al init() del Abuelo $reflectionMethod = new ReflectionMethod(get_parent_class(get_parent_class($this)), 'init'); $reflectionMethod->invoke($this); //Código modificado de ProductControllerCore if ($id_product = (int)Tools::getValue('id_product')) $this->product = new Product($id_product, true, $this->context->language->id, $this->context->shop->id); if (!Validate::isLoadedObject($this->product)) { header('HTTP/1.1 404 Not Found'); header('Status: 404 Not Found'); $this->errors[] = Tools::displayError('Product not found'); } else { $this->canonicalRedirection(); //**************** ETC ETC***************************************************************************** } Gracias, voy a probarlo. --- Gracias. 1 Link to comment Share on other sites More sharing options...
Antakarana Posted April 28, 2013 Author Share Posted April 28, 2013 Gracias, voy a probarlo. --- Gracias. Hola Rubalcaba, Ha funcionado? estoy interesado en implantarlo yo también... Gracias Link to comment Share on other sites More sharing options...
Recommended Posts