202 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Illuminate\View\Concerns;
 | |
| 
 | |
| use InvalidArgumentException;
 | |
| 
 | |
| trait ManagesStacks
 | |
| {
 | |
|     /**
 | |
|      * All of the finished, captured push sections.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     protected $pushes = [];
 | |
| 
 | |
|     /**
 | |
|      * All of the finished, captured prepend sections.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     protected $prepends = [];
 | |
| 
 | |
|     /**
 | |
|      * The stack of in-progress push sections.
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     protected $pushStack = [];
 | |
| 
 | |
|     /**
 | |
|      * Start injecting content into a push section.
 | |
|      *
 | |
|      * @param  string  $section
 | |
|      * @param  string  $content
 | |
|      * @return void
 | |
|      */
 | |
|     public function startPush($section, $content = '')
 | |
|     {
 | |
|         if ($content === '') {
 | |
|             if (ob_start()) {
 | |
|                 $this->pushStack[] = $section;
 | |
|             }
 | |
|         } else {
 | |
|             $this->extendPush($section, $content);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Stop injecting content into a push section.
 | |
|      *
 | |
|      * @return string
 | |
|      *
 | |
|      * @throws \InvalidArgumentException
 | |
|      */
 | |
|     public function stopPush()
 | |
|     {
 | |
|         if (empty($this->pushStack)) {
 | |
|             throw new InvalidArgumentException('Cannot end a push stack without first starting one.');
 | |
|         }
 | |
| 
 | |
|         return tap(array_pop($this->pushStack), function ($last) {
 | |
|             $this->extendPush($last, ob_get_clean());
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Append content to a given push section.
 | |
|      *
 | |
|      * @param  string  $section
 | |
|      * @param  string  $content
 | |
|      * @return void
 | |
|      */
 | |
|     protected function extendPush($section, $content)
 | |
|     {
 | |
|         if (! isset($this->pushes[$section])) {
 | |
|             $this->pushes[$section] = [];
 | |
|         }
 | |
| 
 | |
|         if (! isset($this->pushes[$section][$this->renderCount])) {
 | |
|             $this->pushes[$section][$this->renderCount] = $content;
 | |
|         } else {
 | |
|             $this->pushes[$section][$this->renderCount] .= $content;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Start prepending content into a push section.
 | |
|      *
 | |
|      * @param  string  $section
 | |
|      * @param  string  $content
 | |
|      * @return void
 | |
|      */
 | |
|     public function startPrepend($section, $content = '')
 | |
|     {
 | |
|         if ($content === '') {
 | |
|             if (ob_start()) {
 | |
|                 $this->pushStack[] = $section;
 | |
|             }
 | |
|         } else {
 | |
|             $this->extendPrepend($section, $content);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Stop prepending content into a push section.
 | |
|      *
 | |
|      * @return string
 | |
|      *
 | |
|      * @throws \InvalidArgumentException
 | |
|      */
 | |
|     public function stopPrepend()
 | |
|     {
 | |
|         if (empty($this->pushStack)) {
 | |
|             throw new InvalidArgumentException('Cannot end a prepend operation without first starting one.');
 | |
|         }
 | |
| 
 | |
|         return tap(array_pop($this->pushStack), function ($last) {
 | |
|             $this->extendPrepend($last, ob_get_clean());
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Prepend content to a given stack.
 | |
|      *
 | |
|      * @param  string  $section
 | |
|      * @param  string  $content
 | |
|      * @return void
 | |
|      */
 | |
|     protected function extendPrepend($section, $content)
 | |
|     {
 | |
|         if (! isset($this->prepends[$section])) {
 | |
|             $this->prepends[$section] = [];
 | |
|         }
 | |
| 
 | |
|         if (! isset($this->prepends[$section][$this->renderCount])) {
 | |
|             $this->prepends[$section][$this->renderCount] = $content;
 | |
|         } else {
 | |
|             $this->prepends[$section][$this->renderCount] = $content.$this->prepends[$section][$this->renderCount];
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the string contents of a push section.
 | |
|      *
 | |
|      * @param  string  $section
 | |
|      * @param  string  $default
 | |
|      * @return string
 | |
|      */
 | |
|     public function yieldPushContent($section, $default = '')
 | |
|     {
 | |
|         if (! isset($this->pushes[$section]) && ! isset($this->prepends[$section])) {
 | |
|             return $default;
 | |
|         }
 | |
| 
 | |
|         $output = '';
 | |
| 
 | |
|         if (isset($this->prepends[$section])) {
 | |
|             $output .= implode(array_reverse($this->prepends[$section]));
 | |
|         }
 | |
| 
 | |
|         if (isset($this->pushes[$section])) {
 | |
|             $output .= implode($this->pushes[$section]);
 | |
|         }
 | |
| 
 | |
|         return $output;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Flush all of the stacks.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function flushStacks()
 | |
|     {
 | |
|         $this->pushes = [];
 | |
|         $this->prepends = [];
 | |
|         $this->pushStack = [];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Flush stack by key.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function flushStack($key = null)
 | |
|     {   
 | |
|         $properties = [
 | |
|             'pushes',
 | |
|             'prepends',
 | |
|             'pushStack',
 | |
|         ];
 | |
| 
 | |
|         foreach ($properties as $property) {
 | |
|             if (!array_key_exists($key, $this->$property)) {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             unset($this->$property[$key]);
 | |
|         }
 | |
|     }
 | |
| }
 |