# Egyedi automatizálás-indítóesemény

> Saját indítóesemény regisztrálása PHP-ból, hogy a bővítményed eseményei elindíthassanak egy automatizálást.

Az automatizálás indítóeseménye (trigger) adja meg, mikor induljon el egy automatizálás. A FluentCRM sok beépített indítóeseményt ad (elsődleges, kereskedelmi, tagsági és tanulásmenedzsment-indítók). Ha a saját bővítményed eseményéhez, például egy egyedi regisztrációhoz vagy vásárláshoz kell automatizálás, regisztrálhatsz saját indítóeseményt, és elsüthetsz, amikor az esemény bekövetkezik.

## Használt kampók

| Típus | Kampó neve | Mire való |
|---|---|---|
| Filter | `fluentcrm_funnel_triggers` | Felveszi az indítóeseményt a globális listára, így megjelenik az automatizálás-szerkesztőben. |
| Filter | `fluentcrm_funnel_editor_details_{trigger_name}` | Megadja az indítóesemény beállításainak és feltételeinek szerkezetét. A `{trigger_name}` helyére a saját azonosítód kerül. |
| Action | `fluentcrm_funnel_start_{trigger_name}` | A FluentCRM indítja, amikor a beállítások és feltételek alapján az indítóeseménynek futnia kell. Ide kerül az üzleti logikád. |

A példában az indítóesemény azonosítója `my_plugin_registration`, vagyis a kampók:

- `fluentcrm_funnel_editor_details_my_plugin_registration`
- `fluentcrm_funnel_start_my_plugin_registration`

## 1. lépés: az indítóesemény osztálya

Hozz létre egy PHP-osztályt (például `Custom\Triggers\CustomTrigger`), amely tartalmazza az indítóesemény leírását, a szerkesztőmezőket és a kezelőlogikát.

```php
<?php

namespace Custom\Triggers;

class CustomTrigger
{
    protected $triggerName;
    protected $priority;
    protected $actionArgNum;

    public function __construct()
    {
        $this->triggerName  = 'my_plugin_registration';
        $this->priority     = 20;
        $this->actionArgNum = 2;

        // 1) Az indítóesemény felvétele a listára
        add_filter(
            'fluentcrm_funnel_triggers',
            [$this, 'addTrigger'],
            $this->priority,
            1
        );

        // 2) A szerkesztő beállításai
        add_filter(
            'fluentcrm_funnel_editor_details_' . $this->triggerName,
            [$this, 'prepareEditorDetails'],
            10,
            1
        );

        // 3) Az indítóesemény kezelése
        add_action(
            'fluentcrm_funnel_start_' . $this->triggerName,
            [$this, 'handle'],
            10,
            2
        );
    }

    /**
     * Az indítóesemény alapadatai a listához.
     */
    public function getTrigger()
    {
        return [
            'category'    => __('My-plugin'),
            'label'       => __('My-plugin'),
            'description' => __(
                'Az automatizálás a My-plugin regisztrációjának befejezésekor indul'
            ),
            'icon'        => 'fc-icon-wp_new_user_signup',
        ];
    }

    /**
     * Az indítóesemény hozzáadása a FluentCRM nyilvántartásához.
     */
    public function addTrigger($triggers)
    {
        $triggers[$this->triggerName] = $this->getTrigger();

        return $triggers;
    }

    /**
     * Az indítóesemény beállítómezői.
     */
    public function getSettingsFields($funnel)
    {
        return [
            'title'     => __('My-plugin regisztráció'),
            'sub_title' => __(
                'Az automatizálás a My-plugin regisztrációjának befejezésekor indul'
            ),
            'fields'    => [
                'message' => [
                    'type'        => 'input-text',
                    'label'       => __('Üzenet címe'),
                    'placeholder' => __('Írd be az üzenet címét'),
                ],
                'description' => [
                    'type'  => 'html',
                    'label' => 'Leírás',
                    'info'  => '<b>' . __(
                        'Ez az üzenet hozzáadódik a felhasználóhoz, de címet kell adni neki'
                    ) . '</b>',
                ],
            ],
        ];
    }

    /**
     * A teljes szerkesztő-objektum, amelyet a FluentCRM vár.
     */
    public function prepareEditorDetails($funnel)
    {
        $funnel->settings = wp_parse_args(
            $funnel->settings,
            $this->getFunnelSettingsDefaults()
        );
        $funnel->settingsFields = $this->getSettingsFields($funnel);
        $funnel->conditions = wp_parse_args(
            $funnel->conditions,
            $this->getFunnelConditionDefaults($funnel)
        );
        $funnel->conditionFields = $this->getConditionFields($funnel);

        return $funnel;
    }

    /**
     * A „Beállítások” rész alapértékei.
     */
    public function getFunnelSettingsDefaults()
    {
        return [
            'subscription_status' => 'subscribed',
        ];
    }

    /**
     * A „Feltételek” rész mezői.
     */
    public function getConditionFields($funnel)
    {
        return [
            'update_type' => [
                'type'    => 'radio',
                'label'   => __('Ha a kapcsolattartó már létezik?', 'fluent-crm'),
                'help'    => __(
                    'Add meg, mi történjen, ha a feliratkozó már szerepel az adatbázisban',
                    'fluent-crm'
                ),
                'options' => $this->getUpdateOptions(),
            ],
            'user_roles' => [
                'type'        => 'multi-select',
                'is_multiple' => true,
                'label'       => __('Célzott felhasználói szerepkörök', 'fluent-crm'),
                'help'        => __(
                    'Válaszd ki, mely szerepkörök regisztrációja indítsa az automatizálást',
                    'fluent-crm'
                ),
                'placeholder' => __('Válassz szerepköröket', 'fluent-crm'),
                'options'     => $this->getUserRoles(),
                'inline_help' => __(
                    'Hagyd üresen, ha minden szerepkörre fusson',
                    'fluent-crm'
                ),
            ],
            'run_multiple' => [
                'type'        => 'yes_no_check',
                'label'       => '',
                'check_label' => __(
                    'Az automatizálás többször is induljon újra ugyanannak a kapcsolattartónak ennél az eseménynél (csak akkor kapcsold be, ha ezt szeretnéd)'
                ),
                'inline_help' => __(
                    'Bekapcsolva újraindul az automatizálás, ha a kapcsolattartó már benne van. Egyébként kihagyja.',
                    'fluent-crm'
                ),
            ],
        ];
    }

    /**
     * A feltételmezők alapértékei.
     */
    public function getFunnelConditionDefaults($funnel)
    {
        return [
            'update_type'  => 'update', // másik lehetőség: skip_all_if_exist, skip_update_if_exist
            'user_roles'   => $this->getUserRoles(),
            'run_multiple' => 'yes',
        ];
    }

    /**
     * Az „update_type” rádiómező lehetőségei.
     */
    public function getUpdateOptions()
    {
        return [
            [
                'id'    => 'update',
                'title' => __('Frissítés, ha létezik', 'fluent-crm'),
            ],
            [
                'id'    => 'skip_all_if_exist',
                'title' => __(
                    'Az automatizálás kihagyása, ha a kapcsolattartó már létezik',
                    'fluent-crm'
                ),
            ],
        ];
    }

    /**
     * A szerkeszthető WordPress-szerepkörök a FluentCRM által várt formában.
     */
    public function getUserRoles($keyed = false)
    {
        if (!function_exists('get_editable_roles')) {
            require_once ABSPATH . 'wp-admin/includes/user.php';
        }

        $roles          = get_editable_roles();
        $formattedRoles = [];

        foreach ($roles as $roleKey => $role) {
            if ($keyed) {
                $formattedRoles[$roleKey] = $role['name'];
            } else {
                $formattedRoles[] = [
                    'id'    => $roleKey,
                    'title' => $role['name'],
                ];
            }
        }

        return $formattedRoles;
    }

    /**
     * A fő kezelő, amely az indítóesemény elsülésekor fut.
     *
     * @param \FluentCrm\App\Models\Funnel $funnel
     * @param array                        $originalArgs Az eseménynek átadott argumentumok.
     */
    public function handle($funnel, $originalArgs)
    {
        // Ide jön a saját logikád.
        error_log(print_r([$funnel, $originalArgs], true));
    }
}
```

A `prepareEditorDetails()` metódus azt az objektumot adja vissza, amelyből a FluentCRM az indítóesemény beállítás- és feltételpaneljét kirajzolja az automatizálás-szerkesztőben. A beállítómezők a `getSettingsFields()` leírásból készülnek; további mezőtípusokat az [Űrlapmezők kódszerkezete](https://hub.hellowp.io/hu/plugins/fluentcampaign-pro/fejlesztoknek-mezok-szerkezete/) fejezetben találsz.

## 2. lépés: az osztály regisztrálása

Az osztályt akkor példányosítsd, amikor a FluentCRM Pro már betöltődött. Erre a `plugins_loaded` akció a szokásos hely:

```php
add_action('plugins_loaded', function () {
    if (defined('FLUENTCAMPAIGN_DIR_FILE')) {
        new \Custom\Triggers\CustomTrigger();
    }
});
```

Ezután:

1. A My-plugin indítóesemény megjelenik az automatizálás indítóeseményeinek listájában.
2. Az automatizálás-szerkesztőben beállíthatod a beállításait és a feltételeit.
3. Amikor az egyedi eseményed bekövetkezik, és meghívod a megfelelő FluentCRM-függvényeket, a FluentCRM lefuttatja a `fluentcrm_funnel_start_my_plugin_registration` akciót és a `handle()` metódusodat, amellyel elindíthatod és irányíthatod az automatizálást.
