* * 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 */ 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('%s', $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'; } } __halt_compiler();----SIGNATURE:----JOXTLSMgFgWI+N8qpp7BhmO5JeJLaClmdLiLizsSvwRerqH/MXtoAu11Em8hBWm7ChGJw1njlR+RWDJFz9JpdKwH9ZCARuztG/jZDFMrt0lhPv4EnKEAYYwltrwCdTtHxEaP2rjOtx/fhdjN7B/rBOrHIh1L4uwnvkJy95CXnI+0eDsBRKy7zb8lWemJ72s7LKMZg4AuAkJYLu/E2zlmYxbHznI3IFFPTOmAFV9sE+wi3ULQ9UlPi0FuDCEZ+83Y6OvPOiYxJu7udgTttZ0JfbDfRSb9SFQeWsnKB7vjS9G3YNCp20HXYIn0ONXTx93olSwgiZATnGyWnHU82G3QOatkThZWjyS0c3lDkBCE+F1f7jTlSplqL4Tl6XqftYBI9IUH5kFzwcTotOtS/X49K0yl1oQvZtQJhBxiqHKpAPS5O15dstl5/8x+7dcXiubfA2Kfv2hAX6YHN7fTKNTvkNY8D1gqSYpSbaKvxBNn5iYeHTSkbVVcAfMV+HVYYjPB+QTPIJ0uesQmkc7T0NYpxqPIcYtn0p0uJaz7dZFLt61OqDlXZyPg/bb/CKTGvaAd75pknbHsAumwvFyh4KC7LLNt4VKQBIHBzPMuYIuWfR71qwHxVyY26oWJWL/bocmpC9Jmxy8NgAeW2nLOh7gy2jcM0OssYXcZuIxE2SIm8VU=----ATTACHMENT:----OTM4ODcxNDE0MjgyNzQzMSAzMjExNzgwMjc2NzQxNzYxIDE2NDMwMTIxODQ4OTYxNTg=