nginxsonarrradarrplexorganizrdashboardbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbget
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							165 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							165 lines
						
					
					
						
							5.5 KiB
						
					
					
				| <?php | |
| 
 | |
| /* | |
|  * This file is part of the Symfony package. | |
|  * | |
|  * (c) Fabien Potencier <fabien@symfony.com> | |
|  * | |
|  * For the full copyright and license information, please view the LICENSE | |
|  * file that was distributed with this source code. | |
|  */ | |
| 
 | |
| namespace Symfony\Component\HttpKernel\Fragment; | |
| 
 | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpFoundation\Response; | |
| use Symfony\Component\Templating\EngineInterface; | |
| use Symfony\Component\HttpKernel\Controller\ControllerReference; | |
| use Symfony\Component\HttpKernel\UriSigner; | |
| use Twig\Environment; | |
| use Twig\Error\LoaderError; | |
| use Twig\Loader\ExistsLoaderInterface; | |
| 
 | |
| /** | |
|  * Implements the Hinclude rendering strategy. | |
|  * | |
|  * @author Fabien Potencier <fabien@symfony.com> | |
|  */ | |
| class HIncludeFragmentRenderer extends RoutableFragmentRenderer | |
| { | |
|     private $globalDefaultTemplate; | |
|     private $signer; | |
|     private $templating; | |
|     private $charset; | |
| 
 | |
|     /** | |
|      * @param EngineInterface|Environment $templating            An EngineInterface or a Twig instance | |
|      * @param UriSigner                   $signer                A UriSigner instance | |
|      * @param string                      $globalDefaultTemplate The global default content (it can be a template name or the content) | |
|      * @param string                      $charset | |
|      */ | |
|     public function __construct($templating = null, UriSigner $signer = null, $globalDefaultTemplate = null, $charset = 'utf-8') | |
|     { | |
|         $this->setTemplating($templating); | |
|         $this->globalDefaultTemplate = $globalDefaultTemplate; | |
|         $this->signer = $signer; | |
|         $this->charset = $charset; | |
|     } | |
| 
 | |
|     /** | |
|      * Sets the templating engine to use to render the default content. | |
|      * | |
|      * @param EngineInterface|Environment|null $templating An EngineInterface or an Environment instance | |
|      * | |
|      * @throws \InvalidArgumentException | |
|      */ | |
|     public function setTemplating($templating) | |
|     { | |
|         if (null !== $templating && !$templating instanceof EngineInterface && !$templating instanceof Environment) { | |
|             throw new \InvalidArgumentException('The hinclude rendering strategy needs an instance of Twig\Environment or Symfony\Component\Templating\EngineInterface'); | |
|         } | |
| 
 | |
|         $this->templating = $templating; | |
|     } | |
| 
 | |
|     /** | |
|      * Checks if a templating engine has been set. | |
|      * | |
|      * @return bool true if the templating engine has been set, false otherwise | |
|      */ | |
|     public function hasTemplating() | |
|     { | |
|         return null !== $this->templating; | |
|     } | |
| 
 | |
|     /** | |
|      * {@inheritdoc} | |
|      * | |
|      * Additional available options: | |
|      * | |
|      *  * default:    The default content (it can be a template name or the content) | |
|      *  * id:         An optional hx:include tag id attribute | |
|      *  * attributes: An optional array of hx:include tag attributes | |
|      */ | |
|     public function render($uri, Request $request, array $options = array()) | |
|     { | |
|         if ($uri instanceof ControllerReference) { | |
|             if (null === $this->signer) { | |
|                 throw new \LogicException('You must use a proper URI when using the Hinclude rendering strategy or set a URL signer.'); | |
|             } | |
| 
 | |
|             // we need to sign the absolute URI, but want to return the path only. | |
|             $uri = substr($this->signer->sign($this->generateFragmentUri($uri, $request, true)), strlen($request->getSchemeAndHttpHost())); | |
|         } | |
| 
 | |
|         // We need to replace ampersands in the URI with the encoded form in order to return valid html/xml content. | |
|         $uri = str_replace('&', '&', $uri); | |
| 
 | |
|         $template = isset($options['default']) ? $options['default'] : $this->globalDefaultTemplate; | |
|         if (null !== $this->templating && $template && $this->templateExists($template)) { | |
|             $content = $this->templating->render($template); | |
|         } else { | |
|             $content = $template; | |
|         } | |
| 
 | |
|         $attributes = isset($options['attributes']) && is_array($options['attributes']) ? $options['attributes'] : array(); | |
|         if (isset($options['id']) && $options['id']) { | |
|             $attributes['id'] = $options['id']; | |
|         } | |
|         $renderedAttributes = ''; | |
|         if (count($attributes) > 0) { | |
|             $flags = ENT_QUOTES | ENT_SUBSTITUTE; | |
|             foreach ($attributes as $attribute => $value) { | |
|                 $renderedAttributes .= sprintf( | |
|                     ' %s="%s"', | |
|                     htmlspecialchars($attribute, $flags, $this->charset, false), | |
|                     htmlspecialchars($value, $flags, $this->charset, false) | |
|                 ); | |
|             } | |
|         } | |
| 
 | |
|         return new Response(sprintf('<hx:include src="%s"%s>%s</hx:include>', $uri, $renderedAttributes, $content)); | |
|     } | |
| 
 | |
|     /** | |
|      * @param string $template | |
|      * | |
|      * @return bool | |
|      */ | |
|     private function templateExists($template) | |
|     { | |
|         if ($this->templating instanceof EngineInterface) { | |
|             try { | |
|                 return $this->templating->exists($template); | |
|             } catch (\InvalidArgumentException $e) { | |
|                 return false; | |
|             } | |
|         } | |
| 
 | |
|         $loader = $this->templating->getLoader(); | |
|         if ($loader instanceof ExistsLoaderInterface || method_exists($loader, 'exists')) { | |
|             return $loader->exists($template); | |
|         } | |
| 
 | |
|         try { | |
|             if (method_exists($loader, 'getSourceContext')) { | |
|                 $loader->getSourceContext($template); | |
|             } else { | |
|                 $loader->getSource($template); | |
|             } | |
| 
 | |
|             return true; | |
|         } catch (LoaderError $e) { | |
|         } | |
| 
 | |
|         return false; | |
|     } | |
| 
 | |
|     /** | |
|      * {@inheritdoc} | |
|      */ | |
|     public function getName() | |
|     { | |
|         return 'hinclude'; | |
|     } | |
| }
 | |
| 
 |