chongolino Posted November 15, 2014 Share Posted November 15, 2014 (edited) Hola recurro de nueva a este foro para pedir ayuda sobre el siguiente tema, gracias por adelantado a las personas que me puedan ayudar. En el formulario de pedido rápido he insertado al país España unas provincias que corresponden con una ciudad y los pueblos de los alrededores donde hacemos los repartos de nuestra tienda y cada pueblo tiene asignada una zona para así poder darle un importe de envió. El tema es que quiero que en este formulario cuando el cliente pinche sobre el desplegable de provincias estas salgan ordenadas por el id state y no alfabéticamente, porque la mayoría de pedidos son a la ciudad principal y esta me sale casi en ultimo lugar al ser valencia. Espero que alguien pueda ayudarme. Si quieren ver directamente el formulario en mi tienda la url es: http://www.enviofloresvalencia.com/ Adjunto una imagen donde aparece la lista desplegable del formulario. Edited November 17, 2014 by chongolino (see edit history) Link to comment Share on other sites More sharing options...
nutrify_es Posted November 15, 2014 Share Posted November 15, 2014 (edited) Tienes que modificar el archivo classes\Country.php entorno a la línea 136: $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'state` ORDER BY `name` ASC'); por: $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'state` ORDER BY `id_state` ASC'); Edited November 15, 2014 by nutrify_es (see edit history) Link to comment Share on other sites More sharing options...
rafaelamargo Posted November 15, 2014 Share Posted November 15, 2014 (edited) Recuerda para tener una mejor organzación que no es recomendable modificar la clase directamente (aunque funcione); sino hacer un override de la clase. Si desconoces como hacerlo, te comento los pasos, con la modificación a realizar incluida. Por cierto aunque ya te lo ha comentado nutrify, en el foro ingles tenias esto: http://www.prestashop.com/forums/topic/73116-states-dropdown-names-ordering-in-alphabetical/?do=findComment&comment=456082 que la linea donde comenta nitrify lo de cambiar el name por el id. Pero ya te digo que es recomendable hacer un override de la clase. (No es una tonteria) Edited November 15, 2014 by rafaelamargo (see edit history) Link to comment Share on other sites More sharing options...
rafaelamargo Posted November 15, 2014 Share Posted November 15, 2014 Recuerda para tener una mejor organzación que no es recomendable modificar la clase directamente (aunque funcione); sino hacer un override de la clase. Si desconoces como hacerlo, te comento los pasos, con la modificación a realizar incluida. Por cierto aunque ya te lo ha comentado nutrify, en el foro ingles tenias esto: http://www.prestashop.com/forums/topic/73116-states-dropdown-names-ordering-in-alphabetical/?do=findComment&comment=456082 que la linea donde comenta nitrify lo de cambiar el name por el id. Pero ya te digo que es recomendable hacer un override de la clase. (No es una tonteria) Aquí: http://www.juancastells.com/prestashop-como-modificar-clases-y-controladores/ tienes un tutorial (es de los primeros resultados que me salia en google) para crear un override. Aquí: http://www.jose-aguilar.com/blog/override-en-prestashop/ otro tutorial No he mirado si estan actualizados, pero bueno es para que veas a lo que me refiero. Link to comment Share on other sites More sharing options...
chongolino Posted November 16, 2014 Author Share Posted November 16, 2014 (edited) gracias por responder voy a revisar los contenidos de los tutoriales, y haber que pasa. Edited November 16, 2014 by chongolino (see edit history) Link to comment Share on other sites More sharing options...
chongolino Posted November 16, 2014 Author Share Posted November 16, 2014 Aquí: http://www.juancastells.com/prestashop-como-modificar-clases-y-controladores/ tienes un tutorial (es de los primeros resultados que me salia en google) para crear un override. Aquí: http://www.jose-aguilar.com/blog/override-en-prestashop/ otro tutorial No he mirado si estan actualizados, pero bueno es para que veas a lo que me refiero. Hola gracias por contestar he estado haciendo pruebas para hacer un override de la clase, pero está claro que mis conocimientos son muy limitados, entiendo un poco el concepto pero a la hora de hacer las modificaciones no me sale nada, porque el código de los tutoriales está escrito para ejemplos puntuales que no son mi caso. Si alguien pudiera ser un poco más específico con el código a modificar o crear lo agradecería, se que estoy pidiendo mucho, pero no entiendo como hacerlo. Link to comment Share on other sites More sharing options...
ventura Posted November 16, 2014 Share Posted November 16, 2014 Para una edicion tan reducida como la de este caso no merece la pena que realices un override del php, edita directamente el archivo indicado classes\Country.php 1 Link to comment Share on other sites More sharing options...
nadie Posted November 16, 2014 Share Posted November 16, 2014 Opino como Rafael que crear un override aunque sea para una pequeña modificación es una buena practica y yo también la recomiendo. Link to comment Share on other sites More sharing options...
nadie Posted November 17, 2014 Share Posted November 17, 2014 (edited) Antes estaba en el autobús y no he podido terminar mi respuesta en el tema. Creo que es una prueba realizada con Prestashop 1.5.6.2. (Ahora mismo estoy en el movil y puedo escribir pero no como yo quisiera) Aunque como bien te dijo nutrify_es en la primera respuesta del tema, puedes editar directamente el fichero: /classes/Country.php y realizar los cambios que te ha propone nutrify_es sin tener que crear obligatoriamente un override. ---------------------------------------------- Pero bueno ya que estamos en el tema, no veo negativo comentarte lo de crear el override. Si te da por crear el override en tu tienda con la 1.5: Te explico. Con tu bloc de notas, o por ejemplo con http://notepad-plus-plus.org/ o con el editor que estes mas familiarizado. Te creas un fichero con el siguiente nombre: Country.php Con este contenido: <?php class Country extends CountryCore { public static function getCountries($id_lang, $active = false, $contain_states = false, $list_states = true) { $countries = array(); $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT cl.*,c.*, cl.`name` country, z.`name` zone FROM `'._DB_PREFIX_.'country` c '.Shop::addSqlAssociation('country', 'c').' LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country` AND cl.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'zone` z ON (z.`id_zone` = c.`id_zone`) WHERE 1'.($active ? ' AND c.active = 1' : '').($contain_states ? ' AND c.`contains_states` = '.(int)$contain_states : '').' ORDER BY cl.name ASC'); foreach ($result as $row) $countries[$row['id_country']] = $row; if ($list_states) { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'state` ORDER BY `id_state` ASC'); foreach ($result as $row) if (isset($countries[$row['id_country']]) && $row['active'] == 1) /* Does not keep the state if its country has been disabled and not selected */ $countries[$row['id_country']]['states'][] = $row; } return $countries; } } Y guardarlo en el directorio: /override/classes/ Recuerda guárdalo en el directorio: /override/classes/ no en el directorio: /classes/ que es donde esta la clase Original. Después borra el fichero: /cache/class_index.php para que prestashop te detecte el nuevo override, y bueno pues despues solo queda comprobar si funciona, o si no funciona... Te adjunto de todos modos en el mismo mensaje, el fichero (override) de la 1.5.6.2 a guardar en: /override/classes/ Recuerda que cuando hablo de override, hablo de guardarlo en: /override/classes/ no de guardarlo en: /classes/ PD: Estoy en el movil y por eso no puede escribirte mucho.Country.php Edited November 17, 2014 by nadie (see edit history) Link to comment Share on other sites More sharing options...
chongolino Posted November 17, 2014 Author Share Posted November 17, 2014 Antes estaba en el autobús y no he podido terminar mi respuesta en el tema. Creo que es una prueba realizada con Prestashop 1.5.6.2. (Ahora mismo estoy en el movil y puedo escribir pero no como yo quisiera) Aunque como bien te dijo nutrify_es en la primera respuesta del tema, puedes editar directamente el fichero: /classes/Country.php y realizar los cambios que te ha propone nutrify_es sin tener que crear obligatoriamente un override. ---------------------------------------------- Pero bueno ya que estamos en el tema, no veo negativo comentarte lo de crear el override. Si te da por crear el override en tu tienda con la 1.5: Te explico. Con tu bloc de notas, o por ejemplo con http://notepad-plus-plus.org/ o con el editor que estes mas familiarizado. Te creas un fichero con el siguiente nombre: Country.php Con este contenido: <?php class Country extends CountryCore { public static function getCountries($id_lang, $active = false, $contain_states = false, $list_states = true) { $countries = array(); $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT cl.*,c.*, cl.`name` country, z.`name` zone FROM `'._DB_PREFIX_.'country` c '.Shop::addSqlAssociation('country', 'c').' LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country` AND cl.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'zone` z ON (z.`id_zone` = c.`id_zone`) WHERE 1'.($active ? ' AND c.active = 1' : '').($contain_states ? ' AND c.`contains_states` = '.(int)$contain_states : '').' ORDER BY cl.name ASC'); foreach ($result as $row) $countries[$row['id_country']] = $row; if ($list_states) { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'state` ORDER BY `id_state` ASC'); foreach ($result as $row) if (isset($countries[$row['id_country']]) && $row['active'] == 1) /* Does not keep the state if its country has been disabled and not selected */ $countries[$row['id_country']]['states'][] = $row; } return $countries; } } Y guardarlo en el directorio: /override/classes/ Recuerda guárdalo en el directorio: /override/classes/ no en el directorio: /classes/ que es donde esta la clase Original. Después borra el fichero: /cache/class_index.php para que prestashop te detecte el nuevo override, y bueno pues despues solo queda comprobar si funciona, o si no funciona... Te adjunto de todos modos en el mismo mensaje, el fichero (override) de la 1.5.6.2 a guardar en: /override/classes/ Recuerda que cuando hablo de override, hablo de guardarlo en: /override/classes/ no de guardarlo en: /classes/ PD: Estoy en el movil y por eso no puede escribirte mucho. Gracias a todos por el interés prestado en este tema, Nadie te comento que he descargado tu archivo lo he colocado en el sitio indicado y he borrado el archivo que mencionas y buala funciona de lujo. Aunque no he entendido bien lo de crear el archivo override, pero me quedo más tranquilo sabiendo que la mejor solución es esta para que mi prestashop 1.5 no tenga problemas en el futuro. Gracias a todos los que han colaborado en esta pregunta. Nota: se cómo renombrar el titulo para poner solucionado pero no encuentro donde cerrar el tema para que no se quede abierto, podrían decirme como cerrar el tema. Link to comment Share on other sites More sharing options...
nadie Posted November 17, 2014 Share Posted November 17, 2014 (edited) Me alegro de que hayas podido en principio resolver el problema, he visto que has añadido la palabra "Solucionado" al título del tema, así que no te preocupes por cerrar el tema, los temas luego los van cerrando los moderadores en los temas que tienen la palabra "Solucionado" en el título, como es este caso, que procedo a cerrarlo. Saludos, Edited November 17, 2014 by nadie (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts