# Haladó használat

> Egyéni JavaScript-függvény feltételként, váltási típusok, a feltételek kézi lefuttatása, tudnivalók és ismert hibák.

## Egyéni JavaScript-függvény

Feltételként saját JavaScript-függvényt is használhatsz: az első paraméterbe a függvényhívást írd.

A JavaScript-fájlodban:

```js
function my_custom_callback() {
    return true;
}
```

A PHP-fájlodban:

```php
'visible' => [ 'my_custom_callback()', true ]
```

A függvény bármilyen értéket visszaadhat, és az összehasonlításhoz bármelyik operátort használhatod. Például ha a függvény egy tömböt ad vissza:

```js
function dummy_function() {
    return [ 'foo', 'bar', 'baz' ];
}
```

akkor a feltétel így szólhat:

```php
'hidden' => [ 'dummy_function()', 'contains', 'bar' ]
```

## Váltási típusok

Alapértelmezés szerint a bővítmény a jQuery `.show()` és `.hide()` metódusát használja, ami a CSS `display` tulajdonságnak felel meg. Ha három meződ van (A, B és C), alapból egymás alatt jelennek meg. A Columns kiegészítővel egymás mellett. Ha a B mező rejtve van, a C mező a B helyére ugrik.

Ha azt szeretnéd, hogy a rejtett mező helye üresen maradjon (A, üres hely, C), a CSS `visibility` tulajdonságra kell váltanod. Add hozzá a meta boxhoz a `toggle_type` beállítást:

```php
'toggle_type' => 'visibility',
```

Négy váltási típus áll rendelkezésre:

| Érték | Hatás |
|---|---|
| `display` | Az elem eltűnik, a helyét a következő elem foglalja el (alapértelmezett). |
| `visibility` | Az elem láthatatlan lesz, de a helye megmarad. |
| `slide` | Az elem animálva becsúszik, illetve kicsúszik. |
| `fade` | Az elem animálva elhalványul, illetve előtűnik. |

## A feltételek kézi lefuttatása

Ha kóddal módosítod egy mező értékét, a változásról nem keletkezik esemény, ezért a többi mezőre vonatkozó feltételek nem futnak le magukban. Ilyenkor JavaScriptből futtasd le őket:

```js
let $scope = $( '.scope' );
rwmb.runConditionalLogic( $scope );
```

A `.scope` annak a burkoló elemnek a választója, amely az érintett mezőket tartalmazza. Lehet egy mezőcsoport, egy tetszőleges `div`, vagy akár az egész oldal. A futtatás után a burkolón belüli mezők a többi mező aktuális értéke szerint jelennek meg vagy rejtődnek el.

## Include/Exclude, Show/Hide vagy Conditional Logic?

A meta boxok láthatóságát három Meta Box-kiegészítő is szabályozhatja: az **MB Include Exclude**, az **MB Show Hide** és az **MB Conditional Logic**. A fő különbség a működési módjukban van.

**MB Include Exclude (PHP-alapú):**

- A meta box teljesen kikerül a szerkesztőből, HTML sem készül belőle.
- Mivel nincsenek beviteli mezők, meta érték sem mentődik.
- Az oldal újratöltése nélkül nem lehet újra megjeleníteni.

**MB Conditional Logic és MB Show Hide (JavaScript-alapú):**

- A meta box HTML-je megjelenik, a mezők csak el vannak rejtve, ezért az értékeik mentéskor elküldődnek és az adatbázisba kerülnek.
- Az oldal újratöltése nélkül újra megjeleníthetők.

A Conditional Logic és a Show Hide közti különbség: a Conditional Logic nemcsak meta boxokat, hanem mezőket és tetszőleges HTML-elemeket is el tud rejteni, a Show Hide csak meta boxokat. A Conditional Logic több összehasonlítást is ismer (nagyobb, kisebb, nem egyenlő stb.).

## Tudnivalók

### Klónozható csoportok

Klónozható csoportnál a szabályok csak az adott klónon belül érvényesek. Nem működik olyan szabály, amely a csoporton kívüli mezőre hivatkozik: a szabály függő és vezérlő mezőjének is a csoport almezőjének kell lennie.

### Láncban rejtett mezők

Ha egy mező rejtve van, az attól függő mezők is rejtve maradnak, függetlenül az értékeiktől.

Például három mezőnél (A, B, C), ha a szabály ez:

```text
HA A = 1 VAGY B = 1, AKKOR C látszik
```

akkor ha az A vagy a B rejtve van, a C mindig rejtve marad, bármi is az A és a B értéke.

## Ismert hibák

A feltételes megjelenítés nem működik az **automatikus kiegészítés** (`autocomplete`) mezővel.
