php class

This commit is contained in:
2025-05-23 09:10:23 +02:00
parent b0c93b3eef
commit 86aaef30fc
9 changed files with 227 additions and 121 deletions
File diff suppressed because one or more lines are too long
+22 -18
View File
@@ -5510,11 +5510,6 @@ svg.ext {
padding-bottom: 1rem;
}
}
.path-ressources .layout-content .region-content #block-contenudelapageprincipale .layout--onecol .layout__region--content .block-region-content .block-views-blockbase-de-donnees-block-1 .view-base-de-donnees .view-ressources-hidden {
visibility: hidden;
height: 0;
overflow: hidden;
}
.path-ressources .layout-content .region-content #block-contenudelapageprincipale .layout--onecol .layout__region--content .block-region-content .block-views-blockbase-de-donnees-block-1 .view-base-de-donnees .view-content {
transition: opacity 0.3s ease;
display: flex;
@@ -5522,11 +5517,20 @@ svg.ext {
flex-wrap: wrap;
width: 100%;
}
.path-ressources .layout-content .region-content #block-contenudelapageprincipale .layout--onecol .layout__region--content .block-region-content .block-views-blockbase-de-donnees-block-1 .view-base-de-donnees .view-content .view-type-slide.type-publication-issue-du-programme-eqld {
order: 1;
}
.path-ressources .layout-content .region-content #block-contenudelapageprincipale .layout--onecol .layout__region--content .block-region-content .block-views-blockbase-de-donnees-block-1 .view-base-de-donnees .view-content .view-type-slide.type-paroles-de-laureats {
order: 2;
}
.path-ressources .layout-content .region-content #block-contenudelapageprincipale .layout--onecol .layout__region--content .block-region-content .block-views-blockbase-de-donnees-block-1 .view-base-de-donnees .view-content .view-type-slide.type-presse {
order: 4;
}
.path-ressources .layout-content .region-content #block-contenudelapageprincipale .layout--onecol .layout__region--content .block-region-content .block-views-blockbase-de-donnees-block-1 .view-base-de-donnees .view-content .view-type-slide:not(footer) {
width: 100%;
position: relative;
z-index: 0;
padding-bottom: 4rem;
padding-bottom: rem;
}
.path-ressources .layout-content .region-content #block-contenudelapageprincipale .layout--onecol .layout__region--content .block-region-content .block-views-blockbase-de-donnees-block-1 .view-base-de-donnees .view-content .view-type-slide:not(footer)::before {
content: "";
@@ -6337,56 +6341,56 @@ article.node-type-ressource .ext {
article.node-type-ressource svg.ext {
display: none;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource {
display: grid;
grid-template-columns: 1fr 1.8fr;
grid-template-rows: repeat(5 1fr);
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-field-type-de-ressource {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-field-type-de-ressource {
order: 2;
grid-row: 2;
margin-bottom: 1rem;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-field-type-de-media {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-field-type-de-media {
order: 1;
grid-row: 1;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-field-images {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-field-images {
order: 3;
grid-row: 3/span 5;
height: auto;
width: 90%;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-field-images img {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-field-images img {
height: auto;
width: 90%;
border: 1px solid #a3a3a3;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-title {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-title {
grid-row: 3;
margin-top: 0;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-title a {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-title a {
color: rgb(0, 158, 227);
font-size: 1.2rem;
font-style: normal;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-field-sous-titre {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-field-sous-titre {
grid-row: 4;
color: rgb(0, 158, 227);
font-size: 0.8rem;
font-weight: 800;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-field-auteur-s- {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-field-auteur-s- {
grid-row: 5;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-field-edition {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-field-edition {
grid-row: 6;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-field-date-de-parution {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-field-date-de-parution {
grid-row: 7;
}
article.node-type-ressource.type-de-ressource-Publication-issue-du-programme-EQLD .wrapper-ressource .field--name-field-mots-clefs {
article.node-type-ressource.type-publication-issue-du-programme-eqld .wrapper-ressource .field--name-field-mots-clefs {
grid-row: 8;
}
@media (max-width: 479px) {
+101 -18
View File
@@ -9,7 +9,8 @@
// use Drupal\Core\Url;
use Drupal\Component\Utility\Html;
use Drupal\Component\Transliteration\TransliterationInterface;
use Drupal\taxonomy\Entity\Term;
use Drupal\Core\Template\Attribute;
function eql_preprocess_html(&$variables) {
$node = \Drupal::routeMatch()->getParameter('node');
@@ -41,13 +42,13 @@ function eql_preprocess_node(&$variables){
// $variables['attributes']['class'][] = 'type-de-ressource-' . Html::cleanCssIdentifier($type_de_ressource_name);
// }
// }
if ($node->getType() === 'ressource' && $node->hasField('field_type_de_ressource') && !$node->get('field_type_de_ressource')->isEmpty()) {
foreach ($node->get('field_type_de_ressource')->referencedEntities() as $term) {
$label = $term->label(); // ex: "Presse"
$class = 'type-' . Html::cleanCssIdentifier(strtolower($label));
$variables['attributes']['class'][] = $class;
}
}
// if ($node->getType() === 'ressource' && $node->hasField('field_type_de_ressource') && !$node->get('field_type_de_ressource')->isEmpty()) {
// foreach ($node->get('field_type_de_ressource')->referencedEntities() as $term) {
// $label = $term->label(); // ex: "Presse"
// $class = 'type-' . Html::cleanCssIdentifier(strtolower($label));
// $variables['attributes']['class'][] = $class;
// }
// }
}
function eql_preprocess_field(&$variables) {
@@ -104,29 +105,111 @@ function eql_preprocess_layout__threecol_25_50_25(&$variables) {
function eql_preprocess_views_view_unformatted(&$variables) {
// On utilise le service de translittération de Drupal
$transliterator = \Drupal::service('transliteration');
foreach ($variables['rows'] as &$row) {
if (isset($row['content']['#node'])) {
// function eql_preprocess_views_view_unformatted(&$variables) {
// // On utilise le service de translittération de Drupal
// $transliterator = \Drupal::service('transliteration');
// foreach ($variables['rows'] as &$row) {
// if (isset($row['content']['#node'])) {
// $node = $row['content']['#node'];
// if ($node->hasField('field_type_de_ressource') && !$node->get('field_type_de_ressource')->isEmpty()) {
// foreach ($node->get('field_type_de_ressource')->referencedEntities() as $term) {
// $label = $term->label();
// // Supprimer les accents
// $label_ascii = $transliterator->transliterate($label);
// // Nettoyer pour que ce soit une classe CSS valide
// $class = 'type-' . Html::cleanCssIdentifier(strtolower($label_ascii));
// $row['attributes']->addClass($class);
// }
// }
// }
// }
// }
function eql_preprocess_views_view_unformatted(array &$variables) {
$view = $variables['view'];
if ($view->id() === 'base_de_donnees') {
$transliterator = \Drupal::service('transliteration');
$allowed_types = [
'type-paroles-de-laureats',
'type-publication-issue-du-programme-eqld',
'type-presse',
'type-projets-en-images',
];
$slides = [];
foreach ($allowed_types as $type) {
$slides[$type] = [
'label' => ucwords(str_replace(['type-', '-', '---'], ['', ' ', ' / '], $type)),
'rows' => [],
];
}
$unclassified_rows = [];
foreach ($variables['rows'] as &$row) {
$matched = FALSE;
if (!isset($row['content']['#node'])) {
$unclassified_rows[] = $row;
continue;
}
$node = $row['content']['#node'];
if ($node->hasField('field_type_de_ressource') && !$node->get('field_type_de_ressource')->isEmpty()) {
foreach ($node->get('field_type_de_ressource')->referencedEntities() as $term) {
$label = $term->label();
// Supprimer les accents
$label_ascii = $transliterator->transliterate($label);
$type_class = 'type-' . Html::cleanCssIdentifier(strtolower($label_ascii));
// Nettoyer pour que ce soit une classe CSS valide
$class = 'type-' . Html::cleanCssIdentifier(strtolower($label_ascii));
// ✅ Ajoute la classe sur le conteneur .views-row
if (!empty($row['attributes'])) {
$row['attributes']->addClass($type_class);
}
$row['attributes']->addClass($class);
// ✅ Ajoute la classe aussi sur l'article (si tu veux)
// Sassurer que larticle a un attribut HTML
if (!isset($row['content']['#attributes']) || !($row['content']['#attributes'] instanceof Attribute)) {
$row['content']['#attributes'] = new Attribute();
}
$row['content']['#attributes']->addClass($type_class);
if (isset($slides[$type_class])) {
$slides[$type_class]['rows'][] = $row;
$matched = TRUE;
}
}
}
if (!$matched) {
$unclassified_rows[] = $row;
}
}
$variables['grouped_rows'] = array_filter($slides, fn($s) => !empty($s['rows']));
$variables['unclassified_rows'] = $unclassified_rows;
$variables['rows'] = [];
}
}
+40 -69
View File
@@ -81,64 +81,7 @@ jQuery(function ($) {
settings: { adaptiveHeight: true }
}]
});
// Classes media → .wrapper-ressource
$(".wrapper-ressource").each(function () {
const media = $(this).find(".field--name-field-type-de-media").text().trim();
const className = media
.toLowerCase()
.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
.replace(/[^a-z0-9]+/g, '-')
.replace(/(^-|-$)/g, '');
$(this).addClass('type-media-' + className);
});
console.log("classses media");
// SLIDES RECONSTRUCTION LORS DU CHARGEMENT COMPLET
$(window).on('load', function () {
const $viewContent = $('.path-ressources .view-content').first();
if ($viewContent.length === 0) return;
$viewContent.addClass('view-ressources-hidden');
console.log($viewContent);
const allowedTypes = [
'type-publication-issue-du-programme-eqld',
'type-paroles-de-laureats',
'type-les-projets-en-images',
'type-presse'
];
// const $viewContent = $('.view-content');
const allRows = $('.path-ressources .view-base-de-donnees .views-row').detach();
function toLabel(str) {
return str.replace('type-', '').replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
}
allowedTypes.forEach(type => {
const label = toLabel(type);
const $slide = $(`
<div class="view-type-slide ${type}">
<h3 class="${type}">${label}</h3>
<div class="views-row-wrapper"></div>
</div>
`);
$viewContent.append($slide);
console.log(allowedTypes);
});
allRows.each(function () {
const $row = $(this);
const classList = $row.attr('class').split(/\s+/);
classList.forEach(cls => {
if (allowedTypes.includes(cls)) {
$(`.view-type-slide.${cls} .views-row-wrapper`).append($row.clone(true, true));
}
});
console.log(classList);
});
$('.path-ressources .view:not(.view-partenaires) .view-content .view-type-slide .views-row-wrapper').slick({
slidesToShow: 3,
dots: false,
@@ -155,19 +98,47 @@ jQuery(function ($) {
}
}]
});
// Supprimer les .view-type-slide originales générées par Drupal (vides ou non autorisées)
$('.path-ressources .view-base-de-donnees .view-type-slide').each(function () {
const classes = $(this).attr('class').split(/\s+/);
const isCustom = classes.some(cls => allowedTypes.includes(cls));
if (!isCustom) {
$(this).remove();
}
console.log(classes);
});
$viewContent.removeClass('view-ressources-hidden');
///// fusion views-type-slide de class identique ////////////
const seen = new Set();
$('.view-type-slide').each(function () {
const $slide = $(this);
const classes = $slide.attr('class').split(/\s+/);
const typeClass = classes.find(cls => cls.startsWith('type-'));
if (typeClass) {
if (seen.has(typeClass)) {
// Trouver le premier slide avec cette classe
const $target = $('.view-type-slide.' + typeClass).first();
// Déplacer les rows de la slide actuelle vers la première
$slide.find('.views-row').appendTo($target.find('.views-row-wrapper'));
// Supprimer la slide en double
$slide.remove();
} else {
seen.add(typeClass);
}
}
});
// Classes media → .wrapper-ressource
$(".wrapper-ressource").each(function () {
const media = $(this).find(".field--name-field-type-de-media").text().trim();
const className = media
.toLowerCase()
.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
.replace(/[^a-z0-9]+/g, '-')
.replace(/(^-|-$)/g, '');
$(this).addClass('type-media-' + className);
});
console.log("classses media");
// Ouvrir les liens externes dans un nouvel onglet
document.querySelectorAll('a[href^="http"]').forEach(link => {
@@ -275,22 +275,27 @@
}
.view-ressources-hidden {
visibility: hidden;
height: 0;
overflow: hidden;
}
// .view-ressources-hidden {
// visibility: hidden;
// height: 0;
// overflow: hidden;
// }
.view-content{
transition: opacity 0.3s ease;
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
.view-type-slide.type-publication-issue-du-programme-eqld{
order: 1;
}
.view-type-slide.type-paroles-de-laureats{order: 2;}
.view-type-slide.type-presse{order: 4;}
.view-type-slide:not(footer){
width: 100%;
position: relative;
z-index: 0;
padding-bottom: 4rem;
padding-bottom: rem;
&::before {
content: "";
position: absolute;
@@ -9,7 +9,7 @@ article.node-type-ressource{
svg.ext{
display: none;
}
&.type-de-ressource-Publication-issue-du-programme-EQLD{
&.type-publication-issue-du-programme-eqld{
// background-color: $background-actus;
.wrapper-ressource{
display: grid;
@@ -13,14 +13,14 @@
*/
#}
<div class="buttons-filtres-ressources">
<button class="button-videos" type="button" style=""><a href="/ressources?field_type_de_media_target_id=681&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine=#filtres"> Vidéos</a></button>
<button class="button-videos" type="button" style=""><a href="/ressources?field_type_de_media_target_id=681&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine="> Vidéos</a></button>
<button class="button-podcasts" type="button" style=""><a href="/ressources?field_type_de_media_target_id=686&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine=#filtres"> Podcasts</a></button>
<button class="button-podcasts" type="button" style=""><a href="/ressources?field_type_de_media_target_id=686&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine="> Podcasts</a></button>
<button class="button-reportages-photos" type="button" style=""><a href="/ressources?field_type_de_media_target_id=683&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine=#filtres"> Reportages photos</a></button>
<button class="button-livres" type="button" style=""><a href="/ressources?field_type_de_media_target_id=684&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine=#filtres"> Livres</a></button>
<button class="button-articles" type="button" style=""><a href="/ressources?field_type_de_media_target_id=682&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine=#filtres"> Articles</a></button>
<button class="button-publications-rapports" type="button" style=""><a href="/ressources?field_type_de_media_target_id=685&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine=#filtres"> Publications/rapports</a></button>
<button class="button-reportages-photos" type="button" style=""><a href="/ressources?field_type_de_media_target_id=683&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine="> Reportages photos</a></button>
<button class="button-livres" type="button" style=""><a href="/ressources?field_type_de_media_target_id=684&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine="> Livres</a></button>
<button class="button-articles" type="button" style=""><a href="/ressources?field_type_de_media_target_id=682&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine="> Articles</a></button>
<button class="button-publications-rapports" type="button" style=""><a href="/ressources?field_type_de_media_target_id=685&field_type_de_ressource_target_id=All&field_mots_clefs_target_id=All&field_date_de_parution_value=&combine="> Publications/rapports</a></button>
</div>
<form{{ attributes }}>
@@ -0,0 +1,43 @@
{#
/**
* @file
* Theme override to display a view of unformatted rows.
*
* Available variables:
* - title: The title of this group of rows. May be empty.
* - rows: A list of the view's row items.
* - attributes: The row's HTML attributes.
* - content: The row's content.
* - view: The view object.
* - default_row_class: A flag indicating whether default classes should be
* used on rows.
*
* @see template_preprocess_views_view_unformatted()
*/
#}
{%
set view_wrapper_class = [
default_row_class ? 'views-row-wrapper',
]
%}
{% if grouped_rows is defined %}
{% for type_class, group in grouped_rows %}
<div class="view-type-slide {{ type_class }}">
<h3 class="{{ type_class }}">{{ group.label }}</h3>
<div class="views-row-wrapper">
{% for row in group.rows %}
<div{{ row.attributes.addClass('views-row') }}>
{{ row.content }}
</div>
{% endfor %}
</div>
</div>
{% endfor %}
{% else %}
{% for row in rows %}
<div{{ row.attributes.addClass('views-row') }}>
{{ row.content }}
</div>
{% endfor %}
{% endif %}
@@ -66,9 +66,9 @@
{% if rows %}
{% set content_classes = ['view-content'] %}
{% if view.id == 'base_de_donnees' %}
{# {% if view.id == 'base_de_donnees' %}
{% set content_classes = content_classes|merge(['view-ressources-hidden']) %}
{% endif %}
{% endif %} #}
<div{{ create_attribute().addClass(content_classes) }}>
{{ rows }}