Як програмно створити правило для каталожної ціни в Magento 2?

Правила цін каталогу Magento 2 дозволяють створювати заохочувальні пропозиції та спонукати ваших клієнтів завершити покупку. На відміну від правила ціноутворення кошика , правила каталогу застосовуються до всього каталогу, а не лише до кошика.

Традиційно ви створити правила цін у каталозі через панель адміністратора. Саме там ви вказуєте інформацію про правило та умови для застосування знижок. Але ви також можете виконати всі ці кроки за допомогою кодування.

Отже, сьогодні ви дізнаєтеся, як створити правило ціни каталогу в Magento 2 програмно.

Створіть правило ціни каталогу Magento 2 за допомогою впровадження залежностей

Одним з найбезпечніших методів є впровадження залежностей. Щоб застосувати цей метод, використовуйте наведений нижче код:

<?php
declare(strict_types=1);

namespace Vendor\Module;

use Magento\CatalogRule\Api\CatalogRuleRepositoryInterface;
use Magento\CatalogRule\Model\RuleFactory;
use Magento\Framework\Exception\CouldNotSaveException;
use Psr\Log\LoggerInterface;

class CreateCatalogPriceRule
{
protected $ruleFactory;

 protected $catalogRuleRepository;

 protected $logger;

 public function __construct(
   RuleFactory $ruleFactory,
   CatalogRuleRepositoryInterface $catalogRuleRepository,
   LoggerInterface $logger
 ){
   $this->ruleFactory = $ruleFactory;
   $this->catalogRuleRepository = $catalogRuleRepository;
   $this->logger = $logger;
 }

 public function execute()
 {
   $rule = $this->ruleFactory->create();

   $rule->setName('Programmatic Rule')
    ->setDescription('Created Programmatically')
     ->setIsActive(1)
     ->setCustomerGroupIds([0, 1, 2, 3]) // Assuming these groups exist
     ->setWebsiteIds([1]) // Assuming this website exists
     ->setSimpleAction('by_percent')
     ->setDiscountAmount(10)
     ->setStopRulesProcessing(0);

  // Define conditions here
   $conditions = [
     'type' => \Magento\CatalogRule\Model\Rule\Condition\Combine::class,
     'aggregator' => 'all',
     'value' => 1, // 1 means TRUE, i.e., ALL conditions have to be TRUE.
     'new_child' => '',
     'conditions' => [
       [
         'type' => \Magento\CatalogRule\Model\Rule\Condition\Product::class,
         'attribute' => 'category_ids',
         'operator' => '==',
         'value' => '10' // Category ID to which the rule applies
       ]
     ]
  ];

   $rule->getConditions()->loadArray($conditions);

   // Save the rule
   try {
       $this->catalogRuleRepository->save($rule);
    } catch (CouldNotSaveException $e) {
       $this->logger->error('This is an error while saving catalogPriceRule');
    }

    return $rule;
 }
}

Створення правила каталожної ціни Magento 2 за допомогою менеджера об'єктів

Хоча на перший погляд це досить просто, менеджер об'єктів може приховувати реальні залежності класу. Тому ми не рекомендуємо використовувати його безпосередньо.

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

use Magento\Framework\App\Bootstrap;
require __DIR__ . '/app/bootstrap.php';

$bootstrap = Bootstrap::create(BP, $_SERVER);

$obj = $bootstrap->getObjectManager();

$state = $obj->get(Magento\Framework\App\State::class);
$state->setAreaCode('adminhtml');

$ruleFactory = $obj->create(\Magento\CatalogRule\Model\RuleFactory::class);
$catalogRuleRepository = $obj->create(\Magento\CatalogRule\Api\CatalogRuleRepositoryInterface::class);


$rule = $ruleFactory->create();

$rule->setName('Programmatic Rule')
->setDescription('Created Programmatically Object Manager')
 ->setIsActive(1)
 ->setCustomerGroupIds([0, 1, 2, 3]) // Assuming these groups exist
 ->setWebsiteIds([1]) // Assuming this website exists
 ->setSimpleAction('by_percent')
 ->setDiscountAmount(10)
 ->setStopRulesProcessing(0);

// Define conditions here
$conditions = [
'type' => \Magento\CatalogRule\Model\Rule\Condition\Combine::class,
'aggregator' => 'all',
'value' => 1, // 1 means TRUE, i.e., ALL conditions have to be TRUE.
'new_child' => '',
'conditions' => [
  [
    'type' => \Magento\CatalogRule\Model\Rule\Condition\Product::class,
    'attribute' => 'category_ids',
    'operator' => '==',
    'value' => '10' // Category ID to which the rule applies
  ]
]
];

$rule->getConditions()->loadArray($conditions);


$catalogRuleRepository->save($rule);

Примітка: обидва методи показують лише один приклад правила каталогу. Таким чином, ви можете налаштувати його відповідно до своїх потреб, щоб визначити будь-які конкретні умови.

Ось так! Тепер у вас є ще два методи під рукою, і ви можете створювати правила каталожних цін програмно в Magento. Ці правила разом з іншими знижки можуть допомогти вам запустити успішні та ефективні кампанії.