Выпадающий список select не отображает выбранное значение в PHP

25 февр. 2017 г., 22:43:31
Просмотры: 14.8K
Голосов: 2

Я использую WordPress Settings API. Всё работает как надо, кроме этого select dropdown. Когда я выбираю опцию, значение выводится правильно, но в выпадающем списке отображается первое значение по умолчанию (т.е. 6), а не выбранное. В чём моя ошибка?

public function someplugin_select() {
    $options = get_option('plugin_252calc');
    echo $options; //показывает корректное выбранное значение
    $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
Комментарии

выводится ли selected="selected"?

David Lee David Lee
25 февр. 2017 г. 23:17:23

Нет. selected=selected не выводится, даже если значение равно options

input input
25 февр. 2017 г. 23:18:31

попробуйте сделать var_dump('$item == $options'), чтобы проверить, возвращает ли оно true хотя бы один раз

David Lee David Lee
25 февр. 2017 г. 23:20:01

возвращает false

input input
25 февр. 2017 г. 23:42:25
Все ответы на вопрос 4
2

Причина, по которой ваше условие $item == $option всегда возвращает false, кроется в особенностях сравнения чисел с плавающей запятой в PHP!

Попробуйте следующий вариант:

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

Подробнее читайте в статье Сравнение чисел с плавающей запятой.

25 февр. 2017 г. 23:47:17
Комментарии

сравнение чисел с плавающей точкой в php просто ужасно

wogsland wogsland
28 февр. 2017 г. 04:21:03

для тех, кому интересно: проблема не в PHP как таковом, а в бинарном представлении чисел с плавающей точкой. почитайте Comparing Floating Point Numbers, 2012 Edition для хорошего объяснения, почему метод с эпсилон, упомянутый выше, не идеален во всех случаях (хотя для автора вопроса его точно хватит).

Paul 'Sparrow Hawk' Biron Paul 'Sparrow Hawk' Biron
28 февр. 2017 г. 14:36:25
0

Я разобрался с этим и могу сказать, что в WordPress есть функция selected, которую вы можете увидеть по этой ссылке. Используйте эту функцию вместо конструкции if ( $item == $options ). Ваш код может выглядеть так:

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

Эта функция проходит через массив $seconds, получает $second и $time, устанавливает $second в качестве значения, затем вызывает функцию selected, где первый параметр — это значение для сравнения, а второй — текущее значение. Если эти значения совпадают, элемент будет выбран.

Думаю, это то, что вам нужно. Сообщите, если это сработало.

25 февр. 2017 г. 23:26:39
1

Замените ваш select на этот... Надеюсь, он сработает...

        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 февр. 2017 г. 23:35:35
Комментарии

Не уверен, почему, но это не сработало.

input input
25 февр. 2017 г. 23:47:17
1

У меня нет лучших ответов, но я чувствую, что у меня достаточно похожая проблема, чтобы добавить её к этому вопросу вместо создания нового.

Я начал с https://www.youtube.com/watch?v=hbJiwm5YL5Q&t=3969s и дошел до 1:05:00, и моя текущая версия выглядит так:

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

Однако вместо сравнения чисел с плавающей точкой я подумал, что мог бы сравнивать строковые значения, но пока безрезультатно.

Я также пробовал присваивать переменной ID страницы и использовать эту переменную как значение option, а также как второй аргумент в функции get_option(), но всё равно без успеха.

7 авг. 2022 г. 21:31:06
Комментарии

Это не совсем отвечает на вопрос. Если у вас другой вопрос, вы можете задать его, нажав Задать вопрос. Чтобы получать уведомления о новых ответах на этот вопрос, вы можете отслеживать этот вопрос. Как только у вас будет достаточно репутации, вы также сможете установить награду, чтобы привлечь больше внимания к этому вопросу. - Из обзора

vancoder vancoder
10 авг. 2022 г. 00:27:19