Как получить массив из smarty внутри JS Есть решение

Получаю список всех товаров с разбивкой по категориям вот так:

{foreach from=$categories item=category name=menu}
	{$category.name}
	{foreach from=$category.products item=product name=price}
		<a href="/{$product.url}">{$product.name} - {$product.price}</a>
	{/foreach}
{/foreach}

Пришло лето, жара -> озадачился))): как этот же массив товаров передать в переменную js?

Пробую вот так

var cats =  '{$categories}';

- отдает Array, как дальше его разложить средствами js?

11 ответов

  • 2
    Eugen Nichikov 29 мая 2016 01:04 # Решение

    Как-то так.

    var cats = {json_encode($categories)};

    P.S. Обычно, наоборот, прошу уйти с форума для разработчиков, но тут вопрос, похоже, для него :)

    https://developers.webasyst.ru/forum/


    • +1

      спасибо, массив теперь поддается расшифровке!

      по поводу p.s. так и не понял - радоваться теперь или огорчаться?

      ))))

      • +1

        1000 товаров - страница кешируется на 6Мб!!!. наверное, придется отказаться от формирования переменной..

        хотя браузер открывает страницу очень быстро...

        массив этот нужен был для выбора на стороне клиента - жмет на кнопку категории - ему отдается список товаров этой категории. ajax щупать? есть рабочее решение, аджаксом отправляю АЙДИ категории, в ответ получаю список товаров, но запрос идет на самодельный файл с прямым подключением в базу, хотелось бы уйти от такого варианта и использовать системное подключение к базе.

        или все-таки создание-хранение огромной переменной в браузере не так страшен черт как его малюют?

        • +2
          BNP (Дмитрий) BNP (Дмитрий) 29 мая 2016 12:29 #

          Прямое подключение к базе? оО, мсье знает толк в извращениях =)

          Для реализации задуманного достаточно использовать системный класс shopProductsCollection. Что-то типа:

          $collection = new shopProductsCollection('category/100500');
          $products = $collection->getProducts('*');

          Рекомендую класс к изучению, т.к. там реализовано много чего полезного ;)


        • +2
          Eugen Nichikov Eugen Nichikov 30 мая 2016 11:37 #

          Мне кажется, тогда проблема не в создании переменной из 1000 товаров, а в самом подходе к решению задачи :)

          Как минимум, можно передавать в JS только нужные данные (Id и название??). Или вам вообще всё и сразу надо? 0_о


          • +1

            из товаров нужно название, цена, наличие (есть/нет) и по возможности ID категории, которой принадлежит товар.

            было бы интересно увидеть, как можно сразу отсекать лишнее??? там действительно массив огромный на выходе, хотя вот в браузере все отрабатывает очень быстро... надо на смартфонах попробовать, пока еще массив в исходном огромном состоянии, пока мы его еще не усекли СОВМЕСТНЫМИ ДРУЖНЫМИ усилиями!!)))

            • +2
              Eugen Nichikov Eugen Nichikov 30 мая 2016 15:20 #

              ну зависит от того как и где этот массив получен.

              Для коллекций Дмитрий показал хороший вариант. В метод

              $collection->getProducts('id,name,price,count,category_id');

              можно первым параметром передать список полей.

              В крайнем случае пройтись по циклу и сформировать новый массив.

              • +1

                я про массив в js -

                var cats = {json_encode($categories)};
                • +1
                  Eugen Nichikov Eugen Nichikov 30 мая 2016 16:48 #

                  И я о нём. Несмотря на то, что у вас то с категориями, то с продуктами проблема.

                  Откуда $categories? Прежде чем тупо переменную кодировать нужно либо изменить логику её формирования, либо создать новую нужную переменную.


                  Хотя я начинаю догадываться, что вы слабо представляете как работает Смарти и почему вы получили Array в самом начале :)

                  • +1

                    Переменная формируется в плагине pricepage, вывожу все эти эксперименты на соответствующей странице, про контроллеры немного читал, давайте еще нападайте на новичка))) Сразимся потом на каком-нибудь форуме для верстальщиков)))) Я вам покажу где nth-child зимует!!)))

                    Мне как бы достаточно почитать пару дней и логика смарти предстала во всей красе, ну что вы в самом деле, уж если я компоненты от не к ночи помянутого битрикса щелкаю на 1-2-3... Целиком осваивать смарти буду по мере потребностей, преждевременная оптимизация не мой конек)))

                    • +1
                      Eugen Nichikov Eugen Nichikov 30 мая 2016 21:56 #

                      Плагин pricepage ваш?

                      Как-то же вы в шаблон переменную передали? В контроллере/экшене

                      $this->view->assign('category', $php_variable_category);

                      Вот с php-переменной и надо работать.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите