valera Опубликовано 8 декабря, 2016 Жалоба Поделиться Опубликовано 8 декабря, 2016 Народ, подскажите, плж.. Как проще реализовать (или уже есть) следующие вещи: 1) Скидка для товара (Яндекс указывает если товар акционный)2) вывод связанных товаров в Яндекс (новая функция у них) заранее спасибо Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 8 декабря, 2016 Жалоба Поделиться Опубликовано 8 декабря, 2016 1. Нету 2. Нету Можно сделать, как обычно индивидуальным программированием\доработкой движка. Цитата Ссылка на сообщение Поделиться на другие сайты
Kasha Опубликовано 8 декабря, 2016 Жалоба Поделиться Опубликовано 8 декабря, 2016 По старой цене там очень много нюансов у яндекса. Со стороны симплы достаточно в файле yandex.php в корненайти // Товары$simpla->db->query("SET SQL_BIG_SELECTS=1");// Товары$simpla->db->query("SELECT v.price, v.id as variant_id, p.name as product_name, v.name as variant_name, v.position as variant_position, p.id as product_id, p.url, p.annotation, pc.category_id, i.filename as image FROM __variants v LEFT JOIN __products p ON v.product_id=p.id LEFT JOIN __products_categories pc ON p.id = pc.product_id AND pc.position=(SELECT MIN(position) FROM __products_categories WHERE product_id=p.id LIMIT 1) LEFT JOIN __images i ON p.id = i.product_id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1) WHERE p.visible AND p.yandex = 1 AND (v.stock >0 OR v.stock is NULL) GROUP BY v.id ORDER BY p.id, v.position ");print "Заменить на // Товары$simpla->db->query("SET SQL_BIG_SELECTS=1");// Товары$simpla->db->query("SELECT v.price, v.compare_price, v.id as variant_id, p.name as product_name, v.name as variant_name, v.position as variant_position, p.id as product_id, p.url, p.annotation, pc.category_id, i.filename as image FROM __variants v LEFT JOIN __products p ON v.product_id=p.id LEFT JOIN __products_categories pc ON p.id = pc.product_id AND pc.position=(SELECT MIN(position) FROM __products_categories WHERE product_id=p.id LIMIT 1) LEFT JOIN __images i ON p.id = i.product_id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1) WHERE p.visible AND p.yandex = 1 AND (v.stock >0 OR v.stock is NULL) GROUP BY v.id ORDER BY p.id, v.position ");print " и ниже изменить вывод $price = round($simpla->money->convert($p->price, $main_currency->id, false),2);print"".$simpla->config->root_url.'/products/'.$p->url.$variant_url."";print "$price".$currency_code."".$p->category_id.""; заменив на $price = round($simpla->money->convert($p->price, $main_currency->id, false),2);$old_price = round($simpla->money->convert($p->compare_price, $main_currency->id, false),2);print"".$simpla->config->root_url.'/products/'.$p->url.$variant_url."";print "$price";if (isset($old_price)) print "$old_price";print "".$currency_code."".$p->category_id.""; Но повторюсь пишут что там очень много нюансов... Цитата Ссылка на сообщение Поделиться на другие сайты
valera Опубликовано 9 декабря, 2016 Автор Жалоба Поделиться Опубликовано 9 декабря, 2016 спасибо за код с ценой, буду думать.. Киньте ссылку, если не сложно, где почитать про обсуждения Яндекс-скидок? Цитата Ссылка на сообщение Поделиться на другие сайты
valera Опубликовано 19 декабря, 2016 Автор Жалоба Поделиться Опубликовано 19 декабря, 2016 (изменено) подскажите, плж, как выполнить два SQL запроса один в другом... Написал такую штуку: print "<related>"; $prev=0; $simpla->db->query("SELECT related_id FROM s_related_products WHERE product_id=$prev_product_id"); while($m = $simpla->db->result()) { if ($prev) print ", "; print $m->related_id; $prev=1; }; print "</related>"; но выводит только один товар, т.к. результаты внутреннего запроса заменяют рез внешнего... PS: Это в yandex.php внешний цикл по товарам.. Изменено 19 декабря, 2016 пользователем valera Цитата Ссылка на сообщение Поделиться на другие сайты
valera Опубликовано 22 декабря, 2016 Автор Жалоба Поделиться Опубликовано 22 декабря, 2016 поясню, может так будет понятнее: // это основной запрос $simpla->db->query("SET SQL_BIG_SELECTS=1"); $simpla->db->query("SELECT v.price, v.id as variant_id, p.name as product_name, v.name as variant_name, v.position as variant_position, p.id as product_id, p.url, p.annotation, pc.category_id, i.filename as image FROM __variants v LEFT JOIN __products p ON v.product_id=p.id LEFT JOIN __products_categories pc ON p.id = pc.product_id AND pc.position=(SELECT MIN(position) FROM __products_categories WHERE product_id=p.id LIMIT 1) LEFT JOIN __images i ON p.id = i.product_id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1) WHERE p.visible AND (v.stock >0 OR v.stock is NULL) GROUP BY v.id ORDER BY p.id, v.position "); //внешний цикл по результатам первого запроса while($p = $simpla->db->result()) { print "<related>"; $prev=0; //внутренний запрос $simpla->db->query("SELECT related_id FROM s_related_products WHERE product_id=$prev_product_id"); //внуртренний цикл по результатам внутреннего запроса while($m = $simpla->db->result()) { if ($prev) print ", "; print $m->related_id; $prev=1; }; print "</related>"; } результат ожидаемый после выполнения внутреннего запроса результаты внешнего им заменяются.. Нужно, чтобы 2 запроса выполнялись независимо... Цитата Ссылка на сообщение Поделиться на другие сайты
Решение valera Опубликовано 22 декабря, 2016 Автор Решение Жалоба Поделиться Опубликовано 22 декабря, 2016 вопрос решен.. в результате создал нужный массив сначала работы, потом из него готовые строки вытягивал. <?php require_once('api/Simpla.php'); $simpla = new Simpla(); $related = array(); $relateddb = array(); header("Content-type: text/xml; charset=UTF-8"); // Заголовок print (pack('CCC', 0xef, 0xbb, 0xbf)); print "<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE yml_catalog SYSTEM 'shops.dtd'> <yml_catalog date='".date('Y-m-d H:m')."'> <shop> <name>".$simpla->settings->site_name."</name> <company>".$simpla->settings->company_name."</company> <url>".$simpla->config->root_url."</url> "; // вычисляем массив связанных товаров $simpla->db->query("SELECT product_id, related_id FROM s_related_products WHERE 1"); $i=0; while($p = $simpla->db->result()) { $relateddb[$i][0]=$p->product_id; $relateddb[$i][1]=$p->related_id; $i++; } $countrelateddb=count($relateddb); for ($i=0; $i<$countrelateddb; $i++) { if ($relateddb[$i][1]>0) { $countrelated=count($related); for ($j=0; $j<$countrelated&&($relateddb[$i][0]<>$related[$j][0]); $j++); if ($countrelated==$j) { $related[$j][0]=$relateddb[$i][0]; $related[$j][1]=(string)$relateddb[$i][1]; } else $related[$j][1]=$related[$j][1].",".(string)$relateddb[$i][1]; } } //конец вычисления массива связанных товаров // Валюты $currencies = $simpla->money->get_currencies(array('enabled'=>1)); $main_currency = reset($currencies); print "<currencies> "; foreach($currencies as $c) if($c->enabled) print "<currency id='".$c->code."' rate='".$c->rate_to/$c->rate_from*$main_currency->rate_from/$main_currency->rate_to."'/> "; print "</currencies> "; // Категории $categories = $simpla->categories->get_categories(); print "<categories> "; foreach($categories as $c) { print "<category id='$c->id'"; if($c->parent_id>0) print " parentId='$c->parent_id'"; print ">".htmlspecialchars($c->name)."</category> "; } print "</categories> "; // Товары $simpla->db->query("SET SQL_BIG_SELECTS=1"); // Товары $simpla->db->query("SELECT v.price, v.id as variant_id, p.name as product_name, v.name as variant_name, v.position as variant_position, p.id as product_id, p.url, p.annotation, pc.category_id, i.filename as image FROM __variants v LEFT JOIN __products p ON v.product_id=p.id LEFT JOIN __products_categories pc ON p.id = pc.product_id AND pc.position=(SELECT MIN(position) FROM __products_categories WHERE product_id=p.id LIMIT 1) LEFT JOIN __images i ON p.id = i.product_id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1) WHERE p.visible AND (v.stock >0 OR v.stock is NULL) GROUP BY v.id ORDER BY p.id, v.position "); print "<offers> "; $currency_code = reset($currencies)->code; // В цикле мы используем не results(), a result(), то есть выбираем из базы товары по одному, // так они нам одновременно не нужны - мы всё равно сразу же отправляем товар на вывод. // Таким образом используется памяти только под один товар $prev_product_id = null; while($p = $simpla->db->result()) { $variant_url = ''; if ($prev_product_id === $p->product_id) $variant_url = '?variant='.$p->variant_id; $prev_product_id = $p->product_id; $price = round($simpla->money->convert($p->price, $main_currency->id, false),2); print " <offer id='$p->variant_id' available='true'> <url>".$simpla->config->root_url.'/products/'.$p->url.$variant_url."</url>"; print " <price>$price</price> <currencyId>".$currency_code."</currencyId> <categoryId>".$p->category_id."</categoryId> "; if($p->image) print "<picture>".$simpla->design->resize_modifier($p->image, 200, 200)."</picture> "; print "<name>".htmlspecialchars($p->product_name).($p->variant_name?' '.htmlspecialchars($p->variant_name):'')."</name> <description>".htmlspecialchars(strip_tags($p->annotation))."</description> <rec>"; $countrelated=count($related); for ($j=0; ($j<$countrelated)&&$related[$j][0]<>$p->product_id; $j++); echo $related[$j][1]; print "</rec> </offer> "; } print "</offers> "; print "</shop> </yml_catalog> "; Цитата Ссылка на сообщение Поделиться на другие сайты
valera Опубликовано 23 декабря, 2016 Автор Жалоба Поделиться Опубликовано 23 декабря, 2016 обнаружился небольшой косяк.. в Яндекс выводится variant_id а связанные товары product_idрешил просто, тк. у меня нет связанных товаров:меняем<offer id='$p->variant_id' available='true'>на<offer id='$p->product_id' available='true'> Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.