# Dinamikus kitöltés: a bejegyzés szerzője és a legördülő lista

> Két kódpélda: a bejegyzés szerzőjének e-mail-címe egy mezőbe, és a legördülő lista, rádiógomb vagy többválasztós mező választékának feltöltése bejegyzésekkel.

Ez a fejezet két kódos példát mutat a dinamikus kitöltésre. Ha még nem ismered a dinamikus kitöltés alapjait, előbb olvasd el a [Mező dinamikus kitöltése](https://hub.hellowp.io/hu/plugins/gravityforms/hogyan-dinamikus-kitoltes/) fejezetet. A kódok helyéről a [Hová tedd a kódrészleteket?](https://hub.hellowp.io/hu/plugins/gravityforms/hogyan-hova-keruljon-a-kod/) fejezet szól.

## A bejegyzés szerzőjének kitöltése

Az első példa azt mutatja meg, hogyan töltheted ki egy mezőbe annak a bejegyzésnek a szerzői e-mail-címét, amelyben az űrlap megjelenik.

```php
add_filter( 'gform_field_value_author_email', 'populate_post_author_email' );
function populate_post_author_email( $value ) {
    global $post;

    $author_email = get_the_author_meta( 'email', $post->post_author );

    return $author_email;
}
```

A kódot másold be az aktív sablon `functions.php` fájljába, egy saját funkcióbővítménybe vagy egy saját kiegészítőbe.

### Hogyan működik?

A függvényt a `gform_field_value_author_email` szűrőhöz kapcsoljuk. Amikor a Gravity Forms megjeleníti az űrlapot az oldalon, meghívja a függvényt, és a visszaadott értéket beírja a mezőbe.

Honnan tudja, melyik mezőt töltse ki? A mező dinamikus kitöltési paraméterneve alapján: a szűrő nevének utolsó része (itt `author_email`) a paraméternév. Ugyanazt a paraméternevet több mezőnél is használhatod, és a kód mindet kitölti.

A függvényben a `$post` globális objektumból elérjük a jelenlegi bejegyzés szerzőjének azonosítóját (`post_author`), majd a WordPress `get_the_author_meta` függvényével lekérjük a szerző e-mail-címét. A visszaadott értéket a Gravity Forms automatikusan beírja a mezőbe.

### Csak adminisztrátornak látható mező

Elképzelhető, hogy a mező szépen kitöltődik, de az első kipróbáláskor kiderül, hogy a szerző e-mail-címe belekerül az értesítő e-mail `{all_fields}` címkéjébe, te viszont azt szeretnéd, hogy csak a rendszergazda lássa. Ilyenkor:

1. állítsd a mező láthatóságát **Adminisztratív** értékre;
2. cseréld az összefűző címkét `{all_fields:noadmin}` címkére.

Így a mező nem jelenik meg az alapértelmezett értesítő e-mailekben. Ha a mezőn be van kapcsolva a dinamikus kitöltés, az űrlap megjelenítésekor rejtett mezőként szerepel; ha nincs bekapcsolva, egyáltalán nem jelenik meg.

## Legördülő lista, rádiógomb és többválasztós mező kitöltése

A legördülő lista dinamikus kitöltése gyakori igény termékválasztó űrlapoknál, termékopciós űrlapoknál, vagy ha egy korábbi beküldések alapján kell a későbbi gyűjtőmező választéka. Ez a példa egyedi kóddal jeleníti meg a már meglévő bejegyzések listáját legördülő lista választékaként. Ha nem szeretnél kódolni, vagy bonyolultabb képesség kell, keress külső megoldást a bővítménytárakban és a közösségi kiegészítők között.

A példában a látogató a dinamikusan előállított listából választja ki a kedvenc bejegyzését.

A dinamikus kitöltés nem működik, ha az oldal, amelyen az űrlap van, gyorsítótárazott. Ez a gyorsítótár következménye, nem a Gravity Forms korlátja. A témáról a [Gyorsítótár és szkript-optimalizáló](https://hub.hellowp.io/hu/plugins/gravityforms/hogyan-gyorsitotar-es-szkript-optimalizalo/) fejezet szól.

### A kód

```php
add_filter( 'gform_pre_render_123', 'populate_posts' );
add_filter( 'gform_pre_validation_123', 'populate_posts' );
add_filter( 'gform_pre_submission_filter_123', 'populate_posts' );
add_filter( 'gform_admin_pre_render_123', 'populate_posts' );
function populate_posts( $form ) {

    foreach ( $form['fields'] as &$field ) {

        if ( $field->type != 'select' || strpos( $field->cssClass, 'populate-posts' ) === false ) {
            continue;
        }

        // Itt további paraméterekkel módosíthatod, mely bejegyzéseket kéri le
        $posts = get_posts( 'numberposts=-1&post_status=publish' );

        $choices = array();

        foreach ( $posts as $post ) {
            $choices[] = array(
                'text' => esc_html( $post->post_title ),
                'value' => $post->post_title
            );
        }

        // A „Válassz bejegyzést” szöveget cseréld a kívánt útmutató opcióra
        $field->placeholder = 'Válassz bejegyzést';
        $field->choices = $choices;

    }

    return $form;
}
```

A kódot a sablon `functions.php` fájljába kell illeszteni. A `123` az űrlap azonosítója: cseréld a sajátodéra ([Űrlap azonosítója](https://hub.hellowp.io/hu/plugins/gravityforms/hogyan-urlap-azonosito/)).

### A négy szűrő

A kód négy szűrőt használ, hogy a mező minden helyzetben helyesen legyen kitöltve:

| Szűrő | Mire való |
|---|---|
| `gform_pre_render` | A választék feltöltése, amikor az űrlap megjelenik a frontenden. |
| `gform_pre_validation` | A választék elérhetővé tétele az ellenőrzés idején. |
| `gform_pre_submission_filter` | A választék megőrzése a beküldés feldolgozásakor. |
| `gform_admin_pre_render` | A választék feltöltése, amikor a beküldést az admin felületen nézed. |

Az űrlapspecifikus `gform_pre_validation` szűrő az 1.9-es kiadástól létezik.

### Az egyedi szűrőfüggvény

A példában a függvény neve `populate_posts`. Mivel a Gravity Forms hívja a szűrőkből, paraméterként megkapja az `$form` űrlapobjektumot. Ezt módosítjuk, és a végén visszaadjuk.

### Végiglépés a mezőkön

```php
foreach ( $form['fields'] as &$field ) { ... }
```

Az űrlapobjektumból végigmegyünk a mezőkön, és megkeressük azokat, amelyeket módosítani akarunk. A `&$field` jelölés a mezőt hivatkozásként adja át, így a tényleges mezőobjektumot módosítjuk, nem egy másolatot.

```php
if ( $field->type != 'select' || strpos( $field->cssClass, 'populate-posts' ) === false ) {
    continue;
}
```

Csak a legördülő listákat (`select`) módosítjuk, amelyeknek van `populate-posts` CSS-osztálya. A mezőt azonosító alapján is megkereshetnénk, de akkor az űrlap változtatásakor a kódot is módosítani kellene. A CSS-osztállyal közvetlenül a Gravity Forms admin felületén jelölheted ki a célmezőt. Ha az aktuális mező nem legördülő lista, vagy nincs meg az osztálya, kihagyjuk.

### A bejegyzések lekérése

```php
$posts = get_posts( 'numberposts=-1&post_status=publish' );
```

A `get_posts()` WordPress-függvény a megadott paraméterek szerint ad vissza bejegyzéseket. Bármilyen bejegyzéstípust lekérhetsz, egyedit is, a `post_type` paraméterrel:

```php
$posts = get_posts( 'post_type=event&numberposts=-1&post_status=publish' );
```

Kategória (taxonómia) szerint is szűrhetsz:

```php
$posts = get_posts( array(
    'post_type' => 'product',
    'numberposts' => -1,
    'post_status' => 'publish',
    'tax_query' => array(
        array(
            'taxonomy' => 'product_category',
            'field' => 'slug',
            'terms' => 'featured'
        )
    )
) );
```

### A választék tömbjének összeállítása

A Gravity Forms a több választási lehetőséget tartalmazó mezőknél (például a legördülő listánál) a mező `choices` tulajdonságában tárolja a választékot, amely lehetőségek tömbje. Egy lehetőség tulajdonságai:

| Tulajdonság | Jelentés |
|---|---|
| `text` | Amit a felhasználó lát a legördülő listában. |
| `value` | Amit a Gravity Forms eltárol. |
| `isSelected` | Ki van-e jelölve a lehetőség. |
| `price` | Csak termékmezőknél. |

A példában csak a `text` és a `value` kell.

```php
$choices = array();
```

Először létrehozunk egy tömböt a lehetőségeknek.

```php
foreach ( $posts as $post ) {
    $choices[] = array(
        'text' => esc_html( $post->post_title ),
        'value' => $post->post_title
    );
}
```

Ezután végigmegyünk a lekért bejegyzéseken, és mindegyikből egy lehetőséget készítünk. A `text` a bejegyzés címe, biztonsági okból `esc_html()`-be csomagolva; a `value` ugyanaz a cím. Ha a kiválasztott bejegyzés azonosítóját szeretnéd gyűjteni, a `$post->post_title` helyett `$post->ID` kell. A kedvenc bejegyzés rögzítéséhez a cím elég.

```php
$field->choices = $choices;
```

A ciklus végén a kész `$choices` tömböt hozzárendeljük a mező `choices` tulajdonságához.

### Helykitöltő lehetőség

```php
$field->placeholder = 'Válassz bejegyzést';
```

A legördülő lista első lehetősége legyen útmutató szöveg, például „Válassz bejegyzést”. Ezt a mező `placeholder` tulajdonságával adod meg. A megjelenített listában a helykitöltő lehetőség értéke üres. Ha a mező kötelező, a látogatónak ettől eltérő lehetőséget kell választania, különben ellenőrzési hibát kap.

### Jelölőnégyzetek

A jelölőnégyzetek is kitölthetők dinamikusan, de több kezelés kell, mert szerkezetük beviteli mezők és lehetőségek csoportja: a `choices` mellett az `inputs` tulajdonsággal is dolgozni kell. A folyamat hasonló.
