WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Перегрузка страницы с get-параметром

ёБратцы, помогите мне пожалуйста решить вот такую задачку, ну ооочень надо.

Мне нужно чтобы в админке на странице добавления записи произвольного типа отображались разные метабоксы в зависимости от значения установленной радиокнопки. Если радиокнопка установленна в значение "земельный участок, то показывались бы опции земельного участка, если установлено "Квартира" значит появлялась бы возможность добавлять опции, специфичные для квартиры, адрес дома, этаж и т.п.
Я придумал следующее: В начале метабокса выводится группа радиокнопок, у каждой из которых прописан атрибут 'onchange' перегружающий страницу и передающий переменной $_GET['object_type'] значение value радиокнопки, а после этого в зависимости от значения $_GET['object_type'] выводим те или иные поля.

То есть примерно так:

// Это разумеется не дословная цитата, просто логика такова:
// Вид объекта из переменной $_GET или false
$object_type = (isset($_GET['object_type'])) ? $_GET['object_type'] : false;
// Если Вид объекта не установлен, выводим радиокнопки
if (!$object_type)
// HTML-код радиокнопок такой:
 <label for="object_type1">Земельный участок</label>
 <label for="object_type2">Дом</label>
 <label for="object_type3">Квартира</label>
 <label for="object_type4">Комната</label>
} // End if

// Если это земельный участок
if ($object_type && $object_type == 'lot') {
// Опции для земельного участка
} elseif ($object_type && $object_type == 'house') {
// опции для дома
} elseif ($object_type && $object_type == 'flat') {
// опции для квартиры
} elseif ($object_type && $object_type == 'room') {
// Опции для комнаты
} else {
// Здесь не выводим ничего
} // End if

Как правильно прописать значение атрибута onchange, чтобы URL
wp-admin/post-new.php?post_type=realty
переписывался в
wp-admin/post-new.php?post_type=realty&object_type=lot
при установке радиокнопки с value="lot"?

0
horror
7.1 год назад
  • 1

    http://jsfiddle.net/fiddleyetu/5hhCQ/

    horror 7.1 год назад

    Это не плохой вариант, но к сожалению не в моем случае. Дело в том, что я использую довольно развесистую библиотеку CMB2, которая генерирует сложный HTML.
    Для того, чтобы изменить дефолтные классы HTML-блоков мне прийдется редактировать их код, а этого мне делать не хотелось бы. Дело не в сложности, просто эта библиотека будет использоваться в нескольких проектах, хотелось бы однообразного подхода к разработке.
    Нечто подобное тому, что мне надо я видел в плагине User role editor, когда ты во всплывающем селект-меню выбираеш пользовательскую роль и внизу отображаются возможности, доступные только для этой роли. Вот для этого страница перегружается и к URL страницы добавляется get-параметр, соответствующий роли.

    Molotow 7.1 год назад

    Я больше чем уверен что ваша библиотека добавляет уникальный класс-обертку для своих метабоксов, вот и выбирайте по нему. Добавляете этому класс свойство display:none; Дальше скрипт сам отобразит первый метабокс. Все.

    horror 7 лет назад

    Я признаться грешен, часто люблю поболтать о том, что на самом деле никакой не программист, а вовсе даже юрист. Но видимо я всеже не прав.
    В глубине души во мне где-то дремлет настырный программист, ибо человек я чертовски ленивый.
    Вы мне предлагаете для каждого метабокса прописать класс, который display="none", а в контексте этой библиотеки метабокс- это одно поле формы, ну или группа полей, составляющих массив. Для каждого вида объекта таких полей будет примерно полторы дюжины.
    Кроме этого, независимо от того, будут ли эти метабоксы отображены на странице, они будут таки грузиться в браузер, что на пока не посчитанное количество килобайт увеличивает вес страницы.

    Molotow 7 лет назад

    Именно так. Ваша задача решается тремя строчками JS и страница будет грузиться на пол секунды дольше.

    horror 7 лет назад

    С помощью CMB2 и многострадальной богоматери задачка решилась вот таким образом:

    // Вид объекта из переменной $_GET
    $object_type = (isset($_GET['object_type'])) ? $_GET['object_type'] : false;
    
    // Если вид объекта не установлен показываем радиокнопку
    if (!$object_type) {
    $cmb_realty->add_field( array(
    'name' => 'Вид объекта',
    'desc' => 'Выберите вид объекта',
    'id' => 'object_type',
    'type'             => 'radio',
    'attributes' => array(
    'onchange' => 'window.location=\'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] . '&object_type=\'+this.value',
    ),
    'options'          => array(
    'lot' => 'Земельный участок',
    'house' => 'Дом',
    'flat' => 'Квартира',
    'room' => 'Комната'
    ),
    ) );
    } else {
    if ($object_type == 'lot') {
    // земельный участок
    } elseif ($object_type == 'house') {
    // жилой дом
    } elseif($object_type == 'flat') {
    // Квартира
    } elseif ($object_type == 'room') {
    // Комната
    } else {
    // Здесь ничего не показываем
    }
    } // End if/else

    На выходе получается такой HTML:

    Земельный участок
    Дом
    Квартира
    Комната

    При выборе радиокнопки, страница перегружается и параметру object_type присваивается значение value выбранной радиокнопки, что и требовалось изначально.
    Спасибо за дискуссию. Старики правы, в споре реально рождается истина.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация