-1

I have this code in my sub theme :

bootstrap_subtheme_front_office_old.theme

<?php

/**
 * Implements hook_preprocess_HOOK() for user.html.twig.
 */
function bootstrap_subtheme_front_office_old_preprocess_user(&$variables) {
  $flag_service = \Drupal::service('flag');
  $user_to_flag = $variables['user'];

  $flag_ids = [
    'role_association' => 'is_flagged_role_association',
    'role_pop_up_store' => 'is_flagged_role_pop_up_store',
    'role_artisan' => 'is_flagged_role_artisan',
  ];

  foreach ($flag_ids as $flag_id => $var_flag) {
    if ($flag = $flag_service->getFlagById($flag_id)) {
      if ($flag_status = $flag_service->getFlagging($flag, $user_to_flag)) {
        $variables[$var_flag] = $flag_status;
      }
    }
  }
}

And this templates :

user--account-roles.html.twig

<div class="card p-4 overflow-hidden shadow rounded bg-white">

  <div class="alert alert-light" role="alert">
    <p class="text-center">Vous trouverez sur cette page les différents types de compte disponible.</p>
    <p class="text-center">Chaque type de compte vous donne droit à des autorisations au sein de la plateforme.</p>
    <p class="text-center font-weight-bold">Vous devez avoir un numéro de SIRET.</p>
    <p class="text-center">Les modifications peuvent prendre 24 heures pour ếtre appliquées.</p>
  </div>

  <p>Les associations sont destinées aux comités des fêtes, offices de tourisme, ... qui organisent des événements. Vous pourrez y publier divers types de contenu.</p>
  {% if 'association' in user.getroles %}
    <div><i class="fas fa-circle text-success"></i> Votre compte association est actif.</div>
  {% elseif 'association' not in user.getroles and is_flagged_role_association %}
    <div><i class="fas fa-circle text-warning"></i> Votre compte association est en attente.</div>
  {% elseif 'association' not in user.getroles and not is_flagged_role_association %}
    <div><i class="fas fa-circle text-danger"></i> Votre compte association est inactif.</div>
    {{ content.flag_role_association }}
  {% endif %}

  <span class="border-top mt-4 mb-4"></span>

  <p>Les boutiques éphémères vous permettent d'exposer les créations des artisans présents sur la plateforme (pas de vente en ligne).</p>
  {% if 'pop_up_store' in user.getroles %}
    <div><i class="fas fa-circle text-success"></i> Votre compte boutique éphémère est actif.</div>
  {% elseif 'pop_up_store' not in user.getroles and is_flagged_role_pop_up_store %}
    <div><i class="fas fa-circle text-warning"></i> Votre compte boutique éphémère est en attente.</div>
  {% elseif 'pop_up_store' not in user.getroles and not is_flagged_role_pop_up_store %}
    <div><i class="fas fa-circle text-danger"></i> Votre compte boutique éphémère est inactif.</div>
    {{ content.flag_role_pop_up_store }}
  {% endif %}

  <span class="border-top mt-4 mb-4"></span>

  <p>Si vous êtes artisans, nous serions ravis de vous accueillir sur notre marketplace. Nous facturons une commission de 10% sur chaque vente. Vous recevrez une facture à chaque début de mois, si vous réalisez des ventes le mois précédent. Plus d'infos sur <a href="/node/271">cette page</a>.</p>
  <p>Pas de vente = Rien à payer</p>
  {% if 'marchand' in user.getroles %}
    <div><i class="fas fa-circle text-success"></i> Votre compte artisan est actif.</div>
  {% elseif 'marchand' not in user.getroles and is_flagged_role_artisan %}
    <div><i class="fas fa-circle text-warning"></i> Votre compte artisan est en attente.</div>
  {% elseif 'marchand' not in user.getroles and not is_flagged_role_artisan %}
    <div><i class="fas fa-circle text-danger"></i> Votre compte artisan est inactif.</div>
    {{ content.flag_role_artisan }}
  {% endif %}

</div>

The above code works but the problem is that it is cached. I have to face drush cr for the conditions in TWIG to be visible in my page.

How can I correct this ?

1 Answer 1

0

Based on what I see here, something like the following might do the trick:

use Drupal\Core\Cache\Cache;

/**
 * Implements hook_preprocess_HOOK() for user.html.twig.
 */
function bootstrap_subtheme_front_office_old_preprocess_user(&$variables) {
  $flag_service = \Drupal::service('flag');
  $user_to_flag = $variables['user'];

  $flag_ids = [
    'role_association' => 'is_flagged_role_association',
    'role_pop_up_store' => 'is_flagged_role_pop_up_store',
    'role_artisan' => 'is_flagged_role_artisan',
  ];
  
  $invalidate_cache = FALSE;
  foreach ($flag_ids as $flag_id => $var_flag) {
    if ($flag = $flag_service->getFlagById($flag_id)) {
      if ($flag_status = $flag_service->getFlagging($flag, $user_to_flag)) {
        $variables[$var_flag] = $flag_status;
        $invalidate_cache = TRUE;
      }
    }
  }
  
  if ($invalidate_cache) {
    $cachetag = "user:{$user_to_flag->id()}";
    Cache::invalidateTags([$cachetag]);
  }
}

Maybe there's a better hook to call that cache invalidation like when the flag action is made.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.