Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.
Вывод общего количества товара по всем характеристикам для одного товара
-
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 г.
-
Ни хера не понял...
- Разве 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] -
-
-
-
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) Вас и не понял, т.к. Вы (я полагаю) предлагали ему действовать по аналогии. -
-
Поблагодарили: Эдуард (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 г.
-
Скриншоты
-
-
-
-
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), я не в коем случае не говорю Вам делать так, как я написал (у всех свой подход). Но Ваш подход на мой взгляд ошибочен (если Вам будет интересно, то могу доказать) -
-
Поблагодарили: Александр (sven4ig)
-
-
-
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 уже доступна к установке.
Блоги
-
24.04.2024
-
Выпустили новую сборку DIAFAN.CMS 7.1.4.
Блоги
-
12.01.2024
-
В данном руководстве познакомим вас с панелью управления DIAFAN.CMS