Menu a tendina non mostra il valore selezionato in PHP

25 feb 2017, 22:43:31
Visualizzazioni: 14.8K
Voti: 2

Sto utilizzando la WordPress Settings API. Tutto funziona correttamente tranne questo menu a tendina select. Quando seleziono un'opzione, il valore visualizzato è corretto ma nel menu a tendina viene mostrato il valore predefinito iniziale, cioè 6, e non quello selezionato. Dove sbaglio?

 public function someplugin_select() {
            $options = get_option( 'plugin_252calc');
            echo $options; //mostra il valore selezionato corretto
            $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
Commenti

sta facendo echo di selected="selected"?

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

No. Non sta facendo echo di selected=selected anche se il valore è uguale alle opzioni

input input
25 feb 2017 23:18:31

fai un var_dump('$item == $options') per verificare se diventa true almeno una volta

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

restituisce false

input input
25 feb 2017 23:42:25
Tutte le risposte alla domanda 4
2

Il motivo per cui la tua condizione $item == $option fallisce sempre è dovuto al modo in cui PHP confronta i float (numeri decimali)!

Prova invece con questo codice:

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

Vedi Confronto tra float per maggiori informazioni.

25 feb 2017 23:47:17
Commenti

il confronto tra float è così incasinato in php

wogsland wogsland
28 feb 2017 04:21:03

per chi fosse interessato: il problema non è PHP in sé, ma la rappresentazione binaria dei float. vedi Comparing Floating Point Numbers, 2012 Edition per una buona discussione sul perché il metodo epsilon sopra citato non sia ideale in tutti i casi (ma certamente sufficiente per l'OP).

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

Ho esaminato questo e ho potuto notare che c'è una funzione di WordPress chiamata selected, che puoi vedere in questo link. Usa questa funzione invece di fare: if ( $item == $options ). E il tuo codice potrebbe apparire così:

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

Quindi quella funzione scorre $seconds e ottiene $second e $time, imposta $second come valore, poi chiama la funzione selected dove il primo parametro è il valore da confrontare e il secondo è il valore corrente: se quei valori sono uguali, verrà selezionato.

Penso che sia quello che stai cercando. Fammi sapere se ha funzionato.

25 feb 2017 23:26:39
1

Sostituisci il tuo select con questo... Spero funzioni...

        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
Commenti

Non sono sicuro del perché, ma non ha funzionato.

input input
25 feb 2017 23:47:17
1

Non ho risposte migliori, ma sento di avere un problema abbastanza simile da aggiungere a questa domanda invece di crearne una nuova.

Ho iniziato con https://www.youtube.com/watch?v=hbJiwm5YL5Q&t=3969s e sono arrivato fino a 1:05:00 e questa è la mia versione attuale:

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>
        <?}

tuttavia, invece di confrontare valori float, stavo pensando di confrontare valori stringa, ma finora senza successo.

Ho anche provato ad assegnare una variabile come ID della pagina e a utilizzare quella variabile come valore dell'opzione oltre che come secondo argomento nella funzione get_option(), ma ancora nulla.

7 ago 2022 21:31:06
Commenti

Questa risposta non risponde realmente alla domanda. Se hai una domanda diversa, puoi porla cliccando su Fai una domanda. Per ricevere una notifica quando questa domanda riceve nuove risposte, puoi seguire questa domanda. Una volta che avrai abbastanza reputazione, potrai anche aggiungere una ricompensa per attirare più attenzione su questa domanda. - Da Revisione

vancoder vancoder
10 ago 2022 00:27:19