Skip to content

Commit

Permalink
Added events accumultaion API
Browse files Browse the repository at this point in the history
  • Loading branch information
SilverFire committed Jan 21, 2020
1 parent f9623fc commit c6d8a35
Showing 1 changed file with 40 additions and 0 deletions.
40 changes: 40 additions & 0 deletions src/ShoppingCart.php
Expand Up @@ -13,6 +13,7 @@

use hipanel\modules\finance\cart\AbstractCartPosition;
use Yii;
use yii\base\Event;
use yz\shoppingcart\CartActionEvent;

/**
Expand Down Expand Up @@ -161,4 +162,43 @@ public function getAdditionalLinks(): array

return $links;
}

/**
* @var CartActionEvent[]|null
*/
private $_accumulatedEvents;
public function trigger($name, Event $event = null)
{
if (is_array($this->_accumulatedEvents)) {
\Yii::info("Shopping cart accumulates event $name");
$this->_accumulatedEvents[] = [$name, $event];
} else {
parent::trigger($name, $event);
}
}

/**
* Runs $closure and accumulates all events occurred during $closure run.
* Events get released immediately after a success $closure run.
*
* The method can be used to prevent useless calculations that happen after
* bunch of similar updates on a cart.
*
* @param \Closure $closure
*/
public function accumulateEvents(\Closure $closure): void
{
$this->_accumulatedEvents = [];
try {
$closure();
$events = $this->_accumulatedEvents;
$this->_accumulatedEvents = null;
foreach ($events as [$name, $event]) {
\Yii::info("Releases event $name");
$this->trigger($name, $event);
}
} finally {
$this->_accumulatedEvents = null;
}
}
}

0 comments on commit c6d8a35

Please sign in to comment.