2015-07-07 14 views
5

Ho un tipico modulo Yii2 per aggiornare il mio modello con un tipico pulsante di invio. Accanto ad esso, ho un pulsante "Elimina foto", che appare, se c'è qualche foto da eliminare. Il pezzo di vista sembra che:Il pulsante aggiuntivo nel modulo Yii2 invia il modulo invece di chiamare la sua azione

<?= Html::submitButton('Save changes', ['class' => 'btn btn-primary', 'name' => 'edit-button']) ?> 

<?php $image = isset($page->photo) ? $page->photo->getImageUrl() : null; ?> 

<?php if (isset($image)): ?> 

    <?= Html::a('Delete photo', ['delete-image', 'lab' => $lab->id, 'kind' => $page->kind], [ 
     'class' => 'btn btn-danger', 
     'data' => [ 
      'confirm' => 'Do you really want to delete this photo?', 
      'method' => 'post' 
     ], 
    ]) ?> 

<?php endif; ?> 

Quando c'è una foto allegata a questo modello e questi due pulsanti appaiono una accanto all'altra, devo commentare 'method' => 'post' parte al secondo codice del pulsante. Perché, se non lo faccio, il secondo pulsante è ... inviare il modulo (proprio come il primo) anziché chiamare il percorso lab/delete-image.

Questa è la prima cosa che non capisco. L'intero codice è generato da Gii o incollato con copia da alcuni tutorial di Yii. Nemmeno un po 'della mia invenzione, eppure funziona in modo strano. Cosa mi manca?

Sembra, che il normale Html::a collegamento (stile solo da Twitter Bootstrap a guardare come un pulsante, ma non essendo un pulsante a tutti) sta presentando una forma, invece di chiamare la sua azione, quando contiene data-method="post" attributo nel codice elemento. È un bug in Yii2 o mi manca qualcosa?

+1

Ho tolto seconda parte di questa domanda, perché era un risultato di concetto equivoco/semplice battitura. VerbFilter dovrebbe usare 'delete-image' come nome di azione, non' deleteImage' per i nomi di azione a doppia parola. – trejder

risposta

8

È necessario posizionare il collegamento all'esterno del modulo. Per chiamare le azioni da elementi con data-method attributo Yii ha funzione js handleAction, e la sua documentazione dice:

Questo metodo riconosce l'attributo data-method dell'elemento. Se l'attributo esiste, il metodo invierà il modulo contenente questo elemento. Se non è presente un modulo di contenimento, un modulo verrà creato e inviato utilizzando il metodo fornito da questo valore di attributo (ad esempio "post", "put").

Per i collegamenti ipertestuali, l'azione modulo assumerà il valore dell'attributo "href" del collegamento.

Anche se si utilizza v2.0.3 yii2 o superiore è possibile aggiungere data-params attributo il cui valore dovrebbe essere la rappresentazione JSON dei dati, e questi dati saranno sottoposti a richiesta. Come esempio:

echo Html::a('Delete image', ['delete-image'], [ 
    'data' => [ 
     'confirm' => 'Do you really want to delete this photo?' 
     'method' => 'post', 
     'params' => [ 
      'lab' => $lab->id, 
      'kind' => $page->kind, 
     ], 
    ], 
]); 

In questo esempio params array viene json codificato yii2 internaly

+0

Puoi fornire un esempio per aver menzionato il pulsante "_Delete image_" in modo alternativo (con 'data-params')? – trejder

+1

@trejder ha aggiunto l'esempio – Tony

+0

@Tony e trejder: Come si usa questo per favore spiegare? –

Problemi correlati