Как переключить php-перевод / symfony-bundle в Symfony EditInPlace - PullRequest
0 голосов
/ 13 ноября 2018

Я следовал этой документации для Редактировать на месте и настроить Активатор , и это работает!

Однако я будуиспользуя это на производственной площадке и разрешая доступ через ROLE_TRANSLATOR Авторизацию.Это также работает, но я не хочу, чтобы веб-интерфейс всегда был включен

Как бы я включил его с помощью какой-либо ссылки или переключения?

Мои мысли , было бы просто добавить параметр URL, например ?trans=yes, а затем в активатор;

return ($this->authorizationChecker->isGranted(['ROLE_TRANSLATOR']) && $_GET['trans'] == 'yes');

Очевидно, $_GET не будет работать, ядаже не пытался.

  1. Как сгенерировать ссылку, чтобы просто перезагрузить ЭТУ страницу с дополнительным параметром URL
  2. Как проверить этот параметр в «Активаторе»

или, есть ли лучший способ?

1 Ответ

0 голосов
/ 15 ноября 2018

«Правильный» способ сделать это, как я узнал больше о «услугах», заключается в прямом выполнении логики в файле RoleActivator.php .

справочная документация для Как внедрить переменные во все шаблоны с помощью служб ссылок Я нашел следующее решение;

ЦСИ / Безопасность / RoleActivator.php

<?php

namespace App\Security;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Translation\Bundle\EditInPlace\ActivatorInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\RequestStack;

class RoleActivator implements ActivatorInterface
{
    /**
     * @var AuthorizationCheckerInterface
     */
    private $authorizationChecker;
    /**
     * @var TranslatorInterface
     */
    private $translate;
    /**
     * @var RequestStack
     */
    private $request;
    private $params;
    private $path;

    private $flag = null;

    public function __construct(AuthorizationCheckerInterface $authorizationChecker, TranslatorInterface $translate, RequestStack $request)
    {
        $this->authorizationChecker = $authorizationChecker;
        $this->translate = $translate;
        $this->request = $request;
    }

    /**
     * {@inheritdoc}
     */
    public function checkRequest(Request $request = null)
    {
        if ($this->flag === null) { $this->setFlag($request); }
        try {
            return ($this->authorizationChecker->isGranted(['ROLE_TRANSLATOR']) && $this->flag);
        } catch (AuthenticationCredentialsNotFoundException $e) {
            return false;
        }
    }

    public function getText()
    {
        if ($this->flag === null) { $this->setFlag(); }
        return ($this->flag) ? 'linkText.translate.finished' : 'linkText.translate.start'; // Translation key's returned
    }

    public function getHref()
    {
        if ($this->flag === null) { $this->setFlag(); }
        $params = $this->params;
        if ($this->flag) {
            unset($params['trans']);
        } else {
            $params['trans'] = 'do';
        }
        $queryString = '';
        if (!empty($params)) {
            $queryString = '?';
            foreach ($params as $key => $value) {
                $queryString.= $key.'='.$value.'&';
            }
            $queryString = rtrim($queryString, '&');
        }
        return $this->path.$queryString;
    }

    private function setFlag(Request $request = null)
    {
        if ($request === null) {
            $request = $this->request->getCurrentRequest();
        }
        $this->flag = $request->query->has('trans');
        $this->params = $request->query->all();
        $this->path = $request->getPathInfo();
    }
}

config \ packages \ twig.yaml

twig:
    # ...
    globals:
        EditInPlace: '@EditInPlace_RoleActivator'

конфиг \ services.yaml

services:
    # ...
    EditInPlace_RoleActivator:
        class: App\Security\RoleActivator
        arguments: ["@security.authorization_checker"]

Итак, я добавил сверх примера php-перевода методы getText и getHref и соответствующие переменные private, которые устанавливаются в checkRequest и читаются там после.

Теперь в моем шаблоне ветки (в шапке) я просто использую

{% if is_granted('ROLE_TRANSLATOR') %}
    <a href="{{ EditInPlace.Href }}">{{ EditInPlace.Text }}</a>
{% endif %}

Добавьте новые ключи в файлы перевода и все готово. параметр запроса trans=do включается и выключается при каждом нажатии на ссылку. Вы даже можете добавить переключаемые стили с именем класса, просто скопируйте метод getText в что-то вроде getClass и верните строку a или b с троичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...