Menu a tendina select in un widget WordPress

20 feb 2011, 22:04:57
Visualizzazioni: 19.8K
Voti: 2

Ok, sto sviluppando il mio widget personalizzato e ho un ENORME problema.

Non so come recuperare e successivamente salvare i valori degli elementi select HTML.

Esempio semplice:

/* inizializza TITOLO */
function widget( $args, $instance ) {
        extract( $args );
        $title = apply_filters('widget_title', $instance['title'] );

(...)

/* codice di aggiornamento per il TITOLO */
    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance['title'] = strip_tags( $new_instance['title'] );

(...)

/* creazione del campo TITOLO nell'area amministrativa dei widget */

 <p>
    <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Titolo:', 'hybrid'); ?></label>
    <input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" type="text" style="width:100%;" />
 </p>

(...)

OK. Quando scrivo

<?php echo $instance['title'] ?>

Mostrerà il mio titolo!

Ma ho questa lista:

<label for="<?php echo $this->get_field_id( 'example' ); ?> "><?php _e('Tipo di mappa:', 'example'); ?></label>
<select id="<?php echo $this->get_field_id( 'example' ); ?>" name="<?php echo $this->get_field_name( 'example' ); ?>">
     <option value="supervalue" selected="selected">Super Valore</option>
</select>

E

<?php echo $instance['example'] ?>

Non restituisce NULLA. Ho cercato ovunque, incluso default-widgets.php, ma non capisco nulla poiché tutti i plugin predefiniti utilizzano principalmente elenchi di opzioni generati dinamicamente.

Ho utilizzato una lista con un solo elemento, ma in realtà è più lunga, non sono sicuro di come salvare anche l'elemento selezionato, poiché non so come accedere al valore di questo elemento.

Qualche idea? Ho passato l'intera giornata su questo, diventando lentamente matto.

[modificato]

Non ho mostrato la funzione update perché come ho menzionato sopra uso lo stesso codice di aggiornamento per ogni funzione.

function update( $new_instance, $old_instance ) {

    $instance = $old_instance;
    $instance['example'] = strip_tags( $new_instance['example'] );    

    return $instance;

}
5
Commenti

Suppongo che tu stia usando una dichiarazione di classe per il widget, quindi posta la tua funzione di aggiornamento e penso di sapere qual è il problema.

Bainternet Bainternet
21 feb 2011 01:47:15

Non so se è rilevante, ma non dovrebbe essere name="<?php echo $this->get_field_name( 'example' );? Stai usando get_field_id() sopra.

wyrfel wyrfel
21 feb 2011 02:57:05

Perché il nuovo campo non è all'interno della routine di aggiornamento? Es. $instance['example'] = tua_funzione_di_sanitizzazione_scelta( $new_instance['example'] );

t31os t31os
21 feb 2011 10:49:01

@בניית אתרים fatto! :)

Wordpressor Wordpressor
21 feb 2011 12:54:33

Sarebbe molto più facile debuggare il tuo problema se potessi mostrare il codice completo, non c'è niente di sbagliato per quanto posso vedere in quello che hai postato.

t31os t31os
21 feb 2011 15:41:49
Tutte le risposte alla domanda 2
2

Vedi il mio commento sopra... stai usando get_field_id() sull'attributo name, dove invece dovresti usare get_field_name().

get_field_id() restituisce 'widget-'.$this->id_base.'-'.$this->number.'-'.$field_name,
mentre
get_field_name() restituisce 'widget-'.$this->id_base.'[' . $this->number . '][' . $field_name.']'

21 feb 2011 14:13:17
Commenti

Qual è la differenza se uso get_field_id ovunque? Anche nel primo esempio che funziona?

Wordpressor Wordpressor
21 feb 2011 14:56:33

Nel primo esempio stai usando get_field_id() sull'attributo id e get_field_name() sull'attributo name. Nel secondo esempio stai usando get_field_id() su entrambi. Il che non funziona, perché ora il valore del tuo campo viene registrato come $_POST['widget-base-num-name'] invece di $_POST['widget-base']['num']['name']. Ovviamente, WP mappa $_POST['widget-base']['num'] nel primo parametro di update(), ma non può farlo, quindi il valore del tuo campo viene perso.

wyrfel wyrfel
21 feb 2011 18:48:50
0

Recentemente ho scritto un articolo sulle caselle di selezione (select box) in WordPress per il backend, potrebbe esservi utile:

http://wp-dreams.com/wordpress-widget-select-box/

18 mar 2014 11:48:58