Dynamiczne dodawanie pól formularza Widget

11

Próbuję dynamicznie dodać pole formularza do widżetu WordPress. Jeśli więc użytkownik chce dodać inną datę do wydarzenia, może kliknąć przycisk, aby uzyskać więcej pól.

Pytanie brzmi: jak zapisać nowo utworzone pola wejściowe do mojej bazy danych? Czy muszę napisać niestandardową funkcję aktualizacji? Jakieś wskazówki?

Tak wygląda widget: wprowadź opis zdjęcia tutaj

To jest mój kod php dla widgetu (jak dotąd):

    class Spillelister extends WP_Widget {

    public function Spillelister() {

        $widget_options = array (
            'classname' => 'spillelister-widget',
            'description' => 'Widget for å illustrere spillelister.');

        parent::WP_Widget('spillelister_widget', 'Spilleplan', $widget_options);
    }

    // The actual widget user interface
    public function widget($args, $instance) {

        extract( $args, EXTR_SKIP);
        $title = ( $instance['title'] ) ? $instance['title'] : 'Spilleplan';
        $body = ( $instance['body'] ) ? $instance['body'] : 'Ingen flere forestillinger';

        ?>

            <?php echo $before_widget; ?>
            <?php echo $before_title . $title . $after_title; ?>
            <p><?php echo $body; ?></p>

        <?php
    }

    public function update() {

    }

    public function form() {
    ?>
        <div class="date_stamp">
        <p>
            <label>Dato</label> <input type="text" class="datepicker">
            <br>
            <label>Tid</label> <input type="text">
            <span class="remove">Remove</span>
        </p>
        </div>
        <p>
            <span class="add">Add fields</span>
        </p>

    <?php 
    }


}

function spillelister_init() {
    register_widget('Spillelister');    
}
add_action('widgets_init', 'Spillelister_init');

Wszelkie wskazówki, wskazówki i odpowiedzi są mile widziane. :)

Ole Henrik Skogstrøm
źródło
1
Wiem, że się spóźniłem, ale wpadłem na ten wątek i znalazłem odpowiedź w innym: wordpress.stackexchange.com/questions/94617/ ... Sztuczka wydaje się polegać na przekazywaniu wartości z powrotem jako tablicy.
alexanderfilatov

Odpowiedzi:

5

Interesujące pytanie!
Nigdy nie widziałem powtarzalnych pól używanych w widżetach. Udzielenie pełnej odpowiedzi wymagałoby zbyt dużo pracy / czasu, dlatego dam ci linki do znanych mi zasobów i mam nadzieję, że wykonasz tę pracę i udostępnisz nam rozwiązanie;)

Wszystkie te przykłady dotyczą Meta Boxów, musisz skopiować skrypty jQuery i dostosować je post_metado skrzynki widżetów.

brasofilo
źródło
Dziękuję Ci! Sprawdzę to i dam odpowiedź, jeśli wymyślę, jak to rozwiązać. Jeśli ty lub ktokolwiek znajdzie więcej zasobów na ten temat, nie wahaj się go udostępnić :)
Ole Henrik Skogstrøm
1
Nigdy nie musiałem tego wypróbowywać, jednak jeśli komuś uda się zbudować coś takiego, opublikuj poniżej swoje rozwiązanie. :)
Ole Henrik Skogstrøm
2

To jest przykład dynamicznego widgetu, który renderuje dwa pola (image-id i url). jeśli wpiszesz identyfikator obrazu i naciśniesz „aktualizacja”, zostaną dodane dwa nowe pola. Zbudowałem go, aby stworzyć zręczny slilder z obrazami i połączonymi adresami URL.

<?php

class imp_image_slider extends WP_Widget
{
/**
 * imp_image_slider constructor.
 */
public function __construct()
{
    parent::__construct(false, $name = "Impulse Image Slider", array("description" => "Creates Slick Image Slider"));
}

/**
 * @see WP_Widget::widget
 *
 * @param array $args
 * @param array $instance
 */
public function widget($args, $instance)
{
// render widget in frontend
}


/**
 * @see WP_Widget::update
 *
 * @param array $newInstance
 * @param array $oldInstance
 *
 * @return array
 */
public function update($newInstance, $oldInstance)
{
    $instance = $oldInstance;
    $instance['images'] = array();
    $instance['urls'] = array();
    if (isset($newInstance['images'])) {
        foreach ($newInstance['images'] as $key => $value) {
            if (!empty(trim($value))) {
                $instance['images'][$key] = $value;
                $instance['urls'][$key] = $newInstance['urls'][$key];
            }
        }
    }

    return $instance;
}

/**
 * @see WP_Widget::form
 *
 * @param array $instance
 */
public function form($instance)
{
    $images = isset($instance['images']) ? $instance['images'] : array();
    $urls = isset($instance['urls']) ? $instance['urls'] : array();
    $images[] = '';
    $form = '';

    foreach ($images as $idx => $value) {
        $image = isset($images[$idx]) ? $images[$idx] : '';
        $url = isset($urls[$idx]) ? $urls[$idx] : '';
        $form .= '<p>'
            . '<label>Slides:</label>'
            . sprintf(
                '<input type="text" name="%1$s[%2$s]" value="%3$s" class="widefat" placeholder="Image ID">',
                $this->get_field_name('images'),
                $idx,
                esc_attr($image))
            . '</p>'
            . '<p>'
            . sprintf(
                '<input type="text" name="%1$s[%2$s]" value="%3$s" class="widefat" placeholder="Url">',
                $this->get_field_name('urls'),
                $idx,
                esc_attr($url))
            . '</p>';
    }

    echo $form;
}
}

add_action('widgets_init', create_function('', 'return register_widget("imp_image_slider");'));

?>
HKandulla
źródło
Cześć, czy możesz również dodać komentarze lub informacje, jak to pomaga OP oprócz kodu opublikowanego, ponieważ tylko odradzane są odpowiedzi
bravokeyl
1
Cześć, właśnie to zrobiłem. Mam nadzieję, że to pomoże.
HKandulla,
@HKandulla Dziękuję bardzo. Ty i twój kod jeszcze raz ratujesz mi życie. Dziękuję.
Owaiz Yusufi