# Egyedi automatizálás-művelet

> Saját művelet regisztrálása PHP-ból, amelyet az automatizálás-szerkesztőben a beépített blokkokhoz hasonlóan lehet használni.

A műveletek az automatizálás lépései, amelyek valamit elvégeznek: például kapcsolattartó-tulajdonságot frissítenek, webhookot küldenek vagy A/B-tesztet osztanak szét. Saját műveletet is felvehetsz (például jegyzet küldése külső rendszerbe, API-hívás vagy egyedi adatok frissítése), amelyet az automatizálás-szerkesztőben ugyanúgy húzhatsz be, mint a beépítetteket.

## Használt kampók

| Típus | Kampó neve | Mire való |
|---|---|---|
| Filter | `fluentcrm_funnel_blocks` | Felveszi az egyedi blokkot a műveletek listájára. |
| Filter | `fluentcrm_funnel_block_fields` | Megadja a beállítómezőket, amelyek a blokk kijelölésekor látszanak. |
| Action | `fluentcrm_funnel_sequence_handle_{action_name}` | Lefuttatja a logikádat, amikor a művelet fut. Az `{action_name}` helyére a saját azonosítód kerül. |

A példában a művelet azonosítója `custom_action_name`, a futásidejű kampó tehát `fluentcrm_funnel_sequence_handle_custom_action_name`.

## 1. lépés: a művelet osztálya

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

- regisztrálja a művelet blokkját (`pushBlock`),
- megadja a blokk mezőit (`getBlockFields`),
- kezeli a végrehajtást (`handle`).

```php
<?php

namespace Custom\Actions;

class CustomAction
{
    protected $actionName;
    protected $priority;
    protected $funnel;

    public function __construct()
    {
        $this->actionName = 'custom_action_name';
        $this->priority   = 99;

        // 1) A blokk felvétele a szerkesztőbe
        add_filter(
            'fluentcrm_funnel_blocks',
            [$this, 'pushBlock'],
            $this->priority,
            2
        );

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

        // 3) A művelet kezelése futáskor
        add_action(
            'fluentcrm_funnel_sequence_handle_' . $this->actionName,
            [$this, 'handle'],
            10,
            4
        );
    }

    /**
     * A blokk regisztrálása az automatizálás-szerkesztőben.
     */
    public function pushBlock($blocks, $funnel)
    {
        $this->funnel = $funnel;

        $block = $this->getBlock();
        if ($block) {
            $block['type']             = 'action';
            $blocks[$this->actionName] = $block;
        }

        return $blocks;
    }

    /**
     * A blokk beállítómezőinek regisztrálása.
     */
    public function pushBlockFields($fields, $funnel)
    {
        $this->funnel = $funnel;

        $fields[$this->actionName] = $this->getBlockFields();

        return $fields;
    }

    /**
     * A blokk alapadatai és alapértelmezett beállításai.
     */
    public function getBlock()
    {
        return [
            'category'    => 'My-plugin',
            'title'       => 'My-plugin jegyzet hozzáadása',
            'description' => 'Jegyzet hozzáadása a My-pluginhoz',
            'icon'        => 'fc-icon-writing',
            'settings'    => [
                'note'      => '',
                'note_type' => 'private',
            ],
        ];
    }

    /**
     * A művelet beállítópaneljének mezői.
     */
    public function getBlockFields()
    {
        $formattedOptions = [
            [
                'id'    => 'private',
                'title' => 'Privát jegyzet',
            ],
            [
                'id'    => 'customer',
                'title' => 'Jegyzet a vásárlónak',
            ],
        ];

        return [
            'title'     => 'My-plugin jegyzet hozzáadása',
            'sub_title' => 'Jegyzet hozzáadása a kapcsolódó My-plugin rendeléshez',
            'fields'    => [
                'note' => [
                    'type'       => 'input-text-popper',
                    'field_type' => 'textarea',
                    'label'      => 'My-plugin jegyzet',
                    'help'       => 'Írd be a jegyzetet, amelyet a rendeléshez adsz. Okoskódokat is használhatsz.',
                ],
                'note_type' => [
                    'type'    => 'radio',
                    'label'   => 'Jegyzet típusa',
                    'help'    => 'Válaszd ki, hogyan legyen eltárolva a jegyzet a rendelésnél.',
                    'options' => $formattedOptions,
                ],
            ],
        ];
    }

    /**
     * A fő kezelő, amely a lépés végrehajtásakor fut.
     *
     * @param \FluentCrm\App\Models\Subscriber $subscriber
     * @param object                           $sequence
     * @param int                              $funnelSubscriberId
     * @param object                           $funnelMetric
     */
    public function handle($subscriber, $sequence, $funnelSubscriberId, $funnelMetric)
    {
        // Ide jön a saját integrációs logikád.
        error_log(print_r(
            [$subscriber, $sequence, $funnelSubscriberId, $funnelMetric],
            true
        ));
    }
}
```

A `pushBlockFields()` metódus adja vissza a művelet beállítópaneljének szerkezetét, ebből rajzolja ki a FluentCRM a mezőket. A `getBlockFields()` mezőleírásai ugyanazt a szerkezetet követik, mint a többi FluentCRM-űrlapmező; további 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\Actions\CustomAction();
    }
});
```

Ezután:

1. A „My-plugin jegyzet hozzáadása” művelet megjelenik az automatizálás műveletlistájában.
2. Bármelyik automatizálásban beállíthatod a jegyzet szövegét és típusát.
3. A lépés futásakor a FluentCRM a `fluentcrm_funnel_sequence_handle_custom_action_name` kampón át meghívja a `handle()` metódusodat, ahol egyedi viselkedést vagy külső integrációt valósíthatsz meg.
