1: <?php
2:
3: /**
4: * Avisota newsletter and mailing system
5: *
6: * PHP Version 5.3
7: *
8: * @copyright bit3 UG 2013
9: * @author Tristan Lins <tristan.lins@bit3.de>
10: * @package avisota-core
11: * @license LGPL-3.0+
12: * @link http://avisota.org
13: */
14:
15: namespace Avisota\Renderer;
16:
17: use Avisota\Message\MessageInterface;
18:
19: /**
20: * The basic message interface.
21: *
22: * @package avisota-core
23: */
24: class MessageRendererChain implements MessageRendererInterface
25: {
26: /**
27: * @var MessageRendererInterface[][]
28: */
29: protected $chain = array();
30:
31: /**
32: * Add a renderer to this chain.
33: *
34: * @param MessageRendererInterface $renderer The renderer to add.
35: * @param int $priority The priority of the renderer,
36: * higher value means higher priority.
37: *
38: * @return void
39: */
40: public function addRenderer(MessageRendererInterface $renderer, $priority = 0)
41: {
42: $this->removeRenderer($renderer);
43:
44: $hash = spl_object_hash($renderer);
45: if (!isset($this->chain[$priority])) {
46: $this->chain[$priority] = array($hash => $renderer);
47: krsort($this->chain);
48: }
49: else {
50: $this->chain[$priority][$hash] = $renderer;
51: }
52: }
53:
54: /**
55: * Remove a renderer from this chain.
56: *
57: * @param MessageRendererInterface $renderer
58: *
59: * @return void
60: */
61: public function removeRenderer(MessageRendererInterface $renderer)
62: {
63: $hash = spl_object_hash($renderer);
64: foreach ($this->chain as &$renderers) {
65: unset($renderers[$hash]);
66: }
67: }
68:
69: /**
70: * {@inheritdoc}
71: */
72: public function renderMessage(MessageInterface $message)
73: {
74: foreach ($this->chain as $renderers) {
75: foreach ($renderers as $renderer) {
76: if ($renderer->canRender($message)) {
77: return $renderer->renderMessage($message);
78: }
79: }
80: }
81:
82: throw new \RuntimeException('Could not render message ' . $message->getSubject());
83: }
84:
85: /**
86: * {@inheritdoc}
87: */
88: public function canRender(MessageInterface $message)
89: {
90: foreach ($this->chain as $renderers) {
91: foreach ($renderers as $renderer) {
92: if ($renderer->canRender($message)) {
93: return true;
94: }
95: }
96: }
97:
98: return false;
99: }
100: }