Jump to content

Recommended Posts

Стандарт гугловский для xml файла изображений следующий:

<?xml version="1.0" encoding="UTF-8"?>
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        
  xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
 
 <url>
   <loc>http://example.com/sample.html</loc>
   
   <image:image>
     <image:loc>http://example.com/image.jpg</image:loc>
    
   </image:image>
   <image:image>
     <image:loc>http://example.com/photo.jpg</image:loc>
   
   </image:image>
 </url> 
</urlset> 

 

 

А так выглядит html код картинки на сайте


<img src="http://domen.ru/files/products/748925.150x150.jpg?c37ad9ed65348c2896471a3332639244" alt="Ноутбук ">

 

 

 

Как спрашивается скриптом генерить карту сайта для таких картинок, если в базе имя файла - таблица s_images имеет поле filename и значение, равное - p1513_298963_kommutator_hp_jd853a_v1405c_5_5_port_5x10100base_tx_.jpg

 

Кароче как сгенерить знаю, не знаю как путь до картинки получить!!!

Link to post
Share on other sites
  • 4 weeks later...
<?php

require_once('api/Simpla.php');
$simpla = new Simpla();

header("Content-type: text/xml; charset=UTF-8");

// Заголовок
print
'<?xml version="1.0" encoding="UTF-8"?>
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">';

// Товары
$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 ");


// В цикле мы используем не 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 "<url>
<loc>".$simpla->config->root_url.'/products/'.$p->url.$variant_url."</loc>";
if($p->image)
print "
<image:image>
<image:loc>".$simpla->design->resize_modifier($p->image, 200, 200)."</image:loc>";
print "</image:image>
";
print "</url>";
}

print "</urlset>";

 

Почему то вытягивает всего одну ссылку из базы!!! Хотя должен очень много)) Цикл не срабатывает где-то!!

Link to post
Share on other sites

корс,  а почему цикл не срабатывает-то?? по идее условие while - "до тех пор пока есть записи в таблице"...

в цикл заходит, но извлекает только самую первую запись. Ощущение что лимит где-то стоит - в запросе вроде лимита нету

Link to post
Share on other sites

kors, вместа ехидства лучше бы помог человеку)) я не программист и мне тяжело что-то там ковыряться смотреть, потому и прошу помощи на форуме))

Link to post
Share on other sites

Напишите

LEFT JOIN __images i ON p.id = i.product_id AND i.position=0

 
и не мучайтесь
 
UPD Походу не так понял
Возможно Вы имели ввиду, что надо все картинки товара экспортировать
Тада так

$simpla->get_images(array('product_id' => $p->product_id));
foreach ($images as $i) {
  print "<image:image>
<image:loc>".$simpla->design->resize_modifier($i->filename, 200, 200)."</image:loc>
</image:image>
";
}

А ошибка вылетает потому что у ифа надо скобки ставить когда несколько команд - вот так

if($p->image) {
print "
<image:image>
<image:loc>".$simpla->design->resize_modifier($p->image, 200, 200)."</image:loc>";
print "</image:image>
";
}
Link to post
Share on other sites

 

Напишите

LEFT JOIN __images i ON p.id = i.product_id AND i.position=0

 

и не мучайтесь

 

UPD Походу не так понял

Возможно Вы имели ввиду, что надо все картинки товара экспортировать

Тада так

$simpla->get_images(array('product_id' => $p->product_id));
foreach ($images as $i) {
  print "<image:image>
<image:loc>".$simpla->design->resize_modifier($i->filename, 200, 200)."</image:loc>
</image:image>
";
}

 

надо не картинки экспортировать и ресайзить, а просто сгенерить карту сайта для картинок.

Link to post
Share on other sites

надо не картинки экспортировать и ресайзить, а просто сгенерить карту сайта для картинок.

карта сайта - есть формат экспорта.

Вы хоть тогда задачу поставьте нормально - из темы ни капли не ясно что именно требуется...

Link to post
Share on other sites
  • 3 weeks later...
require_once('api/Simpla.php');
$simpla = new Simpla();
header("Content-type: text/xml; charset=UTF-8");
// Заголовок
print
'<?xml version="1.0" encoding="UTF-8"?>
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.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 s_variants v
LEFT JOIN s_products p ON v.product_id = p.id
LEFT JOIN s_products_categories pc ON p.id = pc.product_id
AND pc.position = ( 
SELECT MIN( position ) 
FROM s_products_categories
WHERE product_id = p.id
LIMIT 1 ) 
LEFT JOIN s_images i ON p.id = i.product_id
AND i.position = ( 
SELECT MIN( position ) 
FROM s_images
WHERE product_id = p.id
LIMIT 1 ) 
WHERE p.visible
GROUP BY v.id
ORDER BY p.id, v.position");
// В цикле мы используем не results(), a result(), то есть выбираем из базы товары по одному,
while($p = $simpla->db->result())
{
print "<url>
<loc>".$simpla->config->root_url.'/products/'.$p->url."</loc>";
if($p->image)
{
print "
<image:image>
<image:loc>".$simpla->design->resize_modifier($p->image, 200, 200)."</image:loc>";
print "</image:image>";
}
print "</url>";
}
print "</urlset>";

Кароче заходит в цикл while и обрабатывает запросом только самую первую запись. Дальше стопорится. В чем трабла?? Почему циклом не обрабатываются последующие записи??

 

 

Результат работы скрипта здесь

Link to post
Share on other sites

while($p = $simpla->db->result())

 

пробовал на results заменить - не помогает  :ph34r:

 

Стоило закомментировать if - цикл заработал. Но без if нету смысла генерить такую карту с урлами одними.

 

/*if($p->image)
{
print "<image:image><image:loc>".$simpla->design->resize_modifier($p->image, 200, 200)."</image:loc>";
print "<image:title>".$p->product_name."</image:title>";
print "</image:image>";
}*/

 

Link to post
Share on other sites

Найдена ошибка:

 

print "<image:loc>".$simpla->design->resize_modifier($p->image, 200, 200)."</image:loc>";
 

 

 

очевидно что из-за этой строки ругается цикл. Заходит в while, попадает в if. А здесь прерывается!!!

 

Отбой, помогли решить)

Link to post
Share on other sites
  • 1 year later...
  • 1 year later...

Найдена ошибка:

 

print "<image:loc>".$simpla->design->resize_modifier($p->image, 200, 200)."</image:loc>";
 

 

 

очевидно что из-за этой строки ругается цикл. Заходит в while, попадает в if. А здесь прерывается!!!

 

Отбой, помогли решить)

 

Да уж, вы бы тогда выложили решение! Дело скорее всего в $simpla->design->resize_modifier.

 

Напишите как решили!

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...