# Egyedi automatizálás-cél (mérföldkő)

> Saját cél (benchmark) regisztrálása PHP-ból, amellyel az automatizálás a saját eseményedre léphet tovább.

A cél (más néven mérföldkő, benchmark) olyan különleges automatizálás-lépés, amely akkor teljesül, ha egy feltétel igazzá válik. Tipikus példák:

- új rendelés teljesült,
- lista hozzárendelve,
- címke hozzárendelve.

Ha egy cél teljesül, a FluentCRM a kapcsolattartót előreugrathatja az adott lépésre, kihagyhatja a köztes műveleteket, vagy a beállításaid szerint folytathatja. Egyedi céllal a saját bővítményed eseményeit is bekötheted.

## Használt kampók

| Típus | Kampó neve | Mire való |
|---|---|---|
| Filter | `fluentcrm_funnel_blocks` | Felveszi az egyedi cél blokkját a szerkesztőbe. |
| Filter | `fluentcrm_funnel_block_fields` | Megadja a cél beállítómezőit. |
| Action | `fluentcrm_funnel_benchmark_start_{benchmark_name}` | Lefuttatja a logikádat, amikor a cél teljesül. A `{benchmark_name}` helyére a saját azonosítód kerül. |

A példában a cél azonosítója `custom_benchmark`, a futásidejű kampó tehát `fluentcrm_funnel_benchmark_start_custom_benchmark`.

## 1. lépés: a cél osztálya

Hozz létre egy PHP-osztályt (például `Custom\Goals\CustomBenchmark`), amely:

- regisztrálja a cél blokkját,
- megadja a beállítómezőket,
- kezeli az eseményt, amikor a cél teljesül.

```php
<?php

namespace Custom\Goals;

use FluentCrm\App\Services\Funnel\BaseBenchMark;
use FluentCrm\App\Services\Funnel\FunnelHelper;
use FluentCrm\App\Services\Funnel\FunnelProcessor;
use FluentCrm\Framework\Support\Arr;

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

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

        // 1) A cél blokkjának felvétele a szerkesztőbe
        add_filter(
            'fluentcrm_funnel_blocks',
            [$this, 'addBenchmark'],
            $this->priority,
            1
        );

        // 2) A cél beállítómezői
        add_filter(
            'fluentcrm_funnel_block_fields',
            [$this, 'pushBlockFields'],
            $this->priority,
            2
        );

        // 3) A cél kezelése, amikor elindul
        add_action(
            'fluentcrm_funnel_benchmark_start_' . $this->triggerName,
            [$this, 'handle'],
            $this->priority,
            2
        );
    }

    /**
     * A cél blokkjának regisztrálása.
     */
    public function addBenchmark($benchmarks)
    {
        $benchmark = $this->getBlock();
        if ($benchmark) {
            $benchmark['type']              = 'benchmark';
            $benchmarks[$this->triggerName] = $benchmark;
        }

        return $benchmarks;
    }

    /**
     * A beállítómezők hozzárendelése a célhoz.
     */
    public function pushBlockFields($fields, $funnel)
    {
        $fields[$this->triggerName] = $this->getBlockFields($funnel);

        return $fields;
    }

    /**
     * Példa a cél típusát megadó mezőre.
     */
    public function benchmarkTypeField()
    {
        return [
            'label'       => 'Cél típusa',
            'type'        => 'radio',
            'options'     => [
                [
                    'id'    => 'optional',
                    'title' => '[Választható pont] Ez egy nem kötelező indítási pont'
                ],
                [
                    'id'    => 'required',
                    'title' => '[Alapvető pont] Ennek a lépésnek teljesülnie kell a további műveletek előtt'
                ],
            ],
            'inline_help' => 'Ha a [Választható pont] lehetőséget választod, nem kötelező indítópontként működik; egyébként az automatizálás megvárja, amíg ez teljesül.',
        ];
    }

    /**
     * A blokk alapadatai és alapértelmezett beállításai.
     */
    public function getBlock()
    {
        return [
            'title'       => 'Egyedi cél',
            'description' => 'Akkor fut, amikor egy adott rendelés teljesül a rendszeredben',
            'icon'        => 'fc-icon-edd',
            'settings'    => $this->getDefaultSettings(),
        ];
    }

    /**
     * A cél alapértelmezett beállításai.
     */
    public function getDefaultSettings()
    {
        return [
            'product_ids'        => [],
            'product_categories' => [],
            'purchase_type'      => 'all',
            'type'               => 'required',
        ];
    }

    /**
     * A cél beállítópaneljének mezői.
     */
    public function getBlockFields($funnel)
    {
        return [
            'title'     => 'Sikeres új rendelés az EDD-ben',
            'sub_title' => 'A cél akkor fut, amikor egy új rendelés teljesül az EDD-ben',
            'fields'    => [
                'product_ids' => [
                    'type'        => 'multi-select',
                    'label'       => 'Célzott termékek',
                    'help'        => 'Válaszd ki, mely termékek teljesítik ezt a célt.',
                    'options'     => [
                        ['id' => 123, 'title' => 'Első minta termék'],
                        ['id' => 124, 'title' => 'Második minta termék'],
                    ],
                    'inline_help' => 'Hagyd üresen, ha bármelyik termék megvásárlása számítson.',
                ],
                // Itt további mezőket is felvehetsz (kategóriák, vásárlás típusa, cél típusa stb.)
            ],
        ];
    }

    /**
     * A fő kezelő, amely a cél elindulásakor fut.
     *
     * @param object $benchmark    A cél lépésének aktuális beállításai.
     * @param array  $originalArgs Az eseménynek átadott argumentumok.
     */
    public function handle($benchmark, $originalArgs)
    {
        // Ide jön a saját logikád arra az esetre, amikor a cél teljesül.
        error_log(print_r([$benchmark, $originalArgs], true));
    }
}
```

A `pushBlockFields()` metódus adja vissza a beállítópanel szerkezetét az automatizálás-szerkesztőhöz, a `handle()` pedig akkor hívódik meg, amikor a cél teljesül, így te valósíthatod meg a saját célkezelő logikádat. A „Célzott termékek” mező a `getBlockFields()` leírásból készül; 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; szokásos hely a `plugins_loaded` kampó:

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

Ezután:

1. Az „Egyedi cél” blokk megjelenik az automatizálás-szerkesztő céllistájában.
2. A blokk beállításaiban megadhatod a célzott termékeket és a többi opciót.
3. Amikor az egyedi esemény bekövetkezik és a cél teljesül, a FluentCRM a `fluentcrm_funnel_benchmark_start_custom_benchmark` kampón át meghívja a `handle()` metódusodat, így a saját célfeltételeid alapján léptetheted tovább a kapcsolattartókat az automatizálásban.
