Ajout dynamique de champs de formulaire de widget

11

J'essaie d'ajouter un champ de formulaire à un widget WordPress de manière dynamique. Ainsi, 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 la suivante: 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:

Ceciestmoncodephppourlewidget(jusqu'àprésent):

classSpillelisterextendsWP_Widget{publicfunctionSpillelister(){$widget_options=array('classname'=>'spillelister-widget','description'=>'Widgetforåillustrerespillelister.');parent::WP_Widget('spillelister_widget','Spilleplan',$widget_options);}//Theactualwidgetuserinterfacepublicfunctionwidget($args,$instance){extract($args,EXTR_SKIP);$title=($instance['title'])?$instance['title']:'Spilleplan';$body=($instance['body'])?$instance['body']:'Ingenflereforestillinger';?><?phpecho$before_widget;?><?phpecho$before_title.$title.$after_title;?><p><?phpecho$body;?></p><?php}publicfunctionupdate(){}publicfunctionform(){?><divclass="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 les bienvenus. :)

    
posée Ole Henrik Skogstrøm 02.03.2013 - 21:03

2 réponses

5

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

Tous ces exemples concernent les méta-boîtes, vous devez copier les scripts jQuery et adapter le post_meta à la casse des widgets.

réponse donnée brasofilo 03.03.2013 - 12:30
2

Voici un exemple de widget dynamique qui affiche 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 slilder lisse 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");'));

?>
    
réponse donnée HKandulla 09.08.2016 - 14:10

Lire d'autres questions sur les étiquettes