web-dev-qa-db-fra.com

Étendre GridView ActionColumn avec une icône supplémentaire

Je suis en train de créer une webapp avec le framework Yii2 qui fournira aux utilisateurs (connectés) la possibilité de télécharger des fichiers pré-téléchargés par les administrateurs.

J'ai créé l'action actionDownload dans le contrôleur spécifique qui appelle la méthode sendFile().

Comment puis-je créer un bouton qui appelle l'action spécifique actionDownload au clic dans une GridView (la liste des documents)?

22
AleCat83

Étendez la déclaration de modèle et boutons comme ceci:

[
    'class' => 'yii\grid\ActionColumn',
    'template' => '{download} {view} {update} {delete}',
    'buttons' => [
        'download' => function ($url) {
            return Html::a(
                '<span class="glyphicon glyphicon-arrow-down"></span>',
                $url, 
                [
                    'title' => 'Download',
                    'data-pjax' => '0',
                ]
            );
        },
    ],
],

L'icône de téléchargement avec l'URL sera ajoutée à l'ensemble d'icônes existant. Vous pouvez voir par exemple comment les icônes par défaut sont rendues ici .

Dans le cas commun, vous n'avez même pas besoin de créer un lien manuellement, il sera construit en fonction du nom du bouton et de la clé primaire du modèle, par exemple /download?id=1.

Dans le cas où vous souhaitez que la propriété spéciale url existe, elle s'appelle $ urlCreator , mais vous pouvez également la modifier directement dans la fermeture du rendu du bouton, par exemple:

'download' => function ($url, $model) {
    return Html::a(
        '<span class="glyphicon glyphicon-arrow-download"></span>',
        ['another-controller/anotner-action', 'id' => $model->id], 
        [
            'title' => 'Download',
            'data-pjax' => '0',
        ]
    );
},
39
arogachev

Comment ajouter un autre bouton d'action dans la colonne d'action de la grille kartik-v yii2?

Voir l'exemple suivant J'ai ajouté un bouton de copie.

[
    'class' => 'kartik\grid\ActionColumn',
    'dropdown' => false,
    'vAlign'=>'middle',
    'template' => '{delete} {view} {update} {copy}',
    'urlCreator' => function($action, $model, $key, $index) { 
            return Url::to([$action,'id'=>$key]);
    },
    'buttons'=>[
        'copy' => function ($url, $model, $key) {
            return Html::a('<span class="glyphicon glyphicon-copy"></span>', ['copy', 'id'=>$model->id],['title'=>'Copy']);
        },
    ],      
    'viewOptions'=>['role'=>'modal-remote','title'=>'View','data-toggle'=>'tooltip'],
    'updateOptions'=>['role'=>'modal-remote','title'=>'Update', 'data-toggle'=>'tooltip'],
    'deleteOptions'=>['role'=>'modal-remote','title'=>'Delete', 
                      'data-confirm'=>false, 'data-method'=>false,// for overide yii data api
                      'data-request-method'=>'post',
                      'data-toggle'=>'tooltip',
                      'data-confirm-title'=>'Are you sure?',
                      'data-confirm-message'=>'Are you sure want to delete this item'], 
],
2
Muhammad Shahzad

l'attribut de modèle est important

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
         'id', 
         'title',
        ['class' => 'yii\grid\ActionColumn',
            'buttons' => [
                'additional_icon' => function ($url, $model, $key) {
                    return Html::a ( '<span class="glyphicon glyphicon-th-list" aria-hidden="true"></span> ', ['controller/action', 'id' => $model->id] );
                },
            ],
            'template' => '{update} {view} {delete} {additional_icon}'


        ],
    ],
]);
1
Rafal