PepeFernandez Posted April 11 Share Posted April 11 (edited) 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 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: 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 April 19 by PepeFernandez the topic is resolved (see edit history) Link to comment Share on other sites More sharing options...
PepeFernandez Posted April 12 Author Share Posted April 12 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: 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: 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 More sharing options...
Nickz Posted April 12 Share Posted April 12 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 More sharing options...
PepeFernandez Posted April 12 Author Share Posted April 12 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 More sharing options...
Nickz Posted April 12 Share Posted April 12 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 More sharing options...
PepeFernandez Posted April 15 Author Share Posted April 15 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 More sharing options...
JorgeGL Posted April 15 Share Posted April 15 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. 1 Link to comment Share on other sites More sharing options...
PepeFernandez Posted April 15 Author Share Posted April 15 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: Link to comment Share on other sites More sharing options...
PepeFernandez Posted April 17 Author Share Posted April 17 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 More sharing options...
JorgeGL Posted April 17 Share Posted April 17 (edited) 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 April 17 by JorgeGL (see edit history) 1 Link to comment Share on other sites More sharing options...
PepeFernandez Posted April 17 Author Share Posted April 17 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 More sharing options...
PepeFernandez Posted April 18 Author Share Posted April 18 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 More sharing options...
JorgeGL Posted April 18 Share Posted April 18 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 More sharing options...
PepeFernandez Posted April 18 Author Share Posted April 18 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 More sharing options...
JorgeGL Posted April 18 Share Posted April 18 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 More sharing options...
PepeFernandez Posted April 19 Author Share Posted April 19 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: 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 More sharing options...
JorgeGL Posted April 19 Share Posted April 19 ¿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 More sharing options...
PepeFernandez Posted April 19 Author Share Posted April 19 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 More sharing options...
JorgeGL Posted April 19 Share Posted April 19 Me alegro mucho! Un saludo y que vaya bien. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now