Egyedi twig template régiók blokkjaihoz megoldható?

HF leon képe

Lehetséges régiók szerint egyedi teplate fájlok létrehozása?

Például, ha mondjuk készítek egy régiót, amelybe menüket szánok, de szeretném őket máshogy formázni, mint ahogy a menu.html.twig fájlban van.

Viszont ez csak az adott régió menüire érvényesüljön máshol maradjon az alapértelmezett formázás.

Van erre lehetőség drupal8-ban?

Drupal verzió: 
Fórum: 
aboros képe

8.x drupalból kikerült ez a funkció. lásd:
https://www.drupal.org/node/2011434

az alaprendszerben elérhető template elnevezési szabályokat itt találod:
https://www.drupal.org/docs/8/theming/twig/twig-template-naming-conventions

mit értesz pontosan az alatt, hogy "szeretném őket máshogy formázni"? lehet, hogy nem is kell neked a régiónkénti block template, hanem máshogyan kell megoldani azt. ha mindenképpen per-régió template suggestion kell mégis, akkor én a hook_theme_suggestions_HOOK_alter() -el próbálkoznék először.

0
0

-
clear: both;

aboros képe

és kipróbáltam.
a sminked .theme filejában:

<?php
use Drupal\block\Entity\Block;
 
function SMINKEDNEVE_theme_suggestions_block_alter(array &$suggestions, array $variables) {
  $id = $variables['elements']['#id'];
  $block = Block::load($id);
  $region = $block->getRegion();
 
  $suggestions[] = 'block__' . 'region-' . $region;
}

mentés után törölni kell minden gyorstárat és utána lesz a blokkjaidnak régió alapján template suggestionje, például ha a sidebar-first nevű régióban van a blokk, akkor block--region-sidebar-first.html.twig templatere ugrani fog.
0
0

-
clear: both;

HF leon képe

Pont ezzel próbálkoztam.

A menüknél nem tudtam a régió nevét átadni csak attribútumként az alábbiak szerint:

  1. /**
  2.  * Implements hook_preprocess_HOOK() for block.html.twig.
  3.  */
  4. function MYskin_preprocess_block(&$variables) {
  5. $variables['content']['#attributes']['data-block'] = $variables['elements']['#id'];
  6. }
  7. /**
  8.  * Implements hook_theme_suggestions_HOOK_alter().
  9.  */
  10. function MYskin_theme_suggestions_menu_alter(array &$suggestions, array $variables) {
  11. // $menu_name = $variables['menu_name'];
  12. if (isset($variables['attributes']['data-block'])) {
  13. $block = \Drupal\block\Entity\Block::load($variables['attributes']['data-block']);
  14. $region = $block->getRegion();
  15. $suggestions[] = 'menu__' . $region;
  16. }
  17. }

Nekem viszont ez a megoldás nem szimpatikus, mert nem szeretnék a html kódban fölös tulajdonságot az elemhez fűzni.

Nem akart működni, amikor sima változót próbáltam a menühöz rendelni.

Van esetleg erre valamilyen működő megoldás, hogy ne attribútumként, hanem mondjuk egy menu_block nevű változóként tudnék a menükhöz fűzni?

Így a suggestions_menu_alter-nél fel tudnám használni a menu_block változót a blokk régiójának lekéréséhez, de a html kódba így nem kerülne bele.

0
0
aboros képe

még mindig nem tudni, hogy pontosan mire is kell neked ez, továbbra is fenntartom, hogy könnyen lehet, hogy egyátalán nincs szükséged új css osztályra. konkrétan változtatni akarsz a markupon? vagy mit szeretnél csinálni pontosan?

ha a _blokkhoz_ akarsz új templatet, ne a menüt alterezzed. minden menü egy blokkba jelenik meg. a menüt akkor kéne alterezned és csak akkor, ha mondjuk a menü faszerkezetének a markupját akarod változtatni. jól lenne tudni, hogy mit szeretnél pontosan elérni. (pl: azt akarom, hogy minden menü ami a bal oldalsávba van, legyen zöld hátterű. vagy ilyesmi leírásra gondolok, gyereknyelven.)

0
0

-
clear: both;

HF leon képe

Szeretnék egy teljesen egyedi template-et kialakítani, minél kevesebb kompromisszummal.

Mivel egyes régiókban egyes blokkok megjelenése is egyedi ezért hasznos, ha saját twig-et rendelhetek egyes blokktípusok megjelenéséhez az adott régiókban.

A menük alapértelmezett generálása ul, li listaként generálódik. Jó lenne, ha egyes régiókban ezt felülbírálhatnám és magát a html kódot is testre szabhatnám css trükközés nélkül.

Ahhoz azonban, hogy a menüknél megállapíthassam a régiót. Kellett a menü blokkjának a neve, amit nem sikerült átadnom csak a menünek, hogy lekérhessem a régiót és így régiófüggő twig-et rendelhessek minden a régióban megjelenő menühöz, de csak azokhoz.

Mivel kismillió menü jelenik meg az adott régiókban a különféle lapoktól függően ezért nem jó, ha a menük neve alapján készítek hozzá fájlokat, ráadásul mindben ugyanaz lenne, így az hülyeségnek is tűnik.

A fenti megoldással sikerült a problémát orvosolnom, de jó lenne, ha a data-block="..." helyett olyan egyedi változót tudnék a menükhöz rendelni, ami alapján aztán a régiófüggő suggestions-t kivitelezhetném.

Vegyünk egy egyszerű példát az alapértelmezett menü esetén maga a menülista a következő lesz:

  1. <ul>
  2. <li><a>menuitem1</a></li>
  3. <li><a>menuitem2</a></li>
  4. <li><a>menuitem3</a></li>
  5. </ul>

Viszont ha én egyes régiókban azt szeretném, hogy a fenti helyett a következőt kapjam, akkor régiófüggő template-fájlt kell a menükhöz rendelnem:

  1. <div>
  2. <a>menuitem1</a>
  3. <a>menuitem2</a>
  4. <a>menuitem3</a>
  5. </div>

Szóval ilyen esetekben szeretném, ha a régiókban magam szabhatnám meg az egyes menük és blokkok kinézetét. Az adott régióban minden blokk, menü egységesen egyedi lenne ezért lenne logikus rájuk régiófüggő twig fájlt alkalmazni.

A legtöbb problémát sikerült megoldanom, de ebben az esetben nem találtam kompromisszummentes megoldást sajnos.

Remélem tudsz nekem ebben segíteni, aminek nagyon örülnék. Nemrég kezdtem el ismerkedni a drupal8-al mélyebben. Sok jó dolog van a rendszerben, de akadnak érdekes esetek, mint a fent említett is.

Szeretném alaposan kiismerni a rendszer lehetőségeit, aminek, még az elején tartok ezért kérnék segítséget a nálamnál rutinosabb drupal-osoktól.

Megszoktam, hogy egyedi fejlesztések esetén azt csinálok, amit akarok, de itt alkalmazkodni kell a drupal logikájához és szeretném megismerni, hogyan formálhatom a kedvem szerint a böngészőben megjelenő lapokat.

A fenti probléma kicsit kifogott rajtam, nem egészen értem, mért nem ajánlja fel alapból a drupal8 a régió alapú templétek készítését, de sebaj, ha ezt el tudnám érni, annak örülnék. A menü blokkokban a faszerkezet igen fontos és ezt szeretném -ahogy kérdezted -testre szabni, de ahogy írtam csak némi megkerülő megoldással sikerült. Biztos én vagyok, még ügyetlen, de kitartóan próbálkozom, hogy alaposan kiismerjem a drupal 8 lehetőségeit.

1
0
aboros képe

hétvégén lesz időm kipróbálni, hogy hogyan lenne ez a lehető legelegánsabb. kitartás, sokszor van, hogy ami elsőre nagyon logikátlannak tűnik (pl miért nincs alapból template suggestion régiónként) később majd kiviláglik és teljesen logikus lesz.

0
0

-
clear: both;

HF leon képe

Köszönöm a segítséget, pláne, ha sikerül elegáns megoldást találnod.

Ha nem az se baj. Minden ötletnek örülök. Volt, már úgy, hogy egy másik megoldás egy teljesen más problémára adott ötletet a sajátom megoldására.

Közben én is tovább fejlesztettem az eddigit. Sikerült kitörölnöm a kérdéses kényszerként felvett attribútumot egy unset-tel, így a generált html kódba, már nem került be :).

Persze szerintem nem biztos, hogy ez a legelegánsabb megoldás.

Egyébként valóban nincs minden esetben és minden régióban szükség a suggestion-ra és gondolom nem akarták ezzel lassítani a rendszert, de az is lehet, hogy rosszul gondolom. A core belső működését, még ennyire nem boncolgattam.

Szimpatikusnak tűnik a drupal 8, habár mintha kicsit pazarlóbban bánna a hellyel, mint a 7, de nem akarok elhamarkodottan nyilatkozni, míg nem jutok a végére a portál építésnek. Igaz a hetessel nem foglalkoztam annyit anno, mint, most a 8-assal szeretnék.

Még egyszer nagyon köszönöm a segítséget. Kíváncsi vagyok, miként a legdrupalosabb a probléma megoldása :).

(pici off: jut eszembe, ha magyar fordítást csinálok egy modulnak azt is a sites mappába érdemes tenni? Még nem csináltam ilyet, de gondolkodom rajta, hogy csinálok párhoz magyar fordítást.)

0
0