Jump to content

[SOLUCIONADO] Error 404 al cambiar de idioma en las 'Páginas'


Recommended Posts

Buenas acudo a vosotros con el siguiente problema.

Generalmente si hago un cambio de idioma funciona correctamente, pero hay excepciones.
Las páginas que creo no me cambian bien de idioma.

esta es la configuración que tengo en SEO Y URLs

image.thumb.png.f56db688b455a619c584f006420789c1.png

Pues todas las rutas que vengan de contenido/... al cambiar de idioma me dan un 404, os pongo un ejemplo de la configuración que tengo en una página que por lo general es similar en todas:

image.png.e8e4c993731240fc88c155349061ebd8.png

image.thumb.png.24bd13aebeecfd41c4e1f8b4f6b29f93.png

 

No se si hay algo en la configuración que está mal. he probado a desactivar y activar las url amigables para ver si regenerando el htaccess ya funcionaba pero no.

¿Alguna idea? Gracias de antemano

Edited by PepeFernandez
the topic is resolved (see edit history)
Link to comment
Share on other sites

Actualizo y aporto datos, veo que cuando quiero cambiar de idioma en una página en las que si me funciona. el html me carga los enlaces correctamente en el dropdown:
image.thumb.png.94014f8f19ca1a4641d4bc786c76cc9b.png

Sin embargo, cuando cargo una página de las que hay en diseño/páginas que hacen referencia a las tablas cms, lo que aparece en el dropdown es lo siguiente:
image.thumb.png.9bc4b52afb9257e8085531782b26233f.png
por lo que cuando cambio de idioma trata de ir a ese controlador y me devuelve un 404, no se porque solo pasa en las páginas de las tablas cms.
Os dejo enlace a la tienda:

https://ceramicconnection.com

Link to comment
Share on other sites

22 hours ago, PepeFernandez said:

acudo a vosotros con el siguiente problema.

Para recibir ayuda debes dar detalles: tienda, plantilla, version de Presta, de PHP, actualizaciones realizados, cosas así.

Con el HTML nadie te puede decir que está pasando con tu tienda.

Link to comment
Share on other sites

14 minutes ago, Nickz said:

Para recibir ayuda debes dar detalles: tienda, plantilla, version de Presta, de PHP, actualizaciones realizados, cosas así.

Con el HTML nadie te puede decir que está pasando con tu tienda.


Buenas, te facilito los datos que me comentas:
La plantilla es classic, la versión es la 1.7.8.7, versión de php : 7.4, la tienda la he puesto antes pero la vuelvo a poner: https://ceramicconnection.com
Un saludo.

Link to comment
Share on other sites

1 hour ago, PepeFernandez said:

la tienda la he puesto antes

La URL no debería estar en un foro de arreglar problemas.
Esta tienda es nueva, o la actualizaste de otra versión?

Link to comment
Share on other sites

On 4/12/2024 at 3:01 PM, Nickz said:

La URL no debería estar en un foro de arreglar problemas.
Esta tienda es nueva, o la actualizaste de otra versión?

Creo que es nueva, porque me han dicho que es importante no actualizarla

Link to comment
Share on other sites

17 minutes ago, JorgeGL said:

Entre otras cosas, asegúrate que la traducción de las URL de las páginas de CMS (el campo "URL amigable") no esté vacía o esté bien traducida.

Gracias por tu respuestas, pienso que sí, que todos los campos están correctos, aquí te dejo un ejemplo que he sacado de la tabla ps_cms_lang en la columna link_rewrite de la página sobre nosotros:
image.png.3fe47773762b0e72ba62031bfcf4806b.png

Link to comment
Share on other sites

El problema persiste, y ya no se que mirar de configuración, la verdad es que me parece rara la configuración de las url amigables ese "contenido" que sea una palabra fija y que no cambie a "content" al cambiar al inglés por ejemplo me llama la atención.

pero entiendo que no es eso exactamente ya que si entro a las url po separado por ejemplo si entro a /es/contenido/sobre-nosotros se carga bien la página, si entro a /en/contenido/about-us también carga bien la página, el problema es si estoy en una de las 2 y quiero camibar de idioma, entonces entra en un error 404, porque no ha cargado bien las url en el dropdown.

Link to comment
Share on other sites

Puede que el problema lo genera el módulo de selección de lenguaje. 

Antes de nada, tenga o no que evr con el módulo, revisa si tienes un override de la clase Link.php, que a veces da fallos de ese tipo.

Edited by JorgeGL (see edit history)
  • Like 1
Link to comment
Share on other sites

26 minutes ago, JorgeGL said:

Puede que el problema lo genera el módulo de selección de lenguaje. 

Antes de nada, tenga o no que evr con el módulo, revisa si tienes un override de la clase Link.php, que a veces da fallos de ese tipo.

Gracias por tu respuesta, no se si tengo algún override en la clase Link ahora investigaré, lo que he encontrado dentro de ella es este código:
 

    /**
     * Create a link to a CMS page.
     *
     * @param CMS|int $cms CMS object
     * @param string|null $alias
     * @param bool|null $ssl
     * @param int|null $idLang
     * @param int|null $idShop
     * @param bool $relativeProtocol
     *
     * @return string
     */
    public function getCMSLink(
        $cms,
        $alias = null,
        $ssl = null,
        $idLang = null,
        $idShop = null,
        $relativeProtocol = false
    ) {
        if (!$idLang) {
            $idLang = Context::getContext()->language->id;
        }

        $url = $this->getBaseLink($idShop, $ssl, $relativeProtocol) . $this->getLangLink($idLang, null, $idShop);

        $dispatcher = Dispatcher::getInstance();
        if (!is_object($cms)) {
            if ($alias !== null && !$dispatcher->hasKeyword('cms_rule', $idLang, 'meta_keywords', $idShop) && !$dispatcher->hasKeyword('cms_rule', $idLang, 'meta_title', $idShop)) {
                return $url . $dispatcher->createUrl('cms_rule', $idLang, ['id' => (int) $cms, 'rewrite' => (string) $alias], $this->allow, '', $idShop);
            }
            $cms = new CMS($cms, $idLang);
        }

        // Set available keywords
        $params = [];
        $params['id'] = $cms->id;
        $params['rewrite'] = (!$alias) ? (is_array($cms->link_rewrite) ? $cms->link_rewrite[(int) $idLang] : $cms->link_rewrite) : $alias;

        $params['meta_keywords'] = '';
        if (isset($cms->meta_keywords) && !empty($cms->meta_keywords)) {
            $params['meta_keywords'] = is_array($cms->meta_keywords) ? Tools::str2url($cms->meta_keywords[(int) $idLang]) : Tools::str2url($cms->meta_keywords);
        }

        $params['meta_title'] = '';
        if (isset($cms->meta_title) && !empty($cms->meta_title)) {
            $params['meta_title'] = is_array($cms->meta_title) ? Tools::str2url($cms->meta_title[(int) $idLang]) : Tools::str2url($cms->meta_title);
        }

        return $url . $dispatcher->createUrl('cms_rule', $idLang, $params, $this->allow, '', $idShop);
    }

que pienso que es el que genera los enlaces a las páginas del contenido, voy a ver si encuentro algo raro aquí

Link to comment
Share on other sites

he visto que sí parece haver un override en de link en el archivo original existe esta función:
 

public function getLanguageLink($idLang, Context $context = null)
    {
        if (!$context) {
            $context = Context::getContext();
        }

        $params = $_GET;
        unset($params['isolang'], $params['controller']);

        if (!$this->allow) {
            $params['id_lang'] = $idLang;
        } else {
            unset($params['id_lang']);
        }

        $controller = Dispatcher::getInstance()->getController();

        if (!empty($context->controller->php_self)) {
            $controller = $context->controller->php_self;
        }

        if ($controller == 'product' && isset($params['id_product'])) {
            return $this->getProductLink((int) $params['id_product'], null, null, null, (int) $idLang);
        } elseif ($controller == 'category' && isset($params['id_category'])) {
            return $this->getCategoryLink((int) $params['id_category'], null, (int) $idLang);
        } elseif ($controller == 'supplier' && isset($params['id_supplier'])) {
            return $this->getSupplierLink((int) $params['id_supplier'], null, (int) $idLang);
        } elseif ($controller == 'manufacturer' && isset($params['id_manufacturer'])) {
            return $this->getManufacturerLink((int) $params['id_manufacturer'], null, (int) $idLang);
        } elseif ($controller == 'cms' && isset($params['id_cms'])) {
            return $this->getCMSLink(new CMS((int) $params['id_cms']), null, null, (int) $idLang);
        } elseif ($controller == 'cms' && isset($params['id_cms_category'])) {
            return $this->getCMSCategoryLink(new CMSCategory((int) $params['id_cms_category']), null, (int) $idLang);
        } elseif (isset($params['fc']) && $params['fc'] == 'module') {
            $module = Validate::isModuleName(Tools::getValue('module')) ? Tools::getValue('module') : '';
            if (!empty($module)) {
                unset($params['fc'], $params['module']);

                return $this->getModuleLink($module, $controller, $params, null, (int) $idLang);
            }
        }

        return $this->getPageLink($controller, null, $idLang, $params);
    }

y en el override la función es de esta manera:
 

 public function getLanguageLink($id_lang, Context $context = null)
	{
		if (!$context) {
			$context = Context::getContext();
		}
		$params = $_GET;
		unset($params['isolang'], $params['controller']);
		if (!$this->allow) {
			$params['id_lang'] = $id_lang;
		} else {
			unset($params['id_lang']);
		}
		$controller = Dispatcher::getInstance()->getController();
		if (!empty(Context::getContext()->controller->php_self)) {
			$controller = Context::getContext()->controller->php_self;
		}
		$def_page = (int)$this->checkKeyExistance($controller);
		if ($controller == 'manufacturer') {
			$manuf_uri = explode('/', $_SERVER['REQUEST_URI']);
			$manuf_end = end($manuf_uri);
			$clearify_request = str_replace('-', ' ', $manuf_end);
			$manu_existance = (int)$this->getKeyExistanceManuf($clearify_request);
			if ($manu_existance > 0) {
				$params['id_manufacturer'] = $manu_existance;
			}
		}
		elseif ($controller == 'supplier') {
			$supp_uri = explode('/', $_SERVER['REQUEST_URI']);
			$supp_end = end($supp_uri);
			$clearify_request = str_replace('-', ' ', $supp_end);
			$supp_existance = (int)$this->getKeyExistanceSup($clearify_request);
			if ($supp_existance > 0) {
				$params['id_supplier'] = $supp_existance;
			}
		}
		elseif ($controller == 'category' && isset($params['category_rewrite']) && empty($params['category_rewrite'])) {
			$this->request_uri = $_SERVER['REQUEST_URI'];
			if (preg_match('/\?/', $this->request_uri)) {
				$uri_split_w_q = explode('/', $this->request_uri);
				$uri_split_w_q = array_filter($uri_split_w_q);
				$uri_split_w_q = end($uri_split_w_q);
				$uri_split_w_q = explode('?', $uri_split_w_q);
				$uri_split_w_q = $uri_split_w_q[0];
				$_id = (int)$this->getCategoryId($uri_split_w_q);
			} else {
				$uri_split = explode('/', $this->request_uri);
				$uri_split = array_filter($uri_split);
				$uri_split = end($uri_split);
				$_id = (int)$this->getCategoryId($uri_split);
			}
			if ($_id > 0) {
				$params['id_category'] = (int)$_id;
			}
		}
		elseif ($controller == 'category' && isset($params['category_rewrite']) && !empty($params['category_rewrite'])) {
			$allow_accented_chars = (int)Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL');
			if ($allow_accented_chars > 0) {
				$id_category = (int)Tools::getValue('id_category');
				if ($id_category > 0) {
					$params['id_category'] = $id_category;
				}
			}
		}
		elseif ($controller == 'product' && isset($params['product_rewrite']) && empty($params['product_rewrite'])) {
			$this->request_uri = $_SERVER['REQUEST_URI'];
			$uri_split = explode('/', $this->request_uri);
			$uri_split = array_filter($uri_split);
			$uri_split = end($uri_split);
			if (preg_match('/html/', $uri_split)) {
				$uri_split = str_replace('.html', '', $uri_split);
			}
			$_id = (int)$this->getProductExistance($uri_split);
			if ($_id > 0) {
				$params['id_product'] = (int)$_id;
			}
			elseif ($_id <= 0 && preg_match('/\?/', $this->request_uri)) {
				$_uri_with_q = explode('?', $this->request_uri);
				$_uri_with_q = explode('/', $_uri_with_q[0]);
				$_uri_with_q = end($_uri_with_q);
				$_id = (int)$this->getProductExistance($_uri_with_q);
				if ($_id > 0) {
					$params['id_product'] = (int)$_id;
				}
			}
		}
		elseif ($controller == 'product' && isset($params['product_rewrite']) && !empty($params['product_rewrite'])) {
			$allow_accented_chars = (int)Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL');
			if ($allow_accented_chars > 0) {
				$id_product = (int)Tools::getValue('id_product');
				if ($id_product > 0) {
					$params['id_product'] = $id_product;
				}
			}
		}
		elseif ($controller == 'cms' && isset($params['cms_rewrite']) && !empty($params['cms_rewrite'])) {
			$allow_accented_chars = (int)Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL');
			if ($allow_accented_chars > 0) {
				$id_cms = (int)Tools::getValue('id_cms');
				if ($id_cms > 0) {
					$params['id_cms'] = $id_cms;
				}
			}
		}
		elseif ($controller == 'product' && isset($params['category_rewrite']) && !empty($params['category_rewrite'])) {
			$_id = (int)$this->getProductExistance($params['category_rewrite']);
			if ($_id > 0) {
				$params['id_product'] = (int)$_id;
			}
		}
		elseif ($controller == 'cms' && isset($params['cms_rewrite']) && empty($params['cms_rewrite'])) {
			$this->request_uri = $_SERVER['REQUEST_URI'];
			$uri_split = explode('/', $this->request_uri);
			$uri_split = array_filter($uri_split);
			$uri_split = end($uri_split);
			$_id = (int)$this->getKeyExistanceCMS($uri_split);
			if ($_id > 0) {
				$params['id_cms'] = (int)$_id;
			}
			elseif ($_id <= 0 && preg_match('/\?/', $this->request_uri) && isset($params['SubmitCurrency'])) {
				$_uri_cms_clear = explode('?', $this->request_uri);
				$_uri_cms_clear = explode('/', $_uri_cms_clear[0]);
				$_uri_cms_clear = end($_uri_cms_clear);
				$_id = (int)$this->getKeyExistanceCMS($_uri_cms_clear);
				if ($_id > 0) {
					$params['id_cms'] = (int)$_id;
				}
			}
		}
		if ($controller == 'supplier' && isset($params['supplier_rewrite']) && !empty($params['supplier_rewrite'])) {
			$allow_accented_chars = (int)Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL');
			if ($allow_accented_chars > 0) {
				$id_supp = (int)Tools::getValue('id_supplier');
				if ($id_supp > 0) {
					$params['id_supplier'] = $id_supp;
				}
			}
		}
		if ($controller == 'manufacturer' && isset($params['manufacturer_rewrite']) && !empty($params['manufacturer_rewrite'])) {
			$allow_accented_chars = (int)Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL');
			if ($allow_accented_chars > 0) {
				$id_manufacturer = (int)Tools::getValue('id_manufacturer');
				if ($id_manufacturer > 0) {
					$params['id_manufacturer'] = $id_manufacturer;
				}
			}
		}
		if ($controller == 'list' && isset($params['module']) && $params['module'] == 'productlookbooks') {
			unset($params['category_rewrite']);
			unset($params['product_rewrite']);
		}
		elseif ($controller == 'display' && isset($params['module']) && $params['module'] == 'productlookbooks') {
			unset($params['category_rewrite']);
			unset($params['product_rewrite']);
		}
		if ($controller == 'product' && isset($params['id_product'])) {
			return $this->getProductLink((int)$params['id_product'], null, null, null, (int)$id_lang);
		}
		elseif ($controller == 'category' && isset($params['id_category'])) {
			return $this->getCategoryLink((int)$params['id_category'], null, (int)$id_lang);
		}
		elseif ($controller == 'supplier' && isset($params['id_supplier'])) {
			return $this->getSupplierLink((int)$params['id_supplier'], null, (int)$id_lang);
		}
		elseif ($controller == 'manufacturer' && isset($params['id_manufacturer'])) {
			return $this->getManufacturerLink((int)$params['id_manufacturer'], null, (int)$id_lang);
		}
		elseif ($controller == 'cms' && isset($params['id_cms'])) {
			return $this->getCMSLink((int)$params['id_cms'], null, false, (int)$id_lang);
		}
		elseif ($controller == 'cms' && isset($params['id_cms_category'])) {
			return $this->getCMSCategoryLink((int)$params['id_cms_category'], null, (int)$id_lang);
		}
		elseif ($def_page > 0 && !isset($params['id'])) {
			return $this->getPageLink($controller, null, $id_lang);
		}
		elseif (isset($params['fc']) && $params['fc'] == 'module')
		{
			$module = Validate::isModuleName(Tools::getValue('module')) ? Tools::getValue('module') : '';
			if (!empty($module)) {
				unset($params['fc'], $params['module']);
				return $this->getModuleLink($module, $controller, $params, null, (int)$id_lang);
			}
		}
		return $this->getPageLink($controller, null, $id_lang, $params);
	}

voy a ver si encuentro algo que ande mal por aquí porque pienso que pueden ir por aquí los tiros

Link to comment
Share on other sites

Sólo para aclararlo: me refería a si hay un archivo Link.php dentro de la carpeta override/class. Si ese archivo que me has pasado es el archivo original de la clase Link.php y no ha sido modificado, no debería ir mal ni debería hacerse (ni haberse hecho) ninguna modificación en él.

Link to comment
Share on other sites

1 hour ago, JorgeGL said:

Sólo para aclararlo: me refería a si hay un archivo Link.php dentro de la carpeta override/class. Si ese archivo que me has pasado es el archivo original de la clase Link.php y no ha sido modificado, no debería ir mal ni debería hacerse (ni haberse hecho) ninguna modificación en él.

El archivo del que hablo está en la carpeta que mencionas, hay un override/class/Link.php y ahí es donde veo que el código difiere del original

Link to comment
Share on other sites

Entonces vamos bien. Es probable que el override lo haya puesto algún módulo - relacionado con los CMS o con el SEO. Prueba a depurarlo a ver en qué línea falla, y si es ese override el que causa el error.

Link to comment
Share on other sites

Vale cosas que estoy viendo, he intentado seguir el rastro de la función getLanguageLink, he puesto un dump and die en la original y en la del override y para empezar no entra en la del override, que entonces me pregunto para que está si luego entra a la otra. y después dentro de la función está el siguiente código 
 

        } elseif ($controller == 'cms' && isset($params['id_cms'])) {
            return $this->getCMSLink(new CMS((int) $params['id_cms']), null, null, (int) $idLang);
        } elseif ($controller == 'cms' && isset($params['id_cms_category'])) {
            return $this->getCMSCategoryLink(new CMSCategory((int) $params['id_cms_category']), null, (int) $idLang);

pero nunca entra en esos if porque dentro de $params cuando el $controller == 'cms' solo me llega lo siguiente:
image.png.c1825804296b794c1f4653fd23b51d73.png

por lo que no me construye la url como toca.

¿esto nos da alguna pista de como solucionarlo?

Link to comment
Share on other sites

¿No entra en el override? Pues si que es raro.

Supongo que el dump te esta dando la respuesta cuando entras a la página de política de privacidad.

No me da muchas pistas, lo que me cuentas solo me indica que estás tratando de ver cómo y por qué falla esa función, asumiendo que es la que puede fallar. 

¿Puedes hacer un dump sin el die y ver en el front qué devuelve dentro de la caja de selección de idioma? Debería arrojar varios dumps, uno por cada idioma.

Otra cosa, puedes comparar tu función con la que viene pro defecto en una instalación limpia de tu versión de Prestashop? 

Link to comment
Share on other sites

36 minutes ago, JorgeGL said:

¿No entra en el override? Pues si que es raro.

Supongo que el dump te esta dando la respuesta cuando entras a la página de política de privacidad.

No me da muchas pistas, lo que me cuentas solo me indica que estás tratando de ver cómo y por qué falla esa función, asumiendo que es la que puede fallar. 

¿Puedes hacer un dump sin el die y ver en el front qué devuelve dentro de la caja de selección de idioma? Debería arrojar varios dumps, uno por cada idioma.

Otra cosa, puedes comparar tu función con la que viene pro defecto en una instalación limpia de tu versión de Prestashop? 

Bueno Jorge ya lo tengo, muchas gracias por la ayuda.
si que me entra en el override al final estaba mal puesto el dump. el problema está en esta parte del código:
override/classes/Link.php

		elseif ($controller == 'cms' && isset($params['cms_rewrite']) && !empty($params['cms_rewrite'])) {
			$allow_accented_chars = (int)Configuration::get('PS_ALLOW_ACCENTED_CHARS_URL');
			if ($allow_accented_chars > 0) {
				$id_cms = (int)Tools::getValue('id_cms');
				if ($id_cms > 0) {
					$params['id_cms'] = $id_cms;
				}
			}
		}

porque el parámetro 'cms_rewrite' no me llega nunca, así que lo que he hecho ha sido cambiarlo por el que me llega que es 'category_rewrite, después me he encontrado conque por alguna razón quiere que tenga los caracteres acentuados, yo los tengo desactivados porque no los necesito y porque el seo es mejor, por lo que el nuevo código sería el siguiente:
 

		elseif ($controller == 'cms' && isset($params['category_rewrite']) && !empty($params['category_rewrite'])) {
			$id_cms = (int)Tools::getValue('id_cms');
			if ($id_cms > 0) {
				$params['id_cms'] = $id_cms;
			}
		}

quiza, deba ajsutarlo más por si en algún caso si que llegue el parámetro 'cms_rewrite', algo en plan, si existe cms_rewrite entra, si no existe pero existe category_rewrite pues que entre también, lo iré viendo.

de momento con este cambio ya está solucionado mi problema, no se si hay alguna configuración o algún ajuste que tenga que ver con estos parámetros para poder mantener el código que tenía originalmente, pero bueno.

por lo pronto creo que puedo dar este tema por solucionado.
 

Link to comment
Share on other sites

  • PepeFernandez changed the title to [SOLUCIONADO] Error 404 al cambiar de idioma en las 'Páginas'

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...