Ajout dynamique de champs de formulaire Widget

11

J'essaie d'ajouter dynamiquement un champ de formulaire à un widget WordPress. Donc, si l'utilisateur souhaite ajouter une autre date à un événement, il peut cliquer sur un bouton pour obtenir plus de champs.

La question est: comment enregistrer les champs de saisie nouvellement créés dans ma base de données? Dois-je écrire une fonction de mise à jour personnalisée? Des conseils?

Voici à quoi ressemble le widget: entrez la description de l'image ici

Voici mon code php pour le widget (jusqu'à présent):

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

Tous les conseils, astuces ou réponses sont appréciés. :)

Ole Henrik Skogstrøm
la source
1
Je sais que je suis en retard, mais je suis tombé sur ce fil et j'ai trouvé une réponse dans un autre: wordpress.stackexchange.com/questions/94617/… L'astuce semble être de transmettre les valeurs sous forme de tableau.
alexanderfilatov

Réponses:

5

Question interessante!
Je n'ai jamais vu de champs répétables utilisés dans les widgets. Donner une réponse complète nécessiterait trop de travail / temps, donc je vais vous donner des liens vers les ressources que je connais, et j'espère que vous ferez ce travail et partagerez la solution avec nous;)

Tous ces exemples concernent les Meta Box, vous devrez copier les scripts jQuery et les adapter post_metaau cas Widgets.

brasofilo
la source
Je vous remercie! Je vais vérifier et donner une réponse si je trouve comment résoudre ce problème. Si vous ou quelqu'un d'autre trouvez plus de ressources à ce sujet, n'hésitez pas à les partager :)
Ole Henrik Skogstrøm
1
Je n'ai jamais pu l'essayer, mais si quelqu'un parvient à construire quelque chose comme ça, veuillez poster votre solution ci-dessous. :)
Ole Henrik Skogstrøm
2

Ceci est un exemple de widget dynamique qui rend deux champs (image-id et url). si vous entrez une image-id et appuyez sur "mettre à jour", deux nouveaux champs sont ajoutés. Je le construis pour créer un slick slilder avec des images et des URL liées.

<?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
la source
Salut, pouvez-vous également ajouter des commentaires ou des informations sur la façon dont cela aide OP en plus du code publié en tant que réponses uniquement déconseillées
bravokeyl
1
Salut, je viens de le faire. J'espère que cela aide.
HKandulla
@HKandulla Merci beaucoup. Vous et votre code m'économisez encore une fois Merci.
Owaiz Yusufi