What i’m doing / Plugin to limit daily executions
I’m creating a simple plugin to add a new Decision in the Campaign Builder. The goal is to limit the number of campaign executions per day and I want share a problem and how I fix, if somebody have the same problem.
Screenshot 1 - Function “onCampaignBuild” it’s working
Screenshot 2 - Campaign
The subscriber already exists
"mautic.campaign_limit.daily_limit" event
-----------------------------------------
------- ------------------------------------------------------------------------------------------------- ----------
Order Callable Priority
------- ------------------------------------------------------------------------------------------------- ----------
#1 MauticPlugin\MauticCampaignLimitBundle\EventListener\CampaignSubscriber::onDailyLimitEvaluate() 0
------- ------------------------------------------------------------------------------------------------- ----------
My current problem
Already read the documentation:
But when the campaign runs and checks the decision, my custom eventName
is never triggered.
As a result, it always returns **false**
, and my function **onDailyLimitEvaluate()**
is never executed.
This is my current file CampaignSubscriber.php
<?php
namespace MauticPlugin\MauticCampaignLimitBundle\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use Mautic\CampaignBundle\CampaignEvents;
use Mautic\CampaignBundle\Event\CampaignBuilderEvent;
use Mautic\CampaignBundle\Event\CampaignExecutionEvent;
use MauticPlugin\MauticCampaignLimitBundle\Form\Type\DailyLimitType;
use MauticPlugin\MauticCampaignLimitBundle\Service\LimitCheckerService;
use MauticPlugin\MauticCampaignLimitBundle\Event\CampaignLimitEvents;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CampaignSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $entityManager;
private LoggerInterface $logger;
private LimitCheckerService $limitChecker;
private const N8N_WEBHOOK_URL = 'https://flow.cloud.digitag.cl/webhook/2a89c8cf-45e6-4dca-84b3-6fc58b11663e';
public function __construct(EntityManagerInterface $entityManager, LoggerInterface $logger, LimitCheckerService $limitChecker)
{
$this->entityManager = $entityManager;
$this->logger = $logger;
$this->limitChecker = $limitChecker; // Asignamos el servicio inyectado
}
public static function getSubscribedEvents(): array
{
return [
CampaignEvents::CAMPAIGN_ON_BUILD => ['onCampaignBuild', 0],
CampaignLimitEvents::EVALUATE_CAMPAIGN_DECISION => ['onDailyLimitEvaluate', 0],
];
}
public function onCampaignBuild(CampaignBuilderEvent $event): void
{
$event->addDecision(
'campaign_limit.daily_limit',
[
'label' => 'mautic.campaign_limit.decision.daily_limit',
'description' => 'mautic.campaign_limit.decision.daily_limit.description',
'eventName' => CampaignLimitEvents::EVALUATE_CAMPAIGN_DECISION,
'formType' => DailyLimitType::class,
'formTypeOptions' => ['label' => false],
'channel' => 'campaign_limit',
'channelIdField' => 'limitKey',
]
);
$this->logger->info('Campaign Limit: Daily Limit decision registered in campaign builder');
}
public function onDailyLimitEvaluate(CampaignExecutionEvent $event): void
{
$event->setResult(true);
return;
}
}
Value of my constant
public const EVALUATE_CAMPAIGN_DECISION = ‘mautic.campaign_limit.daily_limit’;
Solution
To be sure you will execute the decision in the campaign I did this change:
Before:
CampaignLimitEvents::EVALUATE_CAMPAIGN_DECISION => [‘onDailyLimitEvaluate’, 0],
Now:
CampaignEvents::ON_EVENT_DECISION_EVALUATION => [‘onDailyLimitEvaluate’, 0],
The mautic.campaign_on_event_decision_evaluation event is dispatched when a campaign decision is to be evaluated.
My Enviroment
My Mautic version is: 5.2
My PHP version is: PHP 8.3.11