Как получить текущий счетчик массива сеанса в ветке? - PullRequest
1 голос
/ 23 октября 2019

В моем файле начальной загрузки, где я создаю экземпляр моей ветки, у меня есть:

$twig->addGlobal('cart', $session->get('cart'));

и в верхней панели навигации моей ветки у меня есть значок, чтобы показать, сколько предметов добавлено в корзину, как показано ниже:

{{ cart|length }}

и мой основной файл, который вызывается после файла начальной загрузки, который я сказал выше, у меня есть:

if (!empty($_getvars['id'])) {
    $data = $session->get('cart');
    if(!isset($data[$_getvars['id']])) {
        $data[$_getvars['id']] = 0;
    }
    $data[$_getvars['id']] += 1;
    $session->set('cart', $data);
} 
print_r($session->get('cart'));

добавление к сеансам работает нормально, а отладка печати выше показывает, что она точна,но в верхнем значке навигационной панели я всегда получаю предыдущее количество предметов, а не текущее количество, если в противном случае я не обновляю страницу, чтобы показать текущее. Как это исправить?

1 Ответ

5 голосов
/ 23 октября 2019

Вместо того, чтобы устанавливать глобальную переменную ветки, читайте непосредственно из сеанса в шаблоне так:

{% set cart = app.session.get('cart') %}
{{ cart|length }}

Или просто:

{{ app.session.get('cart')|length }}

Это должно дать вам обновленное значение (после того, как действие контроллера обработало данные).

Однако, глядя на ваши связанные вопросы, я думаю, что вы хотите array_sum() вместо length, в ветке вы можете использовать фильтр reduce:

{{ app.session.get('cart')|reduce((carry, v) => carry + v) }}

Суммирует все количественные значения в массиве корзины (общее количество товаров против количества уникальных товаров с length)

РЕДАКТИРОВАТЬ:
Для автономного приложения, как упомянуто DarkBee, вы можете просто добавить объект сеанса как глобальный вместо значения корзины сеанса.

$twig->addGlobal('session', $session);

Затем в шаблоне:

{{ session.get('cart')|length }}
{# Or #}
{{ session.get('cart')|reduce((carry, v) => carry + v)}}
...