Spaces:
No application file
No application file
File size: 4,153 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
<?php
namespace Mautic\CoreBundle\Twig\Helper;
/**
* final class SlotsHelper.
*/
final class SlotsHelper
{
/**
* @var array<string, mixed>
*/
private array $slots = [];
/**
* @var array<string, mixed>
*/
private array $openSlots = [];
private bool $inBuilder = false;
/**
* Starts a new slot.
*
* This method starts an output buffer that will be
* closed when the stop() method is called.
*
* @param string $name The slot name
*
* @throws \InvalidArgumentException if a slot with the same name is already started
*/
public function start($name): void
{
if (\in_array($name, $this->openSlots)) {
throw new \InvalidArgumentException(sprintf('A slot named "%s" is already started.', $name));
}
$this->openSlots[] = $name;
$this->slots[$name] = '';
ob_start();
ob_implicit_flush(false);
}
/**
* Stops a slot.
*
* @throws \LogicException if no slot has been started
*/
public function stop(): void
{
if (!$this->openSlots) {
throw new \LogicException('No slot started.');
}
$name = array_pop($this->openSlots);
$this->slots[$name] = ob_get_clean();
}
/**
* Returns true if the slot exists.
*
* @param string $name The slot name
*/
public function has($name): bool
{
return isset($this->slots[$name]);
}
/**
* Gets the slot value.
*
* @param string $name The slot name
* @param bool|string $default The default slot content
*
* @return string The slot content
*/
public function get($name, $default = false)
{
return $this->slots[$name] ?? $default;
}
/**
* Sets a slot value.
*
* @param string $name The slot name
* @param string $content The slot content
*/
public function set($name, $content): void
{
$this->slots[$name] = $content;
}
/**
* Returns the canonical name of this helper.
*
* @return string The canonical name
*/
public function getName(): string
{
return 'slots';
}
/**
* Appends a slot value if already set.
*/
public function append(string $name, string $content): void
{
if (isset($this->slots[$name])) {
if (is_array($this->slots[$name])) {
$this->slots[$name][] = $content;
} else {
$this->slots[$name] .= ' '.$content;
}
} else {
$this->slots[$name] = $content;
}
}
/**
* Checks if the slot has some content when a page is viewed in public.
*
* @param string|array<string, mixed> $names
*/
public function hasContent($names): bool
{
// If we're in the builder, return true so all slots show.
if ($this->inBuilder) {
return true;
}
if (is_string($names)) {
$names = [$names];
}
if (is_array($names)) {
foreach ($names as $n) {
// strip tags used to ensure we don't have empty tags.
// Caused a bug with hasContent returning incorrectly. Whitelisted img to fix
$hasContent = (bool) strip_tags(trim($this->slots[$n]), '<img><iframe>');
if ($hasContent) {
return true;
}
}
}
return false;
}
public function inBuilder(bool $bool): void
{
$this->inBuilder = (bool) $bool;
}
/**
* Outputs a slot.
*
* @return bool true if the slot is defined or if a default content has been provided, false otherwise
*/
public function output(string $name, bool|string $default = false): bool
{
if (!isset($this->slots[$name])) {
if (false !== $default) {
echo $default;
return true;
}
return false;
}
echo $this->slots[$name];
return true;
}
}
|