Jump to content

Formulario de pedido rápido, ordenar provincias por id state prestashop 1.5 (SOLUCIONADO)


chongolino

Recommended Posts

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.

post-319080-0-08837200-1416056737_thumb.jpg

Edited by chongolino (see edit history)
Link to comment
Share on other sites

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 by nutrify_es (see edit history)
Link to comment
Share on other sites

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 by rafaelamargo (see edit history)
Link to comment
Share on other sites

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

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

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 by nadie (see edit history)
Link to comment
Share on other sites

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

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 by nadie (see edit history)
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...