Добавление новой глобальной переменной в twig

Я пытаюсь получить данные для нового поля, добавленного на странице входа в систему. что я сделал:

  1. Изменение AccountController.phpфункции входа добавление нового параметра: $this->_app->login($user, $client, !empty($data['rememberme']))
  2. В Userfrosting.phpфункции входа я установил его в приложении: $this->client = $client;
  3. В setupTwigUserVariablesfuntion добавлен twig global: $twig->addGlobal("client", $this->client);

Проблема в том, что в шаблоне {{client.id}}ничего не возвращает. Любая помощь будет оценена по достоинству.

1 ответ

  1. В UserFrosting 4 необходимо создать расширение веточки в каталоге Sprinkle src/Twig/и добавить переменную в возвращаемое значениеgetGlobals.

    Ваша ситуация немного сложнее, так как я не уверен, как clientможет быть глобальной переменной, но в то же время зависеть от $data['client_id']— который кажется параметром запроса. На данный момент я предполагаю, что вы отправляете этот параметр с любыми запросами, для которых требуется clientпеременная.

    <?php
    /**
     * Stack Overflow
     *
     * @link      https://stackoverflow.com
     */
    namespace UserFrosting\Sprinkle\Site\Twig;
    
    use Interop\Container\ContainerInterface;
    use UserFrosting\Sprinkle\Site\Database\Models\Client;
    
    /**
     * Extends Twig functionality for the Site sprinkle.
     *
     * @author Jose Luis
     */
    class Extension extends \Twig_Extension
    {
    
        protected $services;
        protected $config;
    
        public function __construct(ContainerInterface $services)
        {
            $this->services = $services;
            $this->config = $services->config;
        }
    
        public function getName()
        {
            return 'myproject';
        }
    
        public function getGlobals()
        {
            try {
                $currentUser = $this->services->currentUser;
    
                // Assumes the client_id is being submitted as a query string (url) parameter
                $clientId = $this->services->request->getQueryParam('client_id');
    
                $client = Client::where('client_id', clientId)->where('userid', $currentUser->id)->first();
            } catch (\Exception $e) {
                $client = null;
            }
    
            return [
                'client' => $client
            ];
        }
    }
    

    Затем вам нужно будет зарегистрировать это расширение в классе поставщика услуг Sprinkle:

    <?php
    /**
     * Stack Overflow
     *
     * @link      https://stackoverflow.com
     */
    namespace UserFrosting\Sprinkle\Site\ServicesProvider;
    
    use UserFrosting\Sprinkle\Site\Twig\Extension as JoseExtension;
    
    /**
     * Services provider for the Site sprinkle.
     *
     * @author Jose Luis
     */
    class ServicesProvider
    {
        /**
         * Register extended user fields services.
         *
         * @param Container $container A DI container implementing ArrayAccess and container-interop.
         */
        public function register($container)
        {
            /**
             * Extends the 'view' service with Jose's Twig Extension.
             */
            $container->extend('view', function ($view, $c) {
                $twig = $view->getEnvironment();
                $extension = new JoseExtension($c);
                $twig->addExtension($extension);
    
                return $view;
            });
        }
    }
    

    Да, я знаю, что здесь много шаблонных листов. Однако после того, как вы настроили их в первый раз, легко добавить новые переменные/функции/фильтры в среду Twig и новые услуги в вашем Sprinkle в будущем.