Your cart is empty!
Setup Deals
do_action( 'vikrestaurants_setup_takeaway_deals', DealsFactory $factory )
Fires while constructing the object used to provide the deal handlers.
Description
This hook can be used to support custom types of deals.
In order to support new deal types, you need to attach your classes to the $factory
object, which can be done through the code below.
$factory->registerDealProvider('custom_offer', function(array $options) {
require_once dirname(__FILE__) . '/rules/CustomOfferDealRule.php';
return new CustomOfferDealRule($options);
});
The registered deals must inherit the E4J\VikRestaurants\Deals\DealRule
class, otherwise they will be ignored.
Parameters
- $factory
-
(DealFactory) The object used to create the available deal providers. This class is part of the
E4J\VikRestaurants\Deals
namespace.
Example
The example below explains how to support a custom deal.
/**
* Trigger event to let the plugins register new deal rules.
*
* @param E4J\VikRestaurants\Deals\DealsFactory $factory
*
* @since 1.3
*/
add_action('vikrestaurants_setup_takeaway_deals', function($factory) {
// register a new deal with id "custom_offer"
$factory->registerDealProvider('custom_offer', function(array $options) {
// anonymous classes are supported too, but still need to inherit the DealRule class
return new class ($options) extends E4J\VikRestaurants\Deals\DealRule {
/**
* Returns the deal code identifier.
*
* @return string
*/
public function getID()
{
return 'custom_offer';
}
/**
* Returns a deal readable name.
*
* @return string
*/
public function getName()
{
return 'Custom Offer';
}
/**
* Returns the description of the deal.
*
* @return string
*/
public function getDescription()
{
return 'Describe here the purpose of this deal. For administrative purposes only.';
}
/**
* Executes the rule before start checking whether this rule can be applied or not.
* This method is called only once.
*
* @param Cart $cart The cart with the ordered items.
*
* @return void
*/
public function prepare($cart)
{
// set up the deal if needed
}
/**
* Applies the deal to the cart instance, if needed.
* This method is called a number of times equals to the compatible deals
* configured from the back-end.
*
* @param Cart $cart The cart with the items.
* @param Deal $deal The deal to apply.
*
* @return bool True if applied, false otherwise.
*/
public function serve($cart, $deal)
{
$should_apply = false;
/**
* @todo check whether the deal should be applied
*/
// check whether the same discount has been already applied
$index = $cart->deals->indexOfType($deal->get('type'));
if ($should_apply) {
// create discount
$discount = new E4J\VikRestaurants\TakeAway\Cart\Deals\Discount([
'id' => $deal->get('id'),
'amount' => 20,
'percent' => true,
'type' => $deal->get('type'),
]);
// Register the discount into the cart.
// In case there are no discount at the specified index,
// the discount will be inserted instead.
$cart->deals()->set($discount, $index);
} elseif ($index !== false) {
// the discount should be removed from the cart
$cart->deals->removeAt($index);
}
return $should_apply;
}
};
});
});
Changelog
Version | Description |
---|---|
1.3 | Introduced. |
Last Update: 2023-12-27
Helpful?