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.
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.
<?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;
}
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 :
- 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 ;
-
- de rendre le nombre de like (resp : dislike) existant pour cette page lorsque celle-ci est présente dans la table ($count=1) ;
- 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.
<?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;
}
}