# Elemfeltételek

> Feltételek megadása bármelyik elemhez: csak akkor jelenik meg a weboldalon, ha a feltételek teljesülnek. Feltételcsoportok, AND/OR logika, WooCommerce feltételek.

Az elemfeltételekkel bármelyik elemhez egy vagy több feltételt adhatsz. Az elem csak akkor jelenik meg a weboldalon, ha a feltételek teljesülnek. A feltételeket a szerver értékeli ki, és adatok alapján (bejegyzés, felhasználó, dinamikus adat, dátum és idő stb.) szűrik ki az elemet. Ha az elem nem jelenik meg, a HTML-je egyáltalán nincs a forráskódban.

Jó például arra, hogy a tartalmat bejelentkezett felhasználókra vagy egy adott szerepkörre korlátozd (tagsági oldalak), időhöz kötött információt hétköznaphoz, dátumhoz vagy időponthoz kapcsolj, vagy dinamikus adat alapján rejts el tartalmat.

Az elemfeltétel megjelenítési logika. Felület, marketing, tagsági és terméktartalom elrejtésére jó, de nem helyettesíti a szerveroldali jogosultságokat az igazán érzékeny adatoknál, letöltéseknél és műveleteknél. Ha például elrejtesz egy letöltés gombot, a hivatkozás eltűnik az oldalról, de aki már ismeri a fájl URL-jét, az még megnyithatja. A privát fájlokat és műveleteket a tagsági, fájlvédelmi vagy jogosultsági megoldásoddal védd.

Ha teljes programozói szabadság kell, használd a `bricks/element/render` szűrőt.

## A feltételek megnyitása

Elem szerkesztésekor kattints a panel fejlécében a **Feltételek** ikonra, ezzel nyitod és zárod a feltételek felületét. Ha egy elemnek vannak feltételei, a **Feltételek** ikon a **Szerkezet** panelen is megjelenik az elem mellett. Erre kattintva egyből az elem feltételeihez ugrasz, így a Szerkezet panelen egy pillantással látod, melyik elemnek van feltétele.

![A Feltételek panel egy elemnél, megnyitott feltételválasztóval](./kepek/funkciok-elemfeltetelek-panel.webp)

*A Feltételek panel egy elemnél, megnyitott feltételválasztóval* (https://minta-bolt.hu/elemek-teszt/?bricks=run)

A képen az elem panelje látszik a **Feltételek** felülettel és a **Válassz feltételt** legördülővel, amely a csoportokba rendezett feltételeket listázza (**Bejegyzés**, **Felhasználó**, **Dátum és idő** és így tovább). A panel tetején a „Kattints a „+” ikonra, hogy hozzáadd az első feltételt. A feltételek nem futnak a szerkesztőben.” üzenet jelzi, hogy a feltételek csak a weboldalon érvényesülnek.

## Hogyan működnek a feltételek

Az elem megjelenéséhez legalább egy feltételcsoportnak teljesülnie kell. Egy csoporton belül minden feltételnek igaznak kell lennie. Vagyis a csoportok között VAGY, a csoporton belüli feltételek között ÉS kapcsolat van.

Az első csoport létrehozásához kattints a **Feltételek** cím melletti „+” ikonra. Ekkor egy csoport jön létre egy feltétellel. Minden feltétel három részből áll:

- **Kulcs:** például bejegyzés-azonosító, felhasználói szerepkör, dátum, dinamikus adat.
- **Összehasonlító művelet:** `==`, `!=`, `>`, `<`, tartalmaz, előtt, után és így tovább.
- **Érték:** szám, szöveg, jelölőnégyzet vagy kiválasztható lehetőségek.

A beépített feltételcsoportok és feltételek:

| Csoport | Feltételek |
| --- | --- |
| **Bejegyzés** | Bejegyzés ID, Bejegyzés címe, Szülőbejegyzés, Bejegyzés állapota, Bejegyzés szerzője, Bejegyzés dátuma, Kiemelt kép |
| **Felhasználó** | Felhasználónév, Felhasználói azonosító (ID), A felhasználó regisztrált, Felhasználói szerepkör |
| **Dátum és idő** | A hét napja, Dátum, Idő, Dátum és idő (a WordPress webhelyidőzónája szerint) |
| **WooCommerce** | Terméktípus, Termék akciós állapota, A termék újdonsági állapota, Termék készletállapota, Termék készletmennyisége, Termék készletkezelése, Egyenként értékesített termék, Felhasználó által megvásárolt termék, Kiemelt termék, Termék értékelése, Termékkategória, Termékcímke (csak aktív WooCommerce-nél) |
| **Egyéb** | Dinamikus adatok, Böngésző, Operációs rendszer, Jelenlegi URL, Hivatkozó URL |

A **Jelenlegi URL** feltétel a lekérdezési paramétereket is tartalmazza. A böngésző, az operációs rendszer és a hivatkozó ellenőrzése a kérés fejlécein múlik, ezért csak kényelmi célzásra használd, biztonsági ellenőrzésre ne.

Példa: egy elem csak bejelentkezett felhasználóknak jelenjen meg. Hozz létre egy feltételt, amely a felhasználó bejelentkezési állapotát ellenőrzi. Az elem csak akkor jelenik meg, ha az oldalt bejelentkezett felhasználó nézi. A vendégek, robotok és keresők nem látják, mert a forráskódban sincs ott.

## A feltételek jelzése

A szerkesztőben az elem panelfejlécében kiemelt **Feltételek** ikon azt jelzi, hogy az elemnek vannak feltételei, anélkül hogy meg kellene nyitnod a felületet. Ugyanez az ikon a **Szerkezet** panelen is látszik az elem mellett, így gyorsan átfuthatod az oldal feltételeit. Rákattintva közvetlenül az elem feltételeihez jutsz.

## Több feltétel együtt: ÉS és VAGY

A csoportok között VAGY, a csoporton belül ÉS kapcsolat van. Hozz létre egy második csoportot a jobb felső „+” ikonnal. Ha az új csoport feltétele az, hogy a bejegyzés címe „Fiók”, az elem akkor jelenik meg, ha (1) a felhasználó be van jelentkezve VAGY (2) a megtekintett oldal címe „Fiók”.

Ha egy csoporthoz még egy feltételt akarsz adni (ÉS kapcsolat), kattints az első feltétel jobb alsó sarkában lévő „+” gombra. Ekkor a feltételek között függőleges „ÉS”, a csoportok között vízszintes „VAGY” felirat jelenik meg, ami szemlélteti a logikát. Így megoldható például, hogy a bejelentkezett felhasználó regisztrációs dátuma 2022. január 1. előtt legyen.

### A közös feltételt minden csoportba vedd fel

A Bricks minden csoportot külön értékel ki. Egy csoporton belül az első nem teljesülő feltételnél megáll, és a következő csoportra lép. Az egyik csoportban lévő feltétel nem érvényes a többi csoportra. Ha egy követelmény minden esetben fennáll, add hozzá minden csoporthoz.

Példa: a „Receptkártya letöltése” gomb jelenjen meg bejelentkezett látogatóknak, vagy olyan receptnél, amely mindenkinek szabad, de csak ha a recepthez tényleg van kártyafájl:

- 1. csoport: A felhasználó bejelentkezési állapota „Bejelentkezett”, ÉS a `{acf_recipe_card}` dinamikus adat nem üres.
- 2. csoport: A `{acf_card_access}` dinamikus adat `==` `Everyone`, ÉS a `{acf_recipe_card}` dinamikus adat nem üres.

Ha a második csoportból kimarad a kártyaellenőrzés, a kártya nélküli ingyenes recepteknél is megjelenne a gomb.

## Tartalom megjelenítése csak kitöltött mezőnél

Egy bejegyzéssablonban gyakran vannak olyan szakaszok, amelyeket nem minden bejegyzés tölt ki (videó, letöltés, „A szakács tippje” doboz). Feltétel nélkül az üres mezőjű bejegyzéseknél is megjelenne a szakasz címsora és egy üres lejátszó vagy doboz.

Adj a szakaszhoz **Dinamikus adatok** feltételt, válaszd ki a mezőt, az összehasonlítást állítsd „nem üres”-re, az értéket hagyd üresen. A szakasz ekkor csak azoknál a bejegyzéseknél jelenik meg, ahol a mező tartalmaz valamit.

A **Dinamikus adatok** feltételnél az „üres” és a „nem üres” összehasonlítás érhető el. Azt vizsgálják, hogy a címke kimenete üres szöveg-e, ezért egy soha ki nem töltött mező ugyanúgy üresnek számít, mint egy kiürített. Az „üres” segítségével tartalék tartalmat mutathatsz azoknál a bejegyzéseknél, ahol nincs érték.

## Az összehasonlítások működése

- A `==` és a `!=` PHP-szerű laza összehasonlítást használ, és az összehasonlítás előtt átalakítja az olyan logikai jellegű értékeket, mint a `true`, `false`, `1`, `0` és az üres szöveg. A számszerű összehasonlítások (`>`, `<`, `>=`, `<=`) a feloldott értékeket közvetlenül hasonlítják.
- Többértékű mezőknél (felhasználói szerepkörök, bejegyzésállapotok, WooCommerce termékkategóriák és címkék) az „is” akkor igaz, ha bármelyik kiválasztott érték egyezik. Az „is not” akkor igaz, ha nincs egyezés.
- A „tartalmaz” és „nem tartalmaz” szövegvizsgálat, szöveges értékekhez való (bejegyzéscím, dinamikus adat kimenete, URL, hivatkozó). Mindkettő hamis, ha az ellenőrzött érték üres, ezért a „nem tartalmaz” feltétel elrejti az elemet azoknál a bejegyzéseknél, ahol a mezőnek nincs értéke. Ha ezeknél is látszódnia kell, adj hozzá külön csoportot „üres” feltétellel.
- Ha az összehasonlítást üresen hagyod, a feltétel `==`-t használ.

### Dinamikus adat összehasonlítása az értékkel

Egyes dinamikus adatmezők (például ACF igaz/hamis, Metabox jelölőnégyzet-lista, rádiógomb, legördülő) értékkel és címkével is rendelkeznek. Ha az értékhez akarsz hasonlítani, használd a `:value` szűrőt a dinamikus adat címkén. Ha például a Metabox jelölőnégyzet-listában a `blue` érték van kiválasztva, a feltétel a `:value` szűrővel az értékre teljesül. Szűrő nélkül a lehetőség címkéjével hasonlítana.

## WooCommerce pénztár- és rendelésfeltételek

Pénztár- és rendeléstudatos elrendezésekhez külön WooCommerce feltételek vannak:

- **Pénztár : Belépési lépés szükséges**
- **Pénztár : Szállítás szükséges**
- **Pénztár : Szállítási cím szükséges**
- **Pénztár : A rendelés állapota**
- **Rendelés : Szállítási cím szükséges**
- **Rendelés : Letöltéseket tartalmaz**

Használd őket a WooCommerce v2 pénztár, fizetés, köszönőoldal, rendelésnyugta, fiók „rendelés megtekintése” és más rendelésfüggő elrendezésekben, amikor egy tartalomnak csak adott pénztári vagy rendelési állapotnál kell megjelennie.

- **Pénztár : Belépési lépés szükséges:** csak kijelentkezett vásárlónál „Igen”, és csak akkor, ha a **WooCommerce → Beállítások → Fiókok és adatvédelem** alatt be van kapcsolva a bejelentkezés a pénztárnál. A Pénztár v2 többlépéses szerkezete ezzel tartja összhangban a fiókbejelentkezési menüpontot, lépést és a „Vissza” gombot.
- **Pénztár : Szállítás szükséges:** azt ellenőrzi, hogy a nem üres kosár tartalmaz-e szállítást igénylő terméket. Szállítási módokhoz és minden olyan Pénztár v2 szakaszhoz vagy lépéshez használd, amelyet a vásárlónak el kell érnie a szállítási mód kiválasztásához.
- **Pénztár : Szállítási cím szükséges:** azt ellenőrzi, kell-e külön szállítási cím. „Nem” lehet, ha a WooCommerce a szállítást a számlázási címhez kényszeríti, noha a kosár továbbra is szállítást igényel, és a vásárlónak ki kell választania a szállítási módot.

Pénztár v2 elrendezésnél a **Pénztár : Szállítás szükséges** feltételt a szállítási lehetőségek burkolóján alkalmazd. Többlépéses elrendezésben ugyanazt a feltételt add a Szállítás lépésre és a hozzá tartozó navigációs elemre is. A **Pénztár : Szállítási cím szükséges** feltételt csak a „Szállítás másik címre” vezérlőn és a szállítási címmezőkön használd.

### Rendelés visszavonása képernyő

Ha a haladó moduláris elemek és a WooCommerce rendelés-visszavonás be van kapcsolva, a Fiók oldal v2 visszavonási állapotában használhatod a „Rendelés visszavonása képernyő” feltételt. Hasonlítsd az **Adataid**, **Áttekintés** vagy **Megerősítés** értékhez az „is” vagy „is not” összehasonlítással. A generált szerkezet ezeket a feltételeket már tartalmazza. Csak a weboldali kimenetet vezérlik, a szerkesztőben mindhárom szakasz látszik.

## Fejlesztőknek: saját feltétel hozzáadása

Az elemfeltételek felületét programozottan bővítheted három szűrővel. Az eredmény egy új feltételcsoport és feltétel a szerkesztőben.

**1. lépés: feltételcsoport hozzáadása** a `bricks/conditions/groups` szűrővel. A csoport neve legyen egyedi (érdemes előtaggal ellátni).

```php
add_filter( 'bricks/conditions/groups', 'add_my_condition_group' );
function add_my_condition_group( $groups ) {
  $groups[] = [
    'name'  => 'my_group',
    'label' => esc_html__( 'My Group', 'my-plugin' ),
  ];

  return $groups;
}
```

**2. lépés: feltételek hozzáadása** a `bricks/conditions/options` szűrővel. A példa az aktuális oldal bejegyzéstípusát hasonlítja a felhasználó értékéhez: az összehasonlítás legördülő „is” és „is not” lehetőséggel, az érték szövegmező.

```php
add_filter( 'bricks/conditions/options', 'add_my_custom_condition' );
function add_my_custom_condition( $options ) {
  $options[] = [
    'key'     => 'my_post_type',
    'label'   => esc_html__( 'Post Type (New)', 'my-plugin' ),
    'group'   => 'my_group',
    'compare' => [
      'type'        => 'select',
      'options'     => [
        '==' => esc_html__( 'is', 'my-plugin' ),
        '!=' => esc_html__( 'is not', 'my-plugin' ),
      ],
      'placeholder' => esc_html__( 'is', 'my-plugin' ),
    ],
    'value'   => [
      'type' => 'text',
    ],
  ];

  return $options;
}
```

**3. lépés: a logika** a `bricks/conditions/result` szűrővel. Add vissza `true` vagy `false` értékkel a feltétel eredményét; az ÉS és VAGY kapcsolatot a Bricks kezeli. A `$condition` változóban elérhető az `compare` (az összehasonlító művelet, lehet üres) és a `value` (a felhasználó értéke, lehet üres).

```php
add_filter( 'bricks/conditions/result', 'run_my_custom_condition', 10, 3 );
function run_my_custom_condition( $result, $condition_key, $condition ) {
  if ( $condition_key !== 'my_post_type' ) {
    return $result;
  }

  $compare    = isset( $condition['compare'] ) ? $condition['compare'] : '==';
  $user_value = isset( $condition['value'] ) ? $condition['value'] : '';

  $condition_met     = false;
  $current_post_type = get_post_type();

  switch ( $compare ) {
    case '==':
      $condition_met = $current_post_type === $user_value;
      break;
    case '!=':
      $condition_met = $current_post_type !== $user_value;
      break;
  }

  return $condition_met;
}
```

Ha ugyanabba a csoportba több feltételt vettél fel, a `\Bricks\Conditions::$options` tömbben megkeresheted a regisztrált feltételt a kulcsa alapján, ellenőrizheted a csoportját, és kulcsonként `switch` segítségével futtathatod a saját logikádat.
