More

    GridView Avancé dans Yii2 : Conversion de la Méthode GET vers POST avec Intégration Pjax

    Advertisement

    Pour les développeurs expérimentés de Yii2, le changement de comportement par défaut du filtrage de POST dans Yii1 vers GET dans GridView de Yii2 crée souvent un besoin d’implémentation personnalisée. Cet article discutera des techniques avancées pour changer les méthodes de requête GridView de GET vers POST, y compris les importantes considérations de sécurité et de performance qui nécessitent une attention.

    Advertisement

    Le framework Yii2 adopte la méthode GET par défaut pour les opérations de filtrage dans le widget GridView, contrairement à son prédécesseur Yii1 qui utilisait POST. Bien que la méthode GET soit plus facile pour l’implémentation du cache et la mise en signet, dans certains scénarios d’environnement de production, l’utilisation de POST devient une exigence obligatoire car :

    • Considérations de sécurité pour les données sensibles
    • Limitations de longueur sur les paramètres de chaîne de requête
    • Propreté des URL et considérations SEO
    • Prévention des attaques CSRF via la validation des jetons

    Implémentation de la Méthode POST dans GridView

    Voici l’implémentation technique pour configurer GridView en utilisant la méthode POST avec l’intégration Pjax.

    Advertisement

    Configuration de la Vue

    Modifiez le fichier de vue avec la configuration suivante du widget Pjax :

    <?php
    use yii\widgets\Pjax;
    use yii\grid\GridView;
    
    Pjax::begin([
        'id' => 'grid-pjax',
        'timeout' => 5000,
        'enablePushState' => false,
        'enableReplaceState' => false,
        'clientOptions' => [
            'method' => 'POST',
            'skipOuterContainers' => true
        ]
    ]);
    ?>
    
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => require __DIR__ . '/_columns.php',
        'layout' => "{items}\n{pager}",
    ]); ?>
    
    <?php Pjax::end(); ?>

    Configuration des Paramètres :

    Advertisement
    • enablePushState: falseEmpêche la mise à jour de l’historique du navigateur
    • enableReplaceState: false – Désactive le remplacement d’URL
    • method: 'POST' – Définit la méthode HTTP sur POST
    • timeout: 5000 – Définit le délai d’attente de la requête à 5 secondes

    Modification du Contrôleur

    Dans le contrôleur, changez la gestion des paramètres de queryParams à post() :

    public function actionIndex()
    {
        $searchModel = new YourSearchModel();
        $dataProvider = $searchModel->search(
            Yii::$app->request->post()
        );
    
        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    Configuration Avancée et Bonnes Pratiques

    Pour les environnements de production, considérez l’implémentation suivante :

    Protection CSRF

    Pjax::begin([
        'id' => 'grid-pjax',
        'clientOptions' => [
            'method' => 'POST',
            'data' => [
                Yii::$app->request->csrfParam => Yii::$app->request->csrfToken
            ]
        ]
    ]);

    Gestionnaire de Filtre Personnalisé

    // Dans SearchModel
    public function search($params)
    {
        $query = YourModel::find();
        
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => [
                'pageSize' => 20,
            ],
            'sort' => [
                'defaultOrder' => ['id' => SORT_DESC]
            ]
        ]);
    
        if (!empty($params) && $this->load($params)) {
            // Appliquer les filtres ici
            $query->andFilterWhere(['like', 'attribute', $this->attribute]);
        }
    
        return $dataProvider;
    }

    Note de Performance : L’implémentation de la méthode POST avec Pjax peut augmenter l’utilisation de la mémoire sur les grands ensembles de données. Il est recommandé d’implémenter une pagination appropriée et une optimisation des requêtes.

    Débogage et Dépannage

    Avec une implémentation appropriée, la conversion de GridView de GET vers POST peut fournir une sécurité améliorée et une flexibilité sans compromettre l’expérience utilisateur optimale.

    Articles Récents