123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- <?php
-
- namespace Illuminate\View\Concerns;
-
- use InvalidArgumentException;
- use Illuminate\Contracts\View\View;
-
- trait ManagesLayouts
- {
- /**
- * All of the finished, captured sections.
- *
- * @var array
- */
- protected $sections = [];
-
- /**
- * The stack of in-progress sections.
- *
- * @var array
- */
- protected $sectionStack = [];
-
- /**
- * The parent placeholder for the request.
- *
- * @var mixed
- */
- protected static $parentPlaceholder = [];
-
- /**
- * Start injecting content into a section.
- *
- * @param string $section
- * @param string|null $content
- * @return void
- */
- public function startSection($section, $content = null)
- {
- if ($content === null) {
- if (ob_start()) {
- $this->sectionStack[] = $section;
- }
- } else {
- $this->extendSection($section, $content instanceof View ? $content : e($content));
- }
- }
-
- /**
- * Inject inline content into a section.
- *
- * @param string $section
- * @param string $content
- * @return void
- */
- public function inject($section, $content)
- {
- $this->startSection($section, $content);
- }
-
- /**
- * Stop injecting content into a section and return its contents.
- *
- * @return string
- */
- public function yieldSection()
- {
- if (empty($this->sectionStack)) {
- return '';
- }
-
- return $this->yieldContent($this->stopSection());
- }
-
- /**
- * Stop injecting content into a section.
- *
- * @param bool $overwrite
- * @return string
- * @throws \InvalidArgumentException
- */
- public function stopSection($overwrite = false)
- {
- if (empty($this->sectionStack)) {
- throw new InvalidArgumentException('Cannot end a section without first starting one.');
- }
-
- $last = array_pop($this->sectionStack);
-
- if ($overwrite) {
- $this->sections[$last] = ob_get_clean();
- } else {
- $this->extendSection($last, ob_get_clean());
- }
-
- return $last;
- }
-
- /**
- * Stop injecting content into a section and append it.
- *
- * @return string
- * @throws \InvalidArgumentException
- */
- public function appendSection()
- {
- if (empty($this->sectionStack)) {
- throw new InvalidArgumentException('Cannot end a section without first starting one.');
- }
-
- $last = array_pop($this->sectionStack);
-
- if (isset($this->sections[$last])) {
- $this->sections[$last] .= ob_get_clean();
- } else {
- $this->sections[$last] = ob_get_clean();
- }
-
- return $last;
- }
-
- /**
- * Append content to a given section.
- *
- * @param string $section
- * @param string $content
- * @return void
- */
- protected function extendSection($section, $content)
- {
- if (isset($this->sections[$section])) {
- $content = str_replace(static::parentPlaceholder($section), $content, $this->sections[$section]);
- }
-
- $this->sections[$section] = $content;
- }
-
- /**
- * Get the string contents of a section.
- *
- * @param string $section
- * @param string $default
- * @return string
- */
- public function yieldContent($section, $default = '')
- {
- $sectionContent = $default instanceof View ? $default : e($default);
-
- if (isset($this->sections[$section])) {
- $sectionContent = $this->sections[$section];
- }
-
- $sectionContent = str_replace('@@parent', '--parent--holder--', $sectionContent);
-
- return str_replace(
- '--parent--holder--', '@parent', str_replace(static::parentPlaceholder($section), '', $sectionContent)
- );
- }
-
- /**
- * Get the parent placeholder for the current request.
- *
- * @param string $section
- * @return string
- */
- public static function parentPlaceholder($section = '')
- {
- if (! isset(static::$parentPlaceholder[$section])) {
- static::$parentPlaceholder[$section] = '##parent-placeholder-'.sha1($section).'##';
- }
-
- return static::$parentPlaceholder[$section];
- }
-
- /**
- * Check if section exists.
- *
- * @param string $name
- * @return bool
- */
- public function hasSection($name)
- {
- return array_key_exists($name, $this->sections);
- }
-
- /**
- * Get the contents of a section.
- *
- * @param string $name
- * @param string $default
- * @return mixed
- */
- public function getSection($name, $default = null)
- {
- return $this->getSections()[$name] ?? $default;
- }
-
- /**
- * Get the entire array of sections.
- *
- * @return array
- */
- public function getSections()
- {
- return $this->sections;
- }
-
- /**
- * Flush all of the sections.
- *
- * @return void
- */
- public function flushSections()
- {
- $this->sections = [];
- $this->sectionStack = [];
- }
- }
|