Menú desplegable select no muestra el valor seleccionado en PHP

25 feb 2017, 22:43:31
Vistas: 14.8K
Votos: 2

Estoy usando la WordPress Settings API. Todo funciona correctamente excepto este menú desplegable select. Cuando selecciono una opción, el valor que se muestra es correcto pero en el dropdown aparece el valor por defecto primero (es decir 6) y no el seleccionado. ¿Dónde está el error?

 public function someplugin_select() {
            $options = get_option( 'plugin_252calc');
            echo $options; //muestra el valor seleccionado correcto
            $items = array();
            for ($i=6; $i <=10; $i+= 0.1) 
            { 
                $items[] = $i;
            }

            echo '<select id="cf-nb" name="cf-nb">';
            foreach ( $items as $item )
            {
                echo '<option value="'. $item .'"';
                if ( $item == $options ) echo' selected="selected"';
                echo '>'. $item .'</option>';
            }

            echo '</select>';           

        }
4
Comentarios

¿Se está mostrando selected="selected"?

David Lee David Lee
25 feb 2017 23:17:23

No. No está mostrando selected=selected incluso si el valor es igual a las opciones

input input
25 feb 2017 23:18:31

haz un var_dump('$item == $options') para verificar si al menos una vez es verdadero

David Lee David Lee
25 feb 2017 23:20:01

está devolviendo falso

input input
25 feb 2017 23:42:25
Todas las respuestas a la pregunta 4
2

La razón por la que tu condición $item == $option siempre falla es por la forma en que PHP compara valores flotantes.

Prueba lo siguiente en su lugar:

echo "<option value='$item'" . selected(abs($item - $options) <= 0.01, true, false) . ">$item</option>";

Consulta Comparación de floats para más información.

25 feb 2017 23:47:17
Comentarios

la comparación de floats es tan jodida en php

wogsland wogsland
28 feb 2017 04:21:03

para quien le interese: el problema no es PHP, per se, es la representación binaria de los floats. Mira Comparando Números de Punto Flotante, Edición 2012 para una buena discusión de por qué el método epsilon mencionado arriba no es ideal en todos los casos (pero ciertamente suficiente para el OP).

Paul 'Sparrow Hawk' Biron Paul 'Sparrow Hawk' Biron
28 feb 2017 14:36:25
0

Revisé esto y pude notar que hay una función de WP llamada selected, que puedes ver en este enlace. Usa esta función en lugar de hacer: if ( $item == $options ). Y tu código podría verse así:

foreach ( $seconds as $second => $time ) {
   ?>
      <option value="<?php echo $second; ?>" <?php selected( $browser_cache_ttl, $second ); ?>><?php echo $time; ?></option>
   <?php
}

Entonces, esa función recorre $seconds y obtiene $second y $time, coloca $second como valor, luego llama a la función selected donde el primer parámetro es el valor a comparar y el segundo es el valor actual. Si esos valores son iguales, se seleccionará.

Creo que eso es lo que buscas. Avísame si funcionó.

25 feb 2017 23:26:39
1

Reemplaza tu select con esto... Espero que funcione...

        echo '<select id="cf-nb" name="cf-nb">';
        foreach ( $items as $item ){
            $if_selected = $item == $options ? "selected='selected'" : "";
            echo "<option value='{$item}' {$if_selected}>$item</option>";

        }

        echo '</select>'; 
25 feb 2017 23:35:35
Comentarios

No estoy seguro por qué, pero no funcionó.

input input
25 feb 2017 23:47:17
1

No tengo mejores respuestas, pero siento que tengo un problema lo suficientemente similar como para agregarlo a esta pregunta en lugar de crear una nueva.

Comencé con https://www.youtube.com/watch?v=hbJiwm5YL5Q&t=3969s y llegué hasta el minuto 1:05:00, y esta es mi versión actual:

function selectpageHTML() {?>
            <select name="lp_actPage"> 
                <?
                    $pages = get_pages();                       foreach ( $pages as $page ) {                               
                                $title = $page->post_title;
                                echo "<option value='$title'" . selected(get_option('lp_actPage', $title)) .">$title</option>";
                                } ?>
            </select>
        <?}

Sin embargo, en lugar de comparar números flotantes, estaba pensando en comparar valores de cadena, pero hasta ahora no he tenido éxito.

También intenté asignar una variable como ID de página y usar esa variable como valor de la opción, así como el segundo argumento en la función get_option(), pero aún sin resultados.

7 ago 2022 21:31:06
Comentarios

Esto realmente no responde a la pregunta. Si tienes una pregunta diferente, puedes hacerla haciendo clic en Preguntar. Para recibir notificaciones cuando esta pregunta tenga nuevas respuestas, puedes seguir esta pregunta. Una vez que tengas suficiente reputación, también puedes añadir una recompensa para llamar más la atención sobre esta pregunta. - De la revisión

vancoder vancoder
10 ago 2022 00:27:19