Aller au contenu principal


Gérer la table Like

Les billets "autopsie d'un module " et "le bloc like" figurent comme pré-requis pour la compréhension de cette page.

Billet créé le :
07 Mar 2023

Lors de l'installation du module "dh_like", le fichier "dh_like.install" dont le contenu est affiché ci-dessous, crée la table "like" dans la base de données du site. 

Accès à la documentation officielle

<?php  
use Drupal\Core\Database\Database;  
/**  
* Implements hook_schema().  
*/  
function dh_like_schema(){  
   $schema['like'] = array(  
       'description' => 'La table pour enregistrer les likes.',  
       'fields' => array(  
           'uid' => array(  
               'description' => 'La clé primaire',  
               'type' => 'serial',  
               'not null' => TRUE,  
               'unsigned' => TRUE,  
           ),  
           'nid' => array(  
               'description' => 'l identifiant du node',  
               'type' => 'int',  
               'length' => 100,  
               'not null' => TRUE,  
           ),  
          'uplike' => array(  
               'description' => 'nombre de like.',  
               'type' => 'int',  
               'length' => 100,  
               'not null' => TRUE,  
               'default' => 0,  
           ),  
           'downlike' => array(  
               'description' => 'nombre de dislike',  
               'type' => 'int',  
               'length' => 100,  
               'not null' => TRUE,  
                'default' => 0,                
           ), 
           'created' => array(
               'description' => 'date de creation',
               'type' => 'int',
               'length' => 100,
               'not null' => TRUE,
                'default' => 0,              
           ), 
       ),  
       'primary key' => array('uid'),  
   );  
   return $schema;  
}

L'image ci-dessous présente la table "like" et ses 4 champs uid, nid, uplike et downlike, vue à travers l'interface "phpmyadmin" du serveur gérant la base de données du site.
 

Cliquer pour agrandir l'image

Les fonctions "updateDbLike()" et "getFromDbLike()" introduites dans le §2 du billet "le bloc likes" manipulent les données de cette table et sont présentées dans les paragraphes qui suivent. Elles s'appuient sur cette documentation https://www.drupal.org/docs/drupal-apis/database-api qui   décrit les opérations sur la base de données d'un site.
Puisque qu'elles sont utilisées dans différentes classes du module, elles doivent être définie dans un trait : le trait "GestionLikeTrait" dont le code figure dans le fichier "GestionLikeTrait.php" du dossier "src/Utility" du module.

1. La fonction UpdateDbLike()

Cette fonction reçoit 3 paramètres :

  • $type : valeur attendue "uplike" ou "downlike"
  • $count : le nouveau nombre de  $type
  • $entity_nid : l'identifiant ($entity_id) de la page à liker.  

L'emploi de la commande SQL update (https://www.drupal.org/docs/drupal-apis/database-api/update-queries) permet la mise à jour de la table.

Le code de cette fonction se trouve dans l'onglet "trait GestionLikeTrait" ci-dessous.

2. La fonction getFromDbLike()

Cette fonction reçoit 2 paramètres :

  • int $entity_nid :  l'identifiant de la page ;
  • string $type : "uplike" ou "downlike".

Elle renvoie le nombre de "likes" ou de "dislike" attaché à la page.  
L'emploi de la commande SQL select (https://www.drupal.org/docs/8/api/database-api/dynamic-queries) permet :

  1. de vérifier l'existence (ou non) d'un enregistrement dans la table like pour cette page  ($count = $query->countQuery()->execute()->fetchField();)  voir https://www.drupal.org/docs/8/api/database-api/dynamic-queries/count-queries ;
  2.  
    1. de rendre le nombre de like (resp : dislike) existant pour cette page lorsque celle-ci est présente dans la table ($count=1) ;
    2. d'insérer un enregistrement pour cette page lorsque celle-ci n'est pas présente dans le table ($count =0).

Le code de cette fonction se trouve dans l'onglet "trait GestionLikeTrait" ci-dessous.

Cliquez sur le bouton pour copier le code dans le presse papier  
    
<?php
namespace Drupal\dhlike\Utility;
/**
* Trait pour implémenter la gestion (getLike / Get Dislike) des likes.
* - Implementation de :
* getLike() member function.
* getDisLike() member function.
*/
trait GestionLikeTrait {
//
/**
* Generate a array with our templated content.
* @param $entity_nid
* @param $type
* @return int
* le nombre de like/dislike enregistré pour $entity_nid
*/
private function getFromDbLike(int $entity_nid, string $type) {
   // $entity_nid: le nid à chercher
   // $t: uplike ou downlike
   \Drupal::logger('dhlike')->error($type);
   try{
       $query = \Drupal::database()->select('like', 'sil');
       $query->condition('sil.nid', $entity_nid,'=');
       $count = $query->countQuery()->execute()->fetchField();
       //
       $result=0;
       if ($count > 0) {
           $query = \Drupal::database()->select('like', 'sil');
           $query->addField('sil', $type);
           $query->condition('sil.nid', $entity_nid);
           $result=$query->execute()->fetchField();
       }
       else {
           $query = \Drupal::database()->insert('like');
           $query ->fields([
               'nid' => $entity_nid,
               'uplike' => 0,
               'downlike' => 0,
               'created' => \Drupal::time()->getRequestTime(),
            ]);
           $query->execute();
       }       
//        \Drupal::messenger()->addMessage($this->t('lecture database dans getLikeCount nblike : ' . $result. ' entity : ' .$entity_id . ' nb : '.$count ));
   }
catch(Exception $ex){
       \Drupal::logger('dhlike')->error($ex->getMessage());
   }
return $result;
}
/**
* @param $count
* @param $entity_nid
* @param $type
* @return mixed
* $type : 'uplike' ou "donwlike"
* $count : le nouveau nb de $type
* $entity_nid : le nId à mettre à jour
*/
//
private function updateDbLike($count, $entity_nid, $type){
    try{
       //
       $query = \Drupal::database()-> update('like')
        ->fields([
           $type => $count,
        ])
        ->condition('nid',$entity_nid , '=')
        ->execute();
//    \Drupal::messenger()->addMessage($this->t(' dans submitForm avec count ' . $count . ' et node '.$entity_nid . ' et type '.$t));
//    $this->messenger()->addStatus($this->t('votre dislike est pris en compte'));
   }
       catch(Exception $ex){
       \Drupal::logger('dhlike')->error($ex->getMessage());
   }
   return;
}
//
/**
* Get current entity, if any.
*/
private function getCurrentEntity(){
$currentRouteParameters = \Drupal::routeMatch()->getParameters();
foreach ($currentRouteParameters as $param) {
if ($param instanceof \Drupal\Core\Entity\EntityInterface) {
$entity = $param;
return $entity;
}
}
return NULL;
}
}