Puncte:1

Încercarea de a returna regiunea în sugestiile de teme pentru blocul arborelui de carte al modulului de carte

drapel cn

Editarea întrebării pe baza informațiilor de la @NoSssweat

Modulul carte folosește același cârlig pentru blocul arborelui cărții și vizualizarea index redată în pagina cărții.

Am folosit codul de mai jos pentru a returna sugestii de nume de fișier, astfel încât să pot suprascrie ieșirea html pentru blocul arborelui cărții într-o anumită regiune - "sidebar-first". Mă așteptam ca codul de mai jos să scoată ceva de genul arbore-cărți--carte-toc-180--sidebar-first.html.twig. În schimb, doar scuipă o sugestie de nume de fișier care este deja sugerată:

<!-- FILE NAME SUGGESTIONS:
   * book-tree--book-toc-180.html.twig
   * book-tree--book-toc-180.html.twig
   x book-tree.html.twig
-->

Această sugestie de nume de fișier este aceeași pentru conținutul principal de pe pagina cărții. Cum pot viza orice blocuri de arbore de cărți din cadrul bara laterală-mai întâi regiune?

// Adăugați o variabilă regiune la un bloc.
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
funcția uswds_subtheme_preprocess_book_tree__book_toc_180(&$variables) {
    if (isset($variabile["elemente"]["#id"])) {
        $bloc_id = $variabile["elemente"]["#id"];
        $bloc = \Drupal\block\Entity\Block::load($block_id);

        dacă ($bloc) {
            $variables["conținut"]["#atribute"]["regiune"] = $block->getRegion();
        }
    }
}

// adaugă o sugestie de șablon bazată pe numele regiunii
// http://kristiankaa.dk/article/drupal8-region-specific-menu-theme-hook-suggestion
funcția uswds_subtheme_theme_suggestions_book_tree__book_toc_180_alter(array &$suggestions, array $variables) {
    if (isset($variabile["atribute"]["regiune"])) {
        $suggestions[] = $variables["theme_hook_original"] . „__” . $variables["atribute"]["regiune"];
    }
}

a 2-a încercare Am făcut cele de mai jos și funcționează, dar funcționează numai pentru blocul implicit al modulului de carte, deși orice alt plugin de bloc al modulului de carte folosește în mare parte copac-carte.html.creugă

// Adăugați o variabilă regiune la un bloc.
funcția uswds_subtheme_preprocess_block(&$variabile) {
  if (isset($variabile["elemente"]["#id"])) {
    $bloc_id = $variabile["elemente"]["#id"];
    $bloc = \Drupal\block\Entity\Block::load($block_id);

    dacă ($bloc) {
      $variables["conținut"]["#atribute"]["regiune"] = $block->getRegion();
    }
  }
}

// adaugă o sugestie de șablon bazată pe numele regiunii
function uswds_subtheme_theme_suggestions_alter(matrice &$sugestii, matrice $variabile, $hook) {
  if (isset($variabile["atribute"]["regiune"])) {
    $suggestions[] = $variables["theme_hook_original"] . „__” . $variables["atribute"]["regiune"];
  }
}
No Sssweat avatar
drapel ua
Răspunde asta la întrebarea ta? [Determinați în ce regiune este redat un bloc de meniu](https://drupal.stackexchange.com/questions/218907/determine-which-region-a-menu-block-is-rendered-in)
drapel cn
@NoSssweat - nu chiar, deoarece caut dacă este posibil în twig
drapel cn
@NoSssweat - altă întrebare: am încercat să adaug asta prin intermediul subtemei mele creând fișierul my_subtheme.theme, dar nu pare să funcționeze (presupunerea mea este că moștenirea nu funcționează așa?).
No Sssweat avatar
drapel ua
Presupunând că tema secundară este setată ca temă curentă, ar fi trebuit să funcționeze, poate că nu ați golit memoria cache, astfel încât cârligele să fie preluate?
drapel cn
@NoSssweat - vezi actualizat. Cache-ul a fost golit.
Puncte:2
drapel ua

sau cum pot face ceva în crenguță, cum ar fi {% if region == 'sidebar-first' %} și doar suprascrieți book-tree.html.twig

// Adaugă un atribut de regiune la un bloc.
funcția uswds_subtheme_preprocess_block(&$variabile) {
  if (isset($variabile["elemente"]["#id"])) {
    $bloc_id = $variabile["elemente"]["#id"];
    $bloc = \Drupal\block\Entity\Block::load($block_id);
    dacă ($bloc) {
      $variables["conținut"]["#atribute"]["regiune"] = $block->getRegion();
    }
  }
}

/**
 * Implementează hook_preprocess_HOOK().
 *
 * Creează variabila regiune
 *
 * Scapa de atributul regiune adăugat în uswds_subtheme_preprocess_block() așa cum este
 * nu este un atribut HTML valid.
 */
funcția uswds_subtheme_preprocess_book_tree(&$variabile) {
  if (isset($variables['atribute']['regiune'])) {
    // creează variabila regiune pentru book-tree.html.twig
    $variables['regiune'] = $variabile['atribute']['regiune'];
    // dezactivați atributul html nevalid.
    unset($variabile['atribute']['regiune']);
  }
}
drapel cn
Din păcate, acest lucru nu este numit niciodată - `uswds_subtheme_preprocess_book_tree`.
No Sssweat avatar
drapel ua
Ar trebui să fie, ai golit memoria cache? Dacă da, verificați pentru a vedea dacă nu eșuează condiționalul isset.
Puncte:1
drapel ua

Bună încercare, deoarece aceasta este o carte și nu un meniu, procesul este similar, dar nu exact același. Speram să-ți dai seama.

Dar oricum, iată:

/**
 * Implementează hook_preprocess_HOOK().
 *
 * Transmiteți valoarea regiunii de blocare la conținut, astfel încât aceasta să poată fi utilizată în
 * uswds_subtheme_theme_suggestions_menu_alter() deoarece $variables['elements']
 * nu este disponibil acolo.
 */
funcția uswds_subtheme_preprocess_block(&$variabile) {
  if (isset($variables['elements']['#id']) && $variables['base_plugin_id'] === 'book_navigation') {
    $regiune = \Drupal\block\Entity\Block::load($variables['elements']['#id'])->getRegion();
    $conținut = $variabile['conținut'];
    foreach ($conținut ca $content_key => $content_info) {
      dacă (este_numeric($content_key)) {
        $variables['content'][$content_key]['#attributes']['region'] = $regiune;
      }
    }
  }
}

/**
 * Implementează hook_theme_suggestions_HOOK_alter().
 *
 * Oferiți sugestii de cărți bazate pe regiune.
 */
funcția uswds_subtheme_theme_suggestions_book_tree_alter(&$sugestii, matrice $variabile) {
  if (isset($variables['atribute']['regiune'])) {
    $suggestion = 'carte__' . $variables['theme_hook_original'] . '__' . $variables['atribute']['regiune'];
    $sugestie = str_replace('-', '_', $sugestie);
    $sugestii[] = $sugestii;
  }
}

/**
 * Implementează hook_preprocess_HOOK().
 *
 * Scăpați de atributul regiune adăugat în uswds_subtheme_preprocess_block() așa cum este
 * nu este un atribut HTML valid.
 */
funcția uswds_subtheme_preprocess_book_tree(&$variabile) {
  if (isset($variables['atribute']['regiune'])) {
    unset($variabile['atribute']['regiune']);
  }
}
drapel cn
Din păcate, nu văd nicio schimbare în sugestiile pentru book-tree.html.twig
drapel cn
Privind mai departe, nu cred că a doua funcție se execută, deoarece pot schimba unele dintre valori - cum ar fi „book__” în „books__” și această schimbare nu are loc niciodată.
Puncte:1
drapel cn

Folosind tot ajutorul de la @NoSssweat și am reușit să lucrez:

// Adăugați o variabilă regiune la un bloc.
funcția uswds_subtheme_preprocess_block(&$variabile) {
  if (isset($variabile["elemente"]["#id"])) {
    $bloc_id = $variabile["elemente"]["#id"];
    $bloc = \Drupal\block\Entity\Block::load($block_id);

    dacă ($bloc) {
      $variables["conținut"]["#atribute"]["regiune"] = $block->getRegion();
    }
  }
}

// adaugă o sugestie de șablon bazată pe numele regiunii
function uswds_subtheme_theme_suggestions_alter(matrice &$sugestii, matrice $variabile, $hook) {
  if (isset($variabile["atribute"]["regiune"])) {
    $suggestions[] = $variables["theme_hook_original"] . „__” . $variables["atribute"]["regiune"];
  }
}

Ce rezultate (a doua sugestie incluzând regiunea):

<!-- FILE NAME SUGGESTIONS:
   * book-tree--book-toc-180.html.twig
   * book-tree--book-toc-180--sidebar-first.html.twig
   x book-tree.html.twig
-->

Actualizare la versiunea de lucru:

<?php
// Adăugați o variabilă regiune la un bloc. Se aplică numai unor versiuni de pluginuri care folosesc book-tree.html.twig 
funcția uswds_subtheme_preprocess_block(&$variabile) {
    if (isset($variabile["elemente"]["#id"])) {
      $bloc_id = $variabile["elemente"]["#id"];
      $bloc = \Drupal\block\Entity\Block::load($block_id);
  
      dacă ($bloc) {
        $variables["conținut"]["#atribute"]["regiune"] = $block->getRegion();
      }
    }
  }

// Adaugă sugestie de șablon la blocuri. Pare să funcționeze peste tot, dar nu vizează arborele cărților
funcția uswds_subtheme_theme_suggestions_block_alter(matrice &$sugestii, matrice $variabile){
    dacă (!gol ($variabile['elemente']['#id'])) {
        $bloc = \Drupal\block\Entity\Block::load($variables['elements']['#id']);
        $regiune = $bloc->getRegion();
        // adaugă sugestie cu regiunea și ID-ul blocului
        $suggestions[] = 'bloc__' . $regiune . '__' . $variables['elemente']['#id'];
        // adaugă sugestie cu id-ul regiunii
        $suggestions[] = 'bloc__' . $regiune;
    }
}


// adaugă o sugestie de șablon bazată pe numele regiunii
function uswds_subtheme_theme_suggestions_alter(matrice &$sugestii, matrice $variabile, $hook) {
  if (isset($variabile["atribute"]["regiune"])) {
    $suggestions[] = $variables["theme_hook_original"] . „__” . $variables["atribute"]["regiune"];
  }
}
No Sssweat avatar
drapel ua
Am folosit Bartik când mi-am scris codul, ar trebui să adăugați ultima mea funcție de cârlig; în caz contrar, ajungeți cu un atribut HTML ilegal.
drapel cn
@NoSssweat - încă o întrebare (și mulțumesc pentru tot ajutorul) - codul meu de mai sus pare să funcționeze în mod specific doar cu blocul furnizat de modulul de carte. Nu oferă sugestii pentru niciun alt plugin, deși celelalte plugin-uri depind și de `book-tree.html.twig`. Cum obțin sugestii suplimentare pentru ORICE bloc care folosește `book-tree.html.twig` și care scoate deja `book-tree--book-toc-180.html.twig`?
drapel cn
@NoSssweat sau cum pot face ceva în twig, cum ar fi `{% if region == 'sidebar-first' %}` și doar suprascriu `book-tree.html.twig`?
No Sssweat avatar
drapel ua
vezi [cel mai nou răspuns](https://drupal.stackexchange.com/a/308235/27710)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.