Skip to content
This repository has been archived by the owner on May 3, 2023. It is now read-only.

wooC 3.4.4 multiselect "Tipos de envíos soportados " no muestra items seleccionados (?) #100

Closed
PatrickCaneloDigital opened this issue Jul 31, 2018 · 15 comments

Comments

@PatrickCaneloDigital
Copy link
Contributor

PatrickCaneloDigital commented Jul 31, 2018

Desde ayer estoy viendo que el multiselect no muestra los valores por defecto ni los items seleccionados.

Acabo de hacer una instalacion limpia de wordpress 4.9.7 , con solo woocommerce 3.4.4, transbank y chilexpress shipping 1.3.13

A primera instancia el multiselect aparecia como simple dropdown, y al grabar me aparecia el campo en blanco, y se pueden re-añadir los tipos de envio de chilexpress, pero al grabar reaparece blanco.
Parece que los valores se graban en la BBDD ,pero como muestro mas abajo parece que no se graban bien tampoco.

podría jurar que hace poco se veía bien y tengo la leve sensación que el culpable es una actualización de woocommerce, ya que indagé el codigo y el multiselect queda conectado con una llamada a javascript.

Ademas me llama la atención, que aunque se seleccione solo dos items, el array en las opciones en la BBDD muestra esto:
s:15:"shipments_types";a:2:{i:0;i:3;i:1;i:4;}s:15:"locations_cache"

He intentado modificar el array manualmente pero eso parece que no ayuda...
Es decir es claramente un problema de woocommerce y no del plugin. queria solo indicarlo y para ver si alguien me puede confirmar el problema...

@PatrickCaneloDigital
Copy link
Contributor Author

PatrickCaneloDigital commented Jul 31, 2018

EDIT: Acabo de revertir woocommerce a la version 3.4.2 y efectivamente el multiselect aparece bien

(aunque las opciones en la BBDD se ven un poco cripticas en el sentido que de cierta forma parece estar grabado todo el array... allí no entiendo bien el mapping de la opcion a la página
s:15:"shipments_types";a:3:{i:0;i:3;i:1;i:4;i:2;i:5;}s:15:"locations_cache"

He abierto un Issue en WooCOmmerce por eso
woocommerce/woocommerce#20950

@TCattd
Copy link
Collaborator

TCattd commented Aug 1, 2018

Se agradece la proeficiencia, estimado.

Ojalá no hayan cambiado la API en WC no más. Ya pasó una vez con ese tipo de setting.

@PatrickCaneloDigital
Copy link
Contributor Author

hmmmm, parece que hay malas noticias...

De WooCommerce me dicen, que el multiselect de atributos de producto funciona bien.
(Admin > Productos ->Atributos)
Generar nuevo atributo y varios terminos

Despues ir a la pagina de producto > atributos y añadirle el nuevo atributo generado
Los terminos apareceran tipo multiselect

He podido verificar que efectivamente el multiselect de atributos de producto funciona, pero el del plugin no.
Asi que la mala noticia es que debe tener que ver como el plugin ocupa el multiselect...
no se si el selectWoo() del js o la iniciacion de los campos de opciones

@TCattd TCattd reopened this Aug 1, 2018
@PatrickCaneloDigital
Copy link
Contributor Author

estoy rastreando un poco el tema...
Si bien en otras partes de woocommerce parece funcionar bien,
estuve revisando codigo fuente de woocommerce al respecto... me parece que hay un secreto alli de como woocmmerce trata el seteo de valores en multiselect (de hecho me tinca que no tiene forma de setear un default desde el php... el metodo generate_multiselect_html() no considera $data['default'])... lo que probablemente falta en el codigo y en la documentacion es como setear valores predefinidos en el multiselect... a parte del selectWoo() o select2()

https://docs.woocommerce.com/wc-apidocs/source-class-WC_Settings_API.html#700-752

puede estar allí el meollo...

@PatrickCaneloDigital
Copy link
Contributor Author

PatrickCaneloDigital commented Aug 1, 2018

Para seguir probando tomé el codigo de la definición de la API oficial de woocommerce y lo mezcle con el multiselect...
Para eso añadí al final del whq-woocommerce-shipping.php el código que adjunto aqui abajo. Eso producte una nueva Shipping_Method con su respective entrada como sección en envíos.

En este caso el multiselect se comporta bien... tambien le adjunté el mismo código de init_form_fields del plugin... y aún asi todo se comporta bien...
Por ende hay que ir comparando este código que funciona con el de la clase del plugin... puede que sea algo tan simple como la iniciación de los campos

PD: Esto no omite el caso, que en la selección inicial, efectivamente los default no se muestran bien... solo cuando los campos son sacados de la BBDD se muestran...

whq-woocommerce-chilexpress-shipping.php.zip

@TCattd
Copy link
Collaborator

TCattd commented Aug 1, 2018

Tuvimos un problema similar antes:
#86

Fix aplicado:
54eae35

¿Tendrá que ver con eso, de nuevo?
Ignoro por qué lo cambiaron esa vez, pero nos pegó. Y ahora pega donde mismo. Es extraño.

@PatrickCaneloDigital
Copy link
Contributor Author

puede ser... de hecho justo iba a revisar de eliminar el metodo
validate_multiselect_field
porque en el php que funciona le doy ints como llaves en el array pero no sobreescribo el metodo validate_multiselect_field

@PatrickCaneloDigital
Copy link
Contributor Author

PatrickCaneloDigital commented Aug 1, 2018

ya... pues mientras le tengo una solución...
parece que es una mezcla de factores.
Lo que hice para solucionarlo es:

  1. eliminar el metodo validate_multiselect_field() de la clase WC_Chilexpress_Shipping
  2. eliminar la llamada selectWoo() en el archivo whq_wccp_admin.js
  3. añadir un nuevo metodo en WC_Chilexpress_Shipping (en el cual se incluye el script que llama a selectWoo()

public function admin_options() { ?> <h2><?php _e('Chilexpress Shipping','woocommerce'); ?></h2> <script>jQuery(document).ready(function( $ ) { if( $('#woocommerce_chilexpress_shipments_types').length ) { $('#woocommerce_chilexpress_shipments_types').selectWoo(); } });</script> <table class="form-table"> <?php $this->generate_settings_html(); ?> </table> <?php }

lo otro es que desde woocommerce me han indicado esto, puede que sea una alternativa forma de incluir el script:
My guess is there's a JS error on the page and since the plugin is not using wc_enqueue_js to output the code it will cause errors.

Try wrapping $('#woocommerce_chilexpress_shipments_types').selectWoo(); inside the wc_enqueue_js function and see if that makes a difference.

@TCattd
Copy link
Collaborator

TCattd commented Aug 1, 2018

No sabía que WC tiene un método wc_enqueue_js. De hecho, uso wp_enqueue_script que es nativo de WP, pero... WC tiene uno propio. No entiendo.

Bueno saberlo, estimado. Bueno saberlo.

El uso de https://docs.woocommerce.com/document/settings-api/#section-2 no está mal.
De todas maneras no es el problema.

El problema es el método validate_multiselect_field(). Solo sacándolo, los valores gaurdados en la DB vuelven a ser los correctos.
Quiere decir que lo que yo parché cuando tuvimos el issue acá #86 fue una regresión... y debí haberla reportado :D

@TCattd
Copy link
Collaborator

TCattd commented Aug 1, 2018

e197db4

@TCattd
Copy link
Collaborator

TCattd commented Aug 1, 2018

Muy agradecido por la ayuda con el debug, estimado. Muy agradecido.

http://prntscr.com/kdgt0o

V1.3.14 disponible en wp.org ya.

@TCattd TCattd closed this as completed Aug 1, 2018
@PatrickCaneloDigital
Copy link
Contributor Author

De nada estimado...
Si es que ese problema aparecio recien desde la actualización del woocommerce 3.4.2 a 3.4.3 por lo visto.

La inclusión del wc_enqueue_js simplemente ayuda a inyectar js solo en caso que el contexto sea woocommerce, en eso veo la ventaja. uno se ahorra la prueba dentro del js si el contexto es woocommerce.

Sobreescribir el metodo: admin_options() solo lo hice, para re-asegurarme en las pruebas que la llamada a selectWoo() sea incluida al 100% dentro de ese contexto.
No es necesaria pero ayuda un poco a mantener la funcionalidad junta en un archivo (y no tenerla en el archivo whq_wccp_admin.js.
Con eso hasta la prueba de
if( $('#woocommerce_chilexpress_shipments_types').length ) {
se haría innecesaria ya que estariamos seguros que el script solo aparece cuando se muestran esos ajustes. Pero eso ya va mas en tema arquitectura y no funcionalidad.

PD: el otro PR ahora si puedo enviarlo de camino. Queria asegurarme que este problema no fuera un efecto colateral.

@PatrickCaneloDigital
Copy link
Contributor Author

PD: Acabo de ver el edit en whq_wccp_admin.js para la version 1.3.14
y en realidad se hubiera podido eliminar odo este bloque, ya que con el cambio no contiene ninguna funcionalidad...

//Shippment type select height if( $('#woocommerce_chilexpress_shipments_types').length ) { //$('#woocommerce_chilexpress_shipments_types').selectWoo(); //See admin_options() method }

@TCattd
Copy link
Collaborator

TCattd commented Aug 1, 2018

La verdad es que aún con el selectWoo() como estaba antes, seguía funcionando bien todo.
El admin_options() no era necesario aún; pero es interesante. No conocía ese método :) Quizás sirva para algo más a futuro.

Por ahora lo dejé así, a ver que ocurre; si no hay más reportes de errores. Si todo sigue bien, probablemente devuelva el selectWoo() a donde estaba antes nada más.

Gracias nuevamente ;)

@PatrickCaneloDigital
Copy link
Contributor Author

de nada! ;)
Yo he probado con el selectWoo() donde estaba (con WooCommerce 3.4.4) y eliminando las lineas de script en admin_options() y dejó de funcionar, pero quizas tengo yo algo enredado ya a esta altura jajaja

El metodo admin_options() es bien interesante, ya que permitiría personalizar el diseño de las opciones y ponerle literalmente más color y un layout individualizado (sobreescribiendo otros metodos como generate_settings_html(), generate_multiselect_html(), etc.)
Es con eso que plugins como W3CTotalCache logran generar una apariencia mas personalizada o estructurada...

Saludos ;-)

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants