Перейти к содержанию
Официальный форум поддержки Simpla

Yandex выгрузка, вопрос по полям


Перейти к решению Решено valera,

Рекомендуемые сообщения

Народ, подскажите, плж.. Как проще реализовать (или уже есть) следующие вещи:

 

1) Скидка для товара (Яндекс указывает если товар акционный)

2) вывод связанных товаров в Яндекс (новая функция у них)

 

заранее спасибо

Ссылка на сообщение
Поделиться на другие сайты

По старой цене там очень много нюансов у яндекса. Со стороны симплы достаточно в файле 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."
";

 

Но повторюсь пишут что там очень много нюансов...

Ссылка на сообщение
Поделиться на другие сайты

спасибо за код с ценой, буду думать.. Киньте ссылку, если не сложно, где почитать про обсуждения Яндекс-скидок?

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...

подскажите, плж, как выполнить два 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 внешний цикл по товарам..

Изменено пользователем valera
Ссылка на сообщение
Поделиться на другие сайты

поясню, может так будет понятнее:

 

// это основной запрос
$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 запроса выполнялись независимо... 

Ссылка на сообщение
Поделиться на другие сайты
  • Решение

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

 

<?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>
";
Ссылка на сообщение
Поделиться на другие сайты

обнаружился небольшой косяк.. в Яндекс выводится variant_id а связанные товары product_id

решил просто, тк. у меня нет связанных товаров:

меняем

<offer id='$p->variant_id' available='true'>

на

<offer id='$p->product_id' available='true'>

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...