# Egyedi ACF-mezőtípusok támogatása

> Hogyan taníthatod meg az importnak a saját fejlesztésű ACF-mezőtípusokat PHP-kóddal.

Az ACF lehetővé teszi saját mezőtípus létrehozását, ha olyan adatot kell tárolni és betölteni, amelyet a beépített típusok nem tudnak kezelni. Ez a fejezet fejlesztőknek szól: megmutatja, hogyan támogathatja az import az ilyen egyedi mezőtípust.

A példában egy `soflyy_field` nevű mezőtípust támogatunk. A kódrészleteket a gyermektéma `functions.php` fájljába, vagy egy kódrészlet-bővítménybe (például Code Snippets) teheted. A példában az osztályfájl és a nézetfájl egy kis saját bővítményben van, ennek gyökérmappáját a `MY_CUSTOM_PLUGIN_ROOT_DIR` állandó jelöli.

Három dologra van szükség: egy osztályra, ami az importálást végzi, egy szűrőre, ami betölti az osztályt, és egy nézetfájlra, ami a beviteli mezőt jeleníti meg a hozzárendelő oldalon.

## 1. lépés: az új osztály megírása

Az osztálynak a `pmai_acf_add_on\fields\Field` osztályból kell származnia. Kiindulásnak használhatod az ingyenes ACF-importáló `FieldText` osztályát (`csv-xml-import-for-acf/src/fields/acf/FieldText.php`). Az osztályban legalább ezek legyenek:

- a `$type` tulajdonság (a mezőtípus azonosítója),
- a `parse` metódus,
- az `import` metódus.

```php
namespace wpai_acf_add_on_pro\fields\acf;

use pmai_acf_add_on\ACFService;
use pmai_acf_add_on\fields\Field;

class FieldSoflyyField extends Field {

    // A mezőtípus azonosítója
    public $type = 'soflyy_field';

    // A mező adatainak feldolgozása
    public function parse($xpath, $parsingData, $args = array()) {
        parent::parse($xpath, $parsingData, $args);
        $values = $this->getByXPath($xpath);
        $this->setOption('values', $values);
    }

    // A mentés: az importáláskor ez a metódus fut
    public function import($importData, $args = array()) {
        $isUpdated = parent::import($importData, $args);
        if (!$isUpdated){
            return FALSE;
        }
        ACFService::update_post_meta($this, $this->getPostID(), $this->getFieldName(), $this->getFieldValue());
    }
}
```

Importáláskor az osztály `import` metódusa menti el az egyedi mezőtípus értékét.

## 2. lépés: az osztály betöltése

A `wp_all_import_acf_field_class` szűrővel töltsd be az osztályt. A szűrő a mezőadat `type` értéke alapján dönt: a saját típusodnál a saját osztály nevét adja vissza, minden másnál az eredeti értéket.

```php
function my_soflyy_field( $class , $fieldData, $post, $fieldName, $fieldParent ) {
    if ($fieldData['type'] == 'soflyy_field'){
        // Betöltés, ha az osztály még nincs definiálva
        if (!class_exists('\wpai_acf_add_on_pro\fields\acf\FieldSoflyyField')) {
            require_once MY_CUSTOM_PLUGIN_ROOT_DIR . '/classes/FieldSoflyyField.php';
        }
        return '\wpai_acf_add_on_pro\fields\acf\FieldSoflyyField';
    } else {
        return $class;
    }
}
add_filter( 'wp_all_import_acf_field_class', 'my_soflyy_field', 10, 5 );
```

A visszaadott osztálynak már definiálva kell lennie, mert a bővítmény csak azt ellenőrzi, hogy létezik-e, és példányosítja. A fájlt magától nem tölti be.

## 3. lépés: a nézet megadása a hozzárendelő oldalon

A nézetfájl azt a beviteli mezőt tartalmazza, amely a **Húzás és ejtés** oldalon megjelenik, amikor ezt a mezőtípust rendeled hozzá. A példában a `SoflyyField.php` nézetfájl:

```php
<input
    type="text"
    placeholder=""
    value="<?php echo esc_attr( $current_field );?>"
    name="fields<?php echo $field_name;?>[<?php echo $field['key'];?>]"
    class="text widefat rad4"/>
```

A fájl útvonalát a `wp_all_import_acf_field_view_path_<mezőtípus>` szűrővel add meg. A szűrő neve dinamikus: a példában a `soflyy_field` helyére a saját mezőtípusod azonosítóját kell írnod.

```php
function my_path_soflyy_field( $filePath, $field ) {
    $customFile = MY_CUSTOM_PLUGIN_ROOT_DIR . '/views/SoflyyField.php';
    return $customFile;
}
add_filter( 'wp_all_import_acf_field_view_path_soflyy_field', 'my_path_soflyy_field', 10, 2 );
```

Ha minden kód a helyén van, a hozzárendelő oldalon megjelenik az egyedi mezőtípus beviteli mezője.

## További szűrők

Ezekkel még pontosabban szabályozhatod az egyedi mezőtípus megjelenését.

| Szűrő | Mire való |
|---|---|
| `wp_all_import_acf_field_view_dir_<mezőtípus>` | Megadja a fejléc és a lábléc fájljainak helyét az olyan mezőknél, amelyeknek ACF 4 és ACF 5 változata is van (például jelölőnégyzet). Nem kötelező. A fájlnevek: `header.php` és `footer.php`. |
| `wp_all_import_acf_field_template_header_path<mezőtípus>` | Az előző verziófüggő fejléc előtt megjelenő fejléc. Csak akkor kell, ha az alapértelmezett fejléc nem megfelelő. |
| `wp_all_import_acf_field_template_footer_path<mezőtípus>` | Az előző verziófüggő lábléc után megjelenő lábléc. Csak akkor kell, ha az alapértelmezett lábléc nem megfelelő. |
| `wp_all_import_acf_field_field` | A `$fieldData['type']` érték alapján dönthetsz, hogy felülírod-e az alapértelmezettet, és a saját mezőobjektumot adod vissza, ha nem akarod az osztálybetöltő szűrőt használni. |

Mindkét megoldásnál (osztály vagy mezőobjektum) szükség van egy olyan osztályra, amely megvalósítja a szükséges metódusokat és tulajdonságokat, és a `pmai_acf_add_on\fields\Field` osztályból származik.
