Dropdown select nu afișează valoarea selectată în PHP

25 feb. 2017, 22:43:31
Vizualizări: 14.8K
Voturi: 2

Folosesc WordPress Settings API. Totul funcționează cum trebuie, cu excepția acestui dropdown select. Când selectez o opțiune, valoarea afișată prin echo este corectă, dar în dropdown se afișează valoarea implicită (prima valoare) adică 6 și nu cea selectată. Unde greșesc?

public function someplugin_select() {
    $options = get_option('plugin_252calc');
    echo $options; // afișează valoarea corectă selectată
    $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
Comentarii

este selected="selected" afișat?

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

Nu. Nu afișează selected=selected chiar dacă valoarea este egală cu opțiunile

input input
25 feb. 2017 23:18:31

fă un var_dump('$item == $options') pentru a verifica dacă este adevărat măcar o dată

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

returnează false

input input
25 feb. 2017 23:42:25
Toate răspunsurile la întrebare 4
2

Motivul pentru care condiția ta $item == $option eșuează întotdeauna este din cauza modului în care PHP compară numerele cu virgulă mobilă!

Încearcă următoarea variantă:

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

Consultă Compararea numerelor cu virgulă mobilă pentru mai multe informații.

25 feb. 2017 23:47:17
Comentarii

compararea numerelor cu virgulă mobilă este atât de stricată în PHP

wogsland wogsland
28 feb. 2017 04:21:03

pentru cei interesați: problema nu este PHP în sine, ci reprezentarea binară a numerelor cu virgulă mobilă. consultați Comparing Floating Point Numbers, 2012 Edition pentru o discuție bună despre de ce metoda epsilon menționată mai sus nu este ideală în toate cazurile (dar cu siguranță suficient de bună pentru OP).

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

Am parcurs asta și am observat că există o funcție WP numită selected, pe care o poți vedea în acest link. Folosește această funcție în loc să faci: if ( $item == $options ). Și codul tău ar putea arăta astfel:

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

Deci acea funcție parcurge $seconds și obține $second și $time, pune $second ca valoare, apoi apelează funcția selected unde primul parametru este valoarea de comparat, iar al doilea este valoarea curentă. Dacă aceste valori sunt egale, opțiunea va fi selectată.

Cred că asta cauți. Spune-mi dacă a funcționat.

25 feb. 2017 23:26:39
1

Înlocuiește select-ul tău cu asta... Sper să funcționeze...

        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
Comentarii

Nu știu de ce, dar nu a funcționat.

input input
25 feb. 2017 23:47:17
1

Nu am răspunsuri mai bune, dar simt că am o problemă suficient de similară pentru a o adăuga la această întrebare în loc să creez una nouă.

Am început cu https://www.youtube.com/watch?v=hbJiwm5YL5Q&t=3969s și am ajuns până la minutul 1:05:00, iar versiunea mea curentă este

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

totuși, în loc să compar numere cu virgulă, mă gândeam să compar valori de tip șir de caractere, dar până acum fără succes.

Am încercat de asemenea să atribui o variabilă ca ID al paginii și să folosesc acea variabilă atât ca valoare a opțiunii cât și ca al doilea argument în funcția get_option(), dar tot fără rezultat.

7 aug. 2022 21:31:06
Comentarii

Acest lucru nu răspunde cu adevărat la întrebare. Dacă aveți o altă întrebare, o puteți adresa făcând clic pe Puneți o Întrebare. Pentru a fi notificat atunci când această întrebare primește răspunsuri noi, puteți urmări această întrebare. Odată ce aveți suficientă reputație, puteți de asemenea adăuga un bonus pentru a atrage mai multă atenție asupra acestei întrebări. - De la Recenzie

vancoder vancoder
10 aug. 2022 00:27:19