diff --git a/Resources/config/edit_in_place.yml b/Resources/config/edit_in_place.yml index 802b5688..6d89c949 100644 --- a/Resources/config/edit_in_place.yml +++ b/Resources/config/edit_in_place.yml @@ -26,6 +26,9 @@ services: class: Translation\Bundle\Twig\TranslationExtension arguments: - '@php_translator.edit_in_place.xtrans_html_translator' + calls: + - [setActivator, ['@php_translation.edit_in_place.activator']] + - [setRequestStack, ['@request_stack']] tags: - { name: 'twig.extension' } diff --git a/Twig/TranslationExtension.php b/Twig/TranslationExtension.php index 57cc9668..f92acb2f 100644 --- a/Twig/TranslationExtension.php +++ b/Twig/TranslationExtension.php @@ -11,6 +11,9 @@ namespace Translation\Bundle\Twig; +use Symfony\Component\HttpFoundation\RequestStack; +use Translation\Bundle\EditInPlace\ActivatorInterface; + /** * Override the `trans` functions `is_safe` option to allow HTML output from the * translator. This extension is used by for the EditInPlace feature. @@ -19,17 +22,53 @@ */ class TranslationExtension extends \Symfony\Bridge\Twig\Extension\TranslationExtension { + /** + * @var ActivatorInterface + */ + private $activator; + + /** + * @var RequestStack + */ + private $requestStack; + /** * {@inheritdoc} */ public function getFilters() { return [ - new \Twig_SimpleFilter('trans', [$this, 'trans'], ['is_safe' => ['html']]), - new \Twig_SimpleFilter('transchoice', [$this, 'transchoice'], ['is_safe' => ['html']]), + new \Twig_SimpleFilter('trans', [$this, 'trans'], ['is_safe_callback' => [$this, 'isSafe']]), + new \Twig_SimpleFilter('transchoice', [$this, 'transchoice'], ['is_safe_callback' => [$this, 'isSafe']]), ]; } + /** + * Escape output if the EditInPlace is disabled. + * + * @return array + */ + public function isSafe($node) + { + return $this->activator->checkRequest($this->requestStack->getMasterRequest()) ? [] : ['html']; + } + + /** + * @param ActivatorInterface $activator + */ + public function setActivator(ActivatorInterface $activator) + { + $this->activator = $activator; + } + + /** + * @param RequestStack $requestStack + */ + public function setRequestStack(RequestStack $requestStack) + { + $this->requestStack = $requestStack; + } + /** * {@inheritdoc} */ diff --git a/composer.json b/composer.json index ad942acb..9aaf71fc 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "matthiasnoback/symfony-dependency-injection-test": "^1.0", "guzzlehttp/psr7": "^1.3", "nyholm/nsa": "^1.0", - "nyholm/symfony-bundle-test": "^1.0.1" + "nyholm/symfony-bundle-test": "^1.0.2" }, "suggest": { "php-http/httplug-bundle": "To easier configure your httplug clients."