Вход • Регистрация

Вывод общего количества товара по всем характеристикам для одного товара

  • 03 ноября 2015 г.
  • Здравствуйте.
    Товар имеет характеристики с количеством по ним. На главной странице возле каждого товара выводиться "на складе- 10 шт" правильно для каждого товара. Делается то в shop.view.rows.php кодом
    foreach ($result['rows'] as $row) {
    $text .= (!empty($row["rating"]) ? $row['rating'] : '') . ' На складе: '.$row["count"];
    }
    Мне нужно для правки страницы shop.yandex.php подсчитать в ней суммарное количество по каждому выводимому товару (что бы запретить присваивать цену 0 , если товар есть в одной из характеристик). Когда я вставляю туда вышеупомянутый код, то не получаю количества вообще - приходит пустота. Видимо неправильное обращение к базе. Можете ли кто подсказать, что нужно поправить, что бы получить результат. Спасибо.

    Мне нужно вывестиВывод общего количества товара по всем характеристикам для одного товара
  • 03 ноября 2015 г.
  • 2 варианта и они оба работают, если прописать его в shop.view.buy_form.php

    Вариант 1: $result["row"]["count"] - выведет общее количество товаров по всем характеристикам, можно прописать в любом месте файла shop.view.buy_form.php, например:

    echo 'Количество на складе: '.$result["row"]["count"];

    Вариант 2: $price["count"] - выводит отдельно количество по всем характеристикам, если у вас красных автомобилей 2, а черный - 3, к примеру.

    В этом случае надо работать в цикле

    foreach ($result["row"]["price_arr"] as $price) {....}

    Лучше вставлять внутри echo <div class="js_shop_param_price shop_param_price shop-item-price"'.$param_code.'></div>, чтобы при выборе характеристики тоже переключалось.
    • 03 ноября 2015 г.
    • Спасибо большое.
      Мне не нужно перечислять количества каждой характеристики. Второй вариант мне не подходит.
      В первом Вы говорите вставлять код в shop.view.buy_form.php . Но мне нужно вставить код в shop.yandex.php . Сейчас проверю будет работать.
    • 03 ноября 2015 г.
    • Не работает. Там применен способ вывода
      $text .=

      а echo - дает ошибку и файл YML не формируется
      • 03 ноября 2015 г.
      • Конечно, какое echo? Надо вместо echo писать $text .= тоже
        • 03 ноября 2015 г.
        • Да я писал через #text.=
          Перебрал массу вариантов, например
          $text.= ' Количество по всем характеристикам '.$count. 'шт'.;

          Не могу вывести количество / проблемма в том, что я не знаю как правильно подцепить это количество из базы.

          ПТ ответила, что мне придется передирать все характеристики с суммировать - это сложно для меня, к тому же они все равно не дали прямого обращения к базе, а сам я не умею еще догадываться.

          Но ведь на странице shop.view.rows.php кодом
          foreach ($result['rows'] as $row) {
          $text .= (!empty($row["rating"]) ? $row['rating'] : '') . ' На складе: '.$row["count"];
          }

          Все выводиться. Вот ссылка там видно какое количество в каждом товаре, суммарно, во всех характеристиках.
          Но Этот код не работает в shop.yandex.php
        • 04 ноября 2015 г.
        • Виталий, на Вас)) надежда. Никто так и не подсказал, как вывести суммарное количество по характеристикам товара.Если это действительно сложно, то черт с ним - буду руками править available.
          Но мне кажется, что нужно просто больше знать, чем я - у опытного пользователя есть подсказка ))) Заранее - Спасибо.
          • 07 ноября 2015 г.
          • Решил свою проблемму - сложил все количества характеристик

            $jkk=$prices[0]["count_goods"]+$prices[1]["count_goods"]+$prices[2]["count_goods"]+$prices[3]["count_goods"]+$prices[4]["count_goods"]+$prices[5]["count_goods"]+$prices[6]["count_goods"];

            Может Вы предложите более изящный код))))))))))))

            а потом заменил проверку на эту

            if(empty($prices) || $this->diafan->configmodules("use_count_goods", 'shop', $site_id) && empty($jkk) || $row["no_buy"])
            {
            $available = 'false';
            }
            else
            {
            $available = 'true';
            }


            Все заработало!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

            Всем Спасибо - не дали мне сдаться))))
    • 03 ноября 2015 г.
    • Заметил такое обращение в файле
      $this->diafan->configmodules("use_count_goods", 'shop', $site_id)
      но оно выводит неверное количество - всегда =1
      Пробовал менять на
      $this->diafan->configmodules("count_goods", 'shop', $site_id)
      Результат - пустота значения, не выводиться.


    • 03 ноября 2015 г. , редакция: 03 ноября 2015 г.
    • Вставил
      foreach ($result["row"]["price_arr"] as $price)
      {
      echo '<div class="js_shop_param_price shop_param_price shop-item-price">'. $price["count"] .'</div>'; }


      Не работает - результат пустота.

      • 03 ноября 2015 г.
      • не работает.
        Те кто кто умнее меня, подскажите пожалуйста ))))
  • 03 ноября 2015 г. , редакция: 03 ноября 2015 г.
  • Ни хера не понял...
    - Разве shop.yandex.php - не отвечает за вывод YML файла для яндекс маркета?
    - Зачем внем присваивать 0?
    - Цены сами из каталога вашего магазины берутся...
    - Для чего эти манипуляции? (Есля Яндекс проверит а он проверяет и цены расходятся - Вашему магазину будет предупреждение....)
    • 03 ноября 2015 г.
    • Внутри shop.yandex.php из коробки стоит проверка цены товара и его количества. Цену = 0 он не присваевает, это я ошибся. Он присваевает значение no-buy если количество нулевое. Именно в этом проблема. Как только количество одной из характеристик становиться 0, то товар сразу не продаваем и в выводе available=false, то есть товар не будет показан в яндекс маркете. Получается, что часть товаров исключается их индексирования по необъективной причине. За эту проверку отвечает код


      if(empty($prices) || $this->diafan->configmodules("use_count_goods", 'shop', $site_id) && ! $prices[0]["count_goods"] || $row["no_buy"])
      {
      $available = 'false';

      Можно мне и не выводить общее количество на страницу, для создания отдельного условия проверки. Достаточно подправить переменную в блоке сравнения $this->diafan->configmodules("use_count_goods", 'shop', $site_id), так, что бы это было суммарное количество по типу $row[count]
      • 03 ноября 2015 г. , редакция: 03 ноября 2015 г.
      • ну тупо - если думать нет время сделай так:
        Код
        $available = 'true'; // вместо фалсе

        и всё будет показываться...
        • 04 ноября 2015 г.
        • Когда количество будет равно 0 по всем характеристикам товара, нужно что-бы было false )))
          • 04 ноября 2015 г.
          • честно сказать я так и не пойму что вы хотите...
  • 05 ноября 2015 г. , редакция: 05 ноября 2015 г.
  • Цитата
    Виталий, на Вас)) надежда. Никто так и не подсказал, как вывести суммарное количество по характеристикам товара.Если это действительно сложно, то черт с ним - буду руками править available.
    Но мне кажется, что нужно просто больше знать, чем я - у опытного пользователя есть подсказка ))) Заранее - Спасибо.

    Эдуард (admin@gravity), я конечно не Виталий (DIAFAN.CMS), но все же:
    откройте редактором файл shop.yandex.php и в функцию
    Код
    private function get_offers() { ... }
    после строчки
    Код
    $cbid = ! empty($yandex["cbid"]) ? $yandex["cbid"] : $this->diafan->configmodules('cbid', 'shop', $site_id);
    просто вставьте эту
    Код
    if ($price <= 0) continue;

    Фуууф, устал. Больше кодить не надо, все задачи решились сами собой.
    Теперь поясняю:
    1. Товаров с ценой === 0 не будет.
    2. По правилам yandex.market в yml-файле больше одного товара с одинаковым названием не должно быть. Поэтому shop.yandex.php, когда генерит товары, то не выдает кресло (цвет - розовый) 10 руб., кресло (цвет - малиновый) 11 руб., а выдает только один раз - кресло 10 руб. При этом выбирается наилучшая цена. За то ответит функция
    Код
    $prices = $this->diafan->_shop->price_get_all($row["id"], 0);

    Вывод: Вам не требуется
    Цитата
    подсчитать в ней суммарное количество по каждому выводимому товару (что бы запретить присваивать цену 0 , если товар есть в одной из характеристик)
    , т.к. если он есть, то он обязательно будет ЕСТЬ.

    Александр Биг Эпл (ba5), Ваш вариант хорош, но не для shop.yandex.php,
    т.к. shop.yandex.php не включает в себя ни shop.php, ни shop.model.php, ни shop.view.buy_form.php (и вообще он не подвержен кастомизации, хотя это уточнение я привел только для информации). Поэтому Эдуард (admin@gravity) Вас и не понял, т.к. Вы (я полагаю) предлагали ему действовать по аналогии.
    • 07 ноября 2015 г. , редакция: 07 ноября 2015 г.
    • Большое спасибо. Я вставил Вами предложеный код и уверен, что если при формировании товара в одной из характеристик будет цена =0, этот код заставит перескочить нулевую цену. Хотя если цена =0, то уже имеющаяся штатная проверка

      if(empty($prices) || $this->diafan->configmodules("use_count_goods", 'shop', $site_id) && ! $prices[0]["count_goods"] || $row["no_buy"])
      {
      $available = 'false';......

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

      Но я борюсь не с нулевой ценой, я борюсь с нулевым количеством товара. У меня три цвета с одинаковой ценой в цвете. А shop.yandex.php читает всегда одну характеристику (не важно какую, цена одинакова, поэтому наверное по ID характеристики как-то выбирает) И когда продан этот цвет, то тот же вышеупомянутый код проверки делает available=false, хотя другие цвета Этого товара еще есть на складе. Я решил, что проще всего подтянуть общее количество товара по всем характеристикам и им вличть на доступность. Но так как это невозможно в shop.yandex.php, то может поставить подобный вашему код наподобие

      if ( $prices[0]["count_goods"]<= 0) continue;

      куда-то, что бы проверить вторую или третью характеристику на количество, а не на цену.

      Сам попробую потыкаться. потом отпишусь о результатах.

      Вам еще раз большое спасибо.
  • 07 ноября 2015 г.
  • Решил свою проблемму - сложил все количества характеристик

    $jkk=$prices[0]["count_goods"]+$prices[1]["count_goods"]+$prices[2]["count_goods"]+$prices[3]["count_goods"]+$prices[4]["count_goods"]+$prices[5]["count_goods"]+$prices[6]["count_goods"];

    Может Вы предложите более изящный код))))))))))))

    а потом заменил проверку на эту

    if(empty($prices) || $this->diafan->configmodules("use_count_goods", 'shop', $site_id) && empty($jkk) || $row["no_buy"])
    {
    $available = 'false';
    }
    else
    {
    $available = 'true';
    }


    Все заработало!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Всем Спасибо - не дали мне сдаться))))
  • 07 ноября 2015 г. , редакция: 07 ноября 2015 г.
  • Вывод количества для Яндекса в более лаконичнов виде . Проверка 20-ти характеристик товара и суммирование их значений:

    $total=0;
    for($n=0; $jn<20; $jj++)
    {$total=$total+$prices[$n]["count_goods"];
    }
    • 07 ноября 2015 г. , редакция: 07 ноября 2015 г.
    • Цитата
      Может Вы предложите более изящный код))))))))))))

      Учитывая, что здесь очень редко, но все же встречаются люди которые любят копи-пастить и не задумываться, то приведу полный вариант изменений.
      Отмечу, Эдуард (admin@gravity) это я не о Вас.
      И так, берем и открываем редактором файл /modules/shop/inc/shop.inc.price.php и с функцией
      Код
      public function get_all($good_id, $current_user = true) { ... }

      тварим следующее: в место строчки
      Код
      $this->cache["all"][$g_id] = array_merge($r_not_null, $r_null);

      пишем следующее:
      Код

      $c_not_null = array();
      $c_null = array();
      foreach ($r_not_null as $val)
      {
      if ($val["count_goods"])
      {
      $c_not_null[] = $val;
      }
      else
      {
      $c_null[] = $val;
      }
      }
      $this->cache["all"][$g_id] = array_merge($c_not_null, $c_null, $r_null);

      Далее как я ранее говорил, открываем редактором файл /modules/shop/shop.yandex.php и в функцию
      Код
      private function get_offers() { ... }

      после строчки
      Код
      $cbid = ! empty($yandex["cbid"]) ? $yandex["cbid"] : $this->diafan->configmodules('cbid', 'shop', $site_id);

      вставляем эту
      Код
      if ($price <= 0) continue;

      Вот и все, теперь самое главное: СБРОСТИ КЕШ
      А теперь лирика. Этими изменениями мы добились следующего:
      теперь в yandex.market не будут попадать товары равные нулю, а будут попадать товары с минимальной ценой. При этом будет учитываться количество товара. Т.е. раньше мог попасть товар с меньшей ценой, но с количеством равном нулю, то теперь этого не будет. Важно, если у товара вообще нет количества ни при одной из зависимых характеристик, то выбран будет товар с наименьшей ценой.
      Цитата
      Решил свою проблемму - сложил все количества характеристик

      $jkk=$prices[0]["count_goods"]+$prices[1]["count_goods"]+$prices[2]["count_goods"]+$prices[3]["count_goods"]+$prices[4]["count_goods"]+$prices[5]["count_goods"]+$prices[6]["count_goods"];

      Цитата
      $total=0;
      for($n=0; $jn<20; $jj++)
      {$total=$total+$prices[$n]["count_goods"];
      }

      Для меня это слишком круто. Эдуард (admin@gravity), я не в коем случае не говорю Вам делать так, как я написал (у всех свой подход). Но Ваш подход на мой взгляд ошибочен (если Вам будет интересно, то могу доказать)
      • 07 ноября 2015 г.
      • Спасибо Вам большое. Ваши правки кода много кому могут пригодиться. А то, что я написал - это не серьезно, так я вообще еле-еле соображаю в этом PHP ))). Заменю свой код на Ваш. Хотя подсчет количества оставлю, я его еще и вывожу на страницу яндекса - там можно добавить доп. информацию, вот я и добавляю, что на складе остаток этого товара 2 шт (например). Еще раз спасибо.
  • 07 ноября 2015 г.
  • А все же интересно, что плохого может вызвать мой метод?)) Наверное я в учет не принимаю некоторое сочетание цена-характеристика, при котором результат у меня будет ошибочным. Сам я не вижу такого варианта. Ведь я проверяю только количество, а на выбор минимальной цены не влияю- как было, так и осталось. Если ответите то в общих чертах, - не хочу больше отнимать у Вас время.
    • 08 ноября 2015 г. , редакция: 08 ноября 2015 г.
    • Лично меня смущает как Вы подсчитываете количество.
      Цитата

      $jkk=$prices[0]["count_goods"]+$prices[1]["count_goods"]+$prices[2]["count_goods"]+$prices[3]["count_goods"]+$prices[4]["count_goods"]+$prices[5]["count_goods"]+$prices[6]["count_goods"];

      Этот код не годится, т.к. в нем нет универсальности, которая бы не зависела от количества разновидностей товара (здесь под разновидностями я подразумеваю характеристики товара, которые влияют на цену и могут иметь свое значение, означающее количество товара с такай характеристикой), т.е. во всех товарах должно быть 7 разновидностей. Если включите режим разработчика, то увидите ошибки php, когда у товара будет меньше или больше 7 разновидностей.
      Цитата

      $total=0;
      for($n=0; $jn<20; $jj++)
      {$total=$total+$prices[$n]["count_goods"];
      }

      Этот код вообще уйдет в "петлю" (зацикливание) и вернется от туда только благодаря предусмотрительности разработчиков php и веб-серверов (уточню, под веб-сервером подразумеваю apache, и т.п., но не железо), при этом вернет результат равный количеству товара именно первой разновидности, а не общему количеству всех разновидностей. И почему Вы взяли что будет 20 разновидностей?
      И так, привожу Ваш код без ошибок (сравните самостоятельно)
      Код

      $total = 0; $len = count($prices);
      for($n = 0; $n < $len; $n++)
      {
      $total += $prices[$n]["count_goods"];
      }

      Аналогично можно так (даже лучше это делать с массивом именно так)
      Код

      $total=0;
      foreach ($prices as $val)
      {
      $total += $val["count_goods"];
      }

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

      вот я и добавляю, что на складе остаток этого товара 2 шт (например)

      Вы выводите количество не именно этого товара, а количество всех разновидностей товара. Если именно этого товара, то подсчет не нужен.
      Цитата
      Если ответите то в общих чертах, - не хочу больше отнимать у Вас время.

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

      $total = 0; $len = count($prices);
      for($n = 0; $n < $len; $n++)
      {
      $total += $prices[$n]["count_goods"];
      }

      и этим
      Код

      $total = 0;
      for($n = 0; $n < count($prices); $n++)
      {
      $total += $prices[$n]["count_goods"];
      }

      Второй код постоянно встречается во всех мануалах и теоретически правильный, но первый лучше. Почему?
      • 08 ноября 2015 г. , редакция: 08 ноября 2015 г.
      • Начну с последнего вопроса.
        Первый лучше второго наверное потому, что запрос количества цен вынесен за пределы цикла и поэтому он быстрей. Других отличий не вижу.

        Касаемо подсчета количества одного товара по всем его характеристикам - первый примитивный код тупого суммирования цен (с запасом 7 раз, так как у меня более 7 характеристик нигде не встречается) - это результат моего невежества. Потом порыл немного интернет и попробовал сделать цикл. В том числе я пробовал написать цикл перебора массива, но не получилось - неправильно обращался к переменным. Например $len = count($prices); я пытался узнать как $len = count($prices["count_goods"]); и массу прочего бреда писал, а написание сложения $total += для меня стало откровением..... Поэтому просто вставил 20 циклов сложения - это с запасом. На примере вашего кода понимаю, что я сделал не так. Поэтому на свете и существуют ученики и учителя))) Может сам я со временем пришел бы к более оптимальному коду в похожей задаче в следующий раз, но без ваших подсказок, наверняка мой собственный код навсегда поселился в моем shop.yandex.php, так как как правило нет надобности лезть туда, где все работает, хоть и не очень правильно. Большое Вам спасибо.

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке.