Add BuysAProduct trigger backend
[MAILPOET-5516]
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
<?php declare(strict_types = 1);
|
||||
|
||||
namespace MailPoet\Automation\Integrations\WooCommerce\Triggers;
|
||||
|
||||
use MailPoet\Automation\Engine\Control\FilterHandler;
|
||||
use MailPoet\Automation\Engine\Data\Field;
|
||||
use MailPoet\Automation\Engine\Data\Filter;
|
||||
use MailPoet\Automation\Engine\Data\FilterGroup;
|
||||
use MailPoet\Automation\Engine\Data\StepRunArgs;
|
||||
use MailPoet\Automation\Engine\Data\StepValidationArgs;
|
||||
use MailPoet\Automation\Engine\Data\Subject;
|
||||
use MailPoet\Automation\Engine\Hooks;
|
||||
use MailPoet\Automation\Engine\Integration\Trigger;
|
||||
use MailPoet\Automation\Engine\Storage\AutomationRunStorage;
|
||||
use MailPoet\Automation\Engine\WordPress;
|
||||
use MailPoet\Automation\Integrations\Core\Filters\EnumArrayFilter;
|
||||
use MailPoet\Automation\Integrations\Core\Filters\EnumFilter;
|
||||
use MailPoet\Automation\Integrations\WooCommerce\Subjects\CustomerSubject;
|
||||
use MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderStatusChangeSubject;
|
||||
use MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderSubject;
|
||||
use MailPoet\Validator\Builder;
|
||||
use MailPoet\Validator\Schema\ObjectSchema;
|
||||
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
||||
|
||||
class BuysAProductTrigger implements Trigger {
|
||||
public const KEY = 'woocommerce:buys-a-product';
|
||||
|
||||
/** @var WordPress */
|
||||
private $wp;
|
||||
|
||||
/** @var WooCommerceHelper */
|
||||
private $wc;
|
||||
|
||||
/** @var AutomationRunStorage */
|
||||
private $automationRunStorage;
|
||||
|
||||
/** @var FilterHandler */
|
||||
private $filterHandler;
|
||||
|
||||
public function __construct(
|
||||
WordPress $wp,
|
||||
WooCommerceHelper $wc,
|
||||
AutomationRunStorage $automationRunStorage,
|
||||
FilterHandler $filterHandler
|
||||
) {
|
||||
$this->wp = $wp;
|
||||
$this->wc = $wc;
|
||||
$this->automationRunStorage = $automationRunStorage;
|
||||
$this->filterHandler = $filterHandler;
|
||||
}
|
||||
|
||||
public function getKey(): string {
|
||||
return self::KEY;
|
||||
}
|
||||
|
||||
public function getName(): string {
|
||||
return __('Customer buys a product', 'mailpoet');
|
||||
}
|
||||
|
||||
public function getArgsSchema(): ObjectSchema {
|
||||
return Builder::object([
|
||||
'product_ids' => Builder::array(
|
||||
Builder::integer()
|
||||
)->minItems(1)->required(),
|
||||
'to' => Builder::string()->required()->default('wc-completed'),
|
||||
]);
|
||||
}
|
||||
|
||||
public function getSubjectKeys(): array {
|
||||
return [
|
||||
OrderSubject::KEY,
|
||||
OrderStatusChangeSubject::KEY,
|
||||
CustomerSubject::KEY,
|
||||
];
|
||||
}
|
||||
|
||||
public function validate(StepValidationArgs $args): void {
|
||||
}
|
||||
|
||||
public function registerHooks(): void {
|
||||
$this->wp->addAction(
|
||||
'woocommerce_order_status_changed',
|
||||
[
|
||||
$this,
|
||||
'handle',
|
||||
],
|
||||
10,
|
||||
3
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $orderId
|
||||
* @param string $from
|
||||
* @param string $to
|
||||
* @return void
|
||||
*/
|
||||
public function handle($orderId, $from, $to): void {
|
||||
$order = $this->wc->wcGetOrder($orderId);
|
||||
if (!$order) {
|
||||
return;
|
||||
}
|
||||
$this->wp->doAction(Hooks::TRIGGER, $this, [
|
||||
new Subject(OrderSubject::KEY, ['order_id' => $orderId]),
|
||||
new Subject(CustomerSubject::KEY, ['customer_id' => $order->get_customer_id()]),
|
||||
new Subject(OrderStatusChangeSubject::KEY, ['from' => $from, 'to' => $to]),
|
||||
]);
|
||||
}
|
||||
|
||||
public function isTriggeredBy(StepRunArgs $args): bool {
|
||||
|
||||
//Trigger the run only once.
|
||||
$orderSubjectData = $args->getSingleSubjectEntryByClass(OrderSubject::class)->getSubjectData();
|
||||
if ($this->automationRunStorage->getCountByAutomationAndSubject($args->getAutomation(), $orderSubjectData) > 0) {
|
||||
return false;
|
||||
}
|
||||
$group = new FilterGroup(
|
||||
'',
|
||||
FilterGroup::OPERATOR_AND,
|
||||
$this->getFilters($args)
|
||||
);
|
||||
return $this->filterHandler->matchesGroup($group, $args);
|
||||
}
|
||||
|
||||
protected function getFilters(StepRunArgs $args): array {
|
||||
$triggerArgs = $args->getStep()->getArgs();
|
||||
$filters = [
|
||||
Filter::fromArray([
|
||||
'id' => '',
|
||||
'field_type' => Field::TYPE_ENUM_ARRAY,
|
||||
'field_key' => 'woocommerce:order:products',
|
||||
'condition' => EnumArrayFilter::CONDITION_MATCHES_ANY_OF,
|
||||
'args' => [
|
||||
'value' => $triggerArgs['product_ids'] ?? [],
|
||||
],
|
||||
]),
|
||||
];
|
||||
$status = str_replace('wc-', '', $triggerArgs['to'] ?? 'completed');
|
||||
if ($status === 'any') {
|
||||
return $filters;
|
||||
}
|
||||
|
||||
$filters[] = Filter::fromArray([
|
||||
'id' => '',
|
||||
'field_type' => Field::TYPE_ENUM,
|
||||
'field_key' => 'woocommerce:order:status',
|
||||
'condition' => EnumFilter::IS_ANY_OF,
|
||||
'args' => [
|
||||
'value' => [$status],
|
||||
],
|
||||
]);
|
||||
return $filters;
|
||||
}
|
||||
}
|
@@ -9,6 +9,7 @@ use MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderStatusChangeSubje
|
||||
use MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderSubject;
|
||||
use MailPoet\Automation\Integrations\WooCommerce\SubjectTransformers\WordPressUserSubjectToWooCommerceCustomerSubjectTransformer;
|
||||
use MailPoet\Automation\Integrations\WooCommerce\Triggers\AbandonedCart\AbandonedCartTrigger;
|
||||
use MailPoet\Automation\Integrations\WooCommerce\Triggers\BuysAProductTrigger;
|
||||
use MailPoet\Automation\Integrations\WooCommerce\Triggers\OrderStatusChangedTrigger;
|
||||
|
||||
class WooCommerceIntegration {
|
||||
@@ -19,6 +20,9 @@ class WooCommerceIntegration {
|
||||
/** @var AbandonedCartTrigger */
|
||||
private $abandonedCartTrigger;
|
||||
|
||||
/** @var BuysAProductTrigger */
|
||||
private $buysAProductTrigger;
|
||||
|
||||
/** @var AbandonedCartSubject */
|
||||
private $abandonedCartSubject;
|
||||
|
||||
@@ -43,6 +47,7 @@ class WooCommerceIntegration {
|
||||
public function __construct(
|
||||
OrderStatusChangedTrigger $orderStatusChangedTrigger,
|
||||
AbandonedCartTrigger $abandonedCartTrigger,
|
||||
BuysAProductTrigger $buysAProductTrigger,
|
||||
AbandonedCartSubject $abandonedCartSubject,
|
||||
OrderStatusChangeSubject $orderStatusChangeSubject,
|
||||
OrderSubject $orderSubject,
|
||||
@@ -53,6 +58,7 @@ class WooCommerceIntegration {
|
||||
) {
|
||||
$this->orderStatusChangedTrigger = $orderStatusChangedTrigger;
|
||||
$this->abandonedCartTrigger = $abandonedCartTrigger;
|
||||
$this->buysAProductTrigger = $buysAProductTrigger;
|
||||
$this->abandonedCartSubject = $abandonedCartSubject;
|
||||
$this->orderStatusChangeSubject = $orderStatusChangeSubject;
|
||||
$this->orderSubject = $orderSubject;
|
||||
@@ -77,6 +83,7 @@ class WooCommerceIntegration {
|
||||
$registry->addSubject($this->customerSubject);
|
||||
$registry->addTrigger($this->orderStatusChangedTrigger);
|
||||
$registry->addTrigger($this->abandonedCartTrigger);
|
||||
$registry->addTrigger($this->buysAProductTrigger);
|
||||
$registry->addSubjectTransformer($this->wordPressUserToWooCommerceCustomerTransformer);
|
||||
}
|
||||
}
|
||||
|
@@ -197,6 +197,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
||||
$container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Fields\TermOptionsBuilder::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Fields\TermParentsLoader::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Triggers\OrderStatusChangedTrigger::class)->setPublic(true)->setShared(false);
|
||||
$container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Triggers\BuysAProductTrigger::class)->setPublic(true)->setShared(false);
|
||||
$container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderSubject::class)->setPublic(true)->setShared(false);
|
||||
$container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderStatusChangeSubject::class)->setPublic(true)->setShared(false);
|
||||
$container->autowire(\MailPoet\Automation\Integrations\WooCommerce\Subjects\CustomerSubject::class)->setPublic(true)->setShared(false);
|
||||
|
Reference in New Issue
Block a user