Dynamisches Hinzufügen von Widget-Formularfeldern

11

Ich versuche, einem WordPress-Widget dynamisch ein Formularfeld hinzuzufügen. Wenn der Benutzer einem Ereignis ein weiteres Datum hinzufügen möchte, kann er auf eine Schaltfläche klicken, um weitere Felder abzurufen.

Die Frage ist: Wie speichere ich neu erstellte Eingabefelder in meiner Datenbank? Muss ich eine benutzerdefinierte Update-Funktion schreiben? Irgendwelche Tipps?

So sieht das Widget aus: Geben Sie hier die Bildbeschreibung ein

Dies ist mein PHP-Code für das Widget (bisher):

    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');

Alle Tipps, Hinweise oder Antworten sind willkommen. :) :)

Ole Henrik Skogstrøm
quelle
1
Ich weiß, dass ich zu spät komme, aber ich bin auf diesen Thread gestoßen und habe in einem anderen eine Antwort gefunden: wordpress.stackexchange.com/questions/94617/… Der Trick scheint darin zu bestehen, Werte als Array zurückzugeben.
Alexanderfilatov

Antworten:

5

Interessante Frage!
Ich habe noch nie wiederholbare Felder in Widgets gesehen. Eine vollständige Antwort zu geben würde zu viel Arbeit / Zeit erfordern, daher werde ich Ihnen Links zu den mir bekannten Ressourcen geben, und hoffentlich werden Sie diese Arbeit machen und die Lösung mit uns teilen;)

Alle diese Beispiele befassen sich mit Meta-Boxen. Sie müssen die jQuery-Skripte kopieren und post_metaan den Widgets-Fall anpassen .

brasofilo
quelle
Vielen Dank! Ich werde es überprüfen und eine Antwort geben, wenn ich herausfinde, wie ich das lösen kann. Wenn Sie oder jemand anderes weitere Ressourcen zu diesem Thema finden, zögern Sie bitte nicht, diese zu teilen :)
Ole Henrik Skogstrøm
1
Ich musste das nie ausprobieren, aber wenn es jemandem gelingt, so etwas zu bauen, poste bitte deine Lösung unten. :)
Ole Henrik Skogstrøm
2

Dies ist ein Beispiel für ein dynamisches Widget, das zwei Felder (Bild-ID und URL) rendert. Wenn Sie eine Bild-ID eingeben und auf "Aktualisieren" klicken, werden zwei neue Felder hinzugefügt. Ich baue es, um einen Slick Slilder mit Bildern und verknüpften URLs zu erstellen.

<?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
quelle
Hallo, können Sie auch Kommentare oder einige Informationen hinzufügen, wie es OP hilft, zusätzlich zu dem Code, der veröffentlicht wird, da nur Code-Antworten nicht
empfohlen
1
Hallo, ich habe es gerade getan. Ich hoffe es hilft.
HKandulla
@HKandulla Vielen Dank. Sie und Ihr Code sind noch einmal mein Lebensretter. Danke.
Owaiz Yusufi