mishanya Опубликовано 19 февраля, 2016 Жалоба Поделиться Опубликовано 19 февраля, 2016 (изменено) Часто возникает потребность добавить вторые связанные товары, вот одно из решений. 1. выполнить запрос в базу CREATE TABLE `s_self_products` ( `product_id` int(11) NOT NULL, `related_id` int(11) NOT NULL, `position` int(11) NOT NULL, PRIMARY KEY (`product_id`,`related_id`), KEY `position` (`position`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 2. в simpla/design/html/product.tpl после ф-и добавления связанного товара (255 строка примерно) добавляем // Добавление мост товара var new_self_product = $('#new_self_product').clone(true); $('#new_self_product').remove().removeAttr('id'); $("input#self_products").autocomplete({ serviceUrl:'ajax/search_products.php', minChars:0, noCache: false, onSelect: function(suggestion){ $("input#self_products").val('').focus().blur(); new_item = new_self_product.clone().appendTo('.self_products'); new_item.removeAttr('id'); new_item.find('a.self_product_name').html(suggestion.data.name); new_item.find('a.self_product_name').attr('href', 'index.php?module=ProductAdmin&id='+suggestion.data.id); new_item.find('input[name*="self_products"]').val(suggestion.data.id); if(suggestion.data.image) new_item.find('img.product_icon').attr("src", suggestion.data.image); else new_item.find('img.product_icon').remove(); new_item.show(); }, formatResult: function(suggestions, currentValue){ var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g'); var pattern = '(' + currentValue.replace(reEscape, '\\$1') + ')'; return (suggestions.data.image?"<img align=absmiddle src='"+suggestions.data.image+"'> ":'') + suggestions.value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>'); } }); 3. в simpla/design/html/product.tpl после ф-и удаления связанного товара (222 строка примерно) добавляем // Удаление мост товара $(".self_products a.delete").live('click', function() { $(this).closest("div.row").fadeOut(200, function() { $(this).remove(); }); return false; }); 4. в simpla/design/html/product.tpl после блока связанных товаров (736 строка примерно) добавляем <div class="block layer"> <h2>С этим товаром покупают</h2> <div id=list class="sortable self_products"> {foreach $self_products as $self_product} <div class="row"> <div class="move cell"> <div class="move_zone"></div> </div> <div class="image cell"> <input type=hidden name=self_products[] value='{$self_product->id}'> <a href="{url id=$self_product->id}"> <img class=product_icon src='{$self_product->images[0]->filename|resize:35:35}'> </a> </div> <div class="name cell"> <a href="{url id=$self_product->id}">{$self_product->name}</a> </div> <div class="icons cell"> <a href='#' class="delete"></a> </div> <div class="clear"></div> </div> {/foreach} <div id="new_self_product" class="row" style='display:none;'> <div class="move cell"> <div class="move_zone"></div> </div> <div class="image cell"> <input type=hidden name=self_products[] value=''> <img class=product_icon src=''> </div> <div class="name cell"> <a class="self_product_name" href=""></a> </div> <div class="icons cell"> <a href='#' class="delete"></a> </div> <div class="clear"></div> </div> </div> <input type=text name=self id='self_products' class="input_autocomplete" placeholder='Выберите товар чтобы добавить его'> </div> 5. в simpla/ProductAdmin.php добавить после $related_products = array(); код $self_products = array(); 6. в том же файле после блока связанных товаров (строка 86) добавляем // Мост товары if(is_array($this->request->post('self_products'))) { foreach($this->request->post('self_products') as $p) { $sp[$p] = new stdClass; $sp[$p]->product_id = $product->id; $sp[$p]->related_id = $p; } $self_products = $sp; } 7. ПЕРЕД строкой в том же файле $query = $this->db->placehold('DELETE FROM __related_products WHERE product_id=?', $product->id); добавляем новые связанные товары: // Связанные товары $query = $this->db->placehold('DELETE FROM __self_products WHERE product_id=?', $product->id); $this->db->query($query); if(is_array($self_products)) { $pos = 0; foreach($self_products as $i=>$self_product) $this->products->add_self_product($product->id, $self_product->related_id, $pos++); } 8. в том же файле ПОСЛЕ $related_products = $this->products->get_related_products(array('product_id'=>$product->id)); добавить $self_products = $this->products->get_self_products(array('product_id'=>$product->id)); 9. в том же файле ПЕРЕД $this->design->assign('product', $product); добавляем if(!empty($self_products)) { foreach($self_products as &$s_p) $s_products[$s_p->related_id] = &$s_p; $temp_products = $this->products->get_products(array('id'=>array_keys($s_products))); foreach($temp_products as $temp_product) $s_products[$temp_product->id] = $temp_product; $self_products_images = $this->products->get_images(array('product_id'=>array_keys($s_products))); foreach($self_products_images as $image) { $s_products[$image->product_id]->images[] = $image; } } 10. в этом же файле ПОСЛЕ $this->design->assign('related_products', $related_products); добавим $this->design->assign('self_products', $self_products); 11. в файл api/Products.php добавить новые ф-и для новых связанных товаров public function get_self_products($product_id = array()) { if(empty($product_id)) return array(); $product_id_filter = $this->db->placehold('AND product_id in(?@)', (array)$product_id); $query = $this->db->placehold("SELECT product_id, related_id, position FROM __self_products WHERE 1 $product_id_filter ORDER BY position "); $this->db->query($query); return $this->db->results(); } public function add_self_product($product_id, $related_id, $position=0) { $query = $this->db->placehold("INSERT IGNORE INTO __self_products SET product_id=?, related_id=?, position=?", $product_id, $related_id, $position); $this->db->query($query); return $related_id; } public function delete_self_product($product_id, $related_id) { $query = $this->db->placehold("DELETE FROM __self_products WHERE product_id=? AND related_id=? LIMIT 1", intval($product_id), intval($related_id)); $this->db->query($query); } 12. в файл api/Products.php в ф-и удаления товара добавляем удаления вторых связанных товаров. ПЕРЕД (329 строка) $related = $this->get_related_products($id); добавим $this->db->query('DELETE FROM __self_products WHERE product_id=?', intval($id)); $this->db->query('DELETE FROM __self_products WHERE related_id=?', intval($id)); 13. в файл api/Products.php в функцию дублирования товара ПЕРЕД (примерно 394) // Дублируем связанные товары добавляем $self = $this->get_self_products($id); foreach($self as $s) $this->add_self_product($new_id, $s->related_id); 14. для вывода на сайте в view/ProductView.php ПЕРЕД (строка примерно 101) // Связанные товары $related_ids = array(); добавить // Связанные товары $self_ids = array(); $self_products = array(); foreach($this->products->get_self_products($product->id) as $p) { $self_ids[] = $p->related_id; $self_products[$p->related_id] = null; } if(!empty($self_ids)) { foreach($this->products->get_products(array('id'=>$self_ids, 'in_stock'=>1, 'visible'=>1)) as $p) $self_products[$p->id] = $p; $self_products_images = $this->products->get_images(array('product_id'=>array_keys($self_products))); foreach($self_products_images as $self_product_image) if(isset($self_products[$self_product_image->product_id])) $self_products[$self_product_image->product_id]->images[] = $self_product_image; $self_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($self_products), 'in_stock'=>1)); foreach($self_products_variants as $self_product_variant) { if(isset($self_products[$self_product_variant->product_id])) { $self_products[$self_product_variant->product_id]->variants[] = $self_product_variant; } } foreach($self_products as $id=>$s) { if(is_object($s)) { $s->image = &$s->images[0]; $s->variant = &$s->variants[0]; } else { unset($self_products[$id]); } } $this->design->assign('self_products', $self_products); } 15. в шаблоне выводить как вам нужно (переменная $self_products) например так: {if $self_products} <h2>С товаром покупают</h2> <!-- Список каталога товаров--> <ul class="tiny_products"> {foreach $self_products as $self_product} <!-- Товар--> <li class="product"> <!-- Фото товара --> {if $self_product->image} <div class="image"> <a href="products/{$self_product->url}"><img src="{$self_product->image->filename|resize:200:200}" alt="{$self_product->name|escape}"/></a> </div> {/if} <!-- Фото товара (The End) --> <!-- Название товара --> <h3><a data-product="{$self_product->id}" href="products/{$self_product->url}">{$self_product->name|escape}</a></h3> <!-- Название товара (The End) --> {if $self_product->variants|count > 0} <!-- Выбор варианта товара --> <form class="variants" action="/cart"> <table> {foreach $self_product->variants as $v} <tr class="variant"> <td> <input id="self_{$v->id}" name="variant" value="{$v->id}" type="radio" class="variant_radiobutton" {if $v@first}checked{/if} {if $self_product->variants|count<2} style="display:none;"{/if}/> </td> <td> {if $v->name}<label class="variant_name" for="self_{$v->id}">{$v->name}</label>{/if} </td> <td> {if $v->compare_price > 0}<span class="compare_price">{$v->compare_price|convert}</span>{/if} <span class="price">{$v->price|convert} <span class="currency">{$currency->sign|escape}</span></span> </td> </tr> {/foreach} </table> <input type="submit" class="button" value="в корзину" data-result-text="добавлено"/> </form> <!-- Выбор варианта товара (The End) --> {else} Нет в наличии {/if} </li> <!-- Товар (The End)--> {/foreach} </ul> {/if} Скриншоты:- https://yadi.sk/i/WXrWMlJfp86jm- https://yadi.sk/i/oHtXhCzLp86vy- https://yadi.sk/i/L4welKw1p8DQ8 Изменено 19 февраля, 2016 пользователем mishanya Цитата Ссылка на сообщение Поделиться на другие сайты
Evgen81 Опубликовано 19 февраля, 2016 Жалоба Поделиться Опубликовано 19 февраля, 2016 Круто "респект" возьму на заметку, а есть скриншот как это будет выглядеть после прохождения всей инструкции? Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 19 февраля, 2016 Автор Жалоба Поделиться Опубликовано 19 февраля, 2016 Круто "респект" возьму на заметку, а есть скриншот как это будет выглядеть после прохождения всей инструкции? выше добавил в конец скриншоты. Цитата Ссылка на сообщение Поделиться на другие сайты
trainracing Опубликовано 2 марта, 2016 Жалоба Поделиться Опубликовано 2 марта, 2016 Спасибо за доработку) полезная вещь Цитата Ссылка на сообщение Поделиться на другие сайты
MStyle28 Опубликовано 4 марта, 2016 Жалоба Поделиться Опубликовано 4 марта, 2016 Спасибо,отличное решение! Цитата Ссылка на сообщение Поделиться на другие сайты
daramal Опубликовано 27 марта, 2017 Жалоба Поделиться Опубликовано 27 марта, 2017 Спасибо большое,mishanya!Ты как всегда на высоте! Цитата Ссылка на сообщение Поделиться на другие сайты
pronin Опубликовано 29 апреля, 2017 Жалоба Поделиться Опубликовано 29 апреля, 2017 (изменено) Делаю всё по инструкции. Однако в базу не добавляет related_id, соответственно связанный товар2 не отображается (из админки ссылка на товар так же идет без id). Подскажите, как выявить проблему и исправить? файлы не могу прикрепить... Изменено 29 апреля, 2017 пользователем pronin Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 29 апреля, 2017 Автор Жалоба Поделиться Опубликовано 29 апреля, 2017 Делаю всё по инструкции. Однако в базу не добавляет related_id, соответственно связанный товар2 не отображается (из админки ссылка на товар так же идет без id). Подскажите, как выявить проблему и исправить? файлы не могу прикрепить... может быть что угодно. загрузите файлы на облако и закиньте мне в личку посмотрю Цитата Ссылка на сообщение Поделиться на другие сайты
saimon Опубликовано 1 мая, 2017 Жалоба Поделиться Опубликовано 1 мая, 2017 (изменено) Мишаня молодец. Многим помог здесь на форуме. И главное много бесплатно. Кто то говорил, что эта работа была проплачена. Мне такое Корс сделал и тоже бесплатно. Изменено 1 мая, 2017 пользователем saimon Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 мая, 2017 Жалоба Поделиться Опубликовано 1 мая, 2017 Чтобы Корс сделал что-то бесплатно, да ещё и такой объем работы? В жизни не поверю.А Мишаня молодец, много чем помог форуму. Цитата Ссылка на сообщение Поделиться на другие сайты
saimon Опубликовано 1 мая, 2017 Жалоба Поделиться Опубликовано 1 мая, 2017 (изменено) Чтобы Корс сделал что-то бесплатно, да ещё и такой объем работы? В жизни не поверю.А Мишаня молодец, много чем помог форуму.Это ты бесплатно ни когда и ни чего. А Корс сделап и БЕСПЛАНО Изменено 1 мая, 2017 пользователем saimon Цитата Ссылка на сообщение Поделиться на другие сайты
saimon Опубликовано 1 мая, 2017 Жалоба Поделиться Опубликовано 1 мая, 2017 (изменено) Чтобы Корс сделал что-то бесплатно, да ещё и такой объем работы? В жизни не поверю.А Мишаня молодец, много чем помог форуму.Это для тебя такой объём работы, а оказалось и не так много. И спасибо Мишане, Изменено 1 мая, 2017 пользователем saimon Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 мая, 2017 Жалоба Поделиться Опубликовано 1 мая, 2017 Это ты бесплатно ни когда и ни чего. А Корс сделап и БЕСПЛАНОТы здесь новенький и ничего обо мне не знаешь.Я принес форуму куда больше пользы чем твой Корс.Мне кажется ты за бесплатную помощь готов в пятую точку целовать, иначе я не вижу причины так яростно его защищать. Цитата Ссылка на сообщение Поделиться на другие сайты
pronin Опубликовано 24 мая, 2017 Жалоба Поделиться Опубликовано 24 мая, 2017 Парни, помогите решить проблему, mishanya ушел в игнор (месяц обещал).СобственноДелаю всё по инструкции. Однако в базу не добавляет related_id,соответственно связанный товар2 не отображается (из админки ссылка натовар так же идет без id). Подскажите, как выявить проблему и исправить? файлыhttps://yadi.sk/d/hYepaIwm3HUuJk Цитата Ссылка на сообщение Поделиться на другие сайты
ahmed Опубликовано 25 мая, 2017 Жалоба Поделиться Опубликовано 25 мая, 2017 Инструкция неявно предполагает, что будет использоваться на последних версиях. А у Вас, похоже, версия младше 2.3, а там скрипт автодополнения другой, потому и не работает. Чтобы работало, надо перерабатывать под Вашу версию... Цитата Ссылка на сообщение Поделиться на другие сайты
pronin Опубликовано 25 мая, 2017 Жалоба Поделиться Опубликовано 25 мая, 2017 Спасибо огромное mishanya, помог, все работает! Цитата Ссылка на сообщение Поделиться на другие сайты
jonny008 Опубликовано 20 июня, 2017 Жалоба Поделиться Опубликовано 20 июня, 2017 Здравствуйте. А как сделать импорт связанных товаров? Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 20 июня, 2017 Жалоба Поделиться Опубликовано 20 июня, 2017 Здравствуйте. А как сделать импорт связанных товаров?Это не предусмотрено функционалом симплы. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 июня, 2017 Автор Жалоба Поделиться Опубликовано 20 июня, 2017 Здравствуйте. А как сделать импорт связанных товаров?ответил в скайп Цитата Ссылка на сообщение Поделиться на другие сайты
n1c Опубликовано 6 сентября, 2020 Жалоба Поделиться Опубликовано 6 сентября, 2020 Подскажите пожалуйста. Делаю связанные товары в блоге. В админке выводится, но в БД не сохраняет (после нажатия на сохранить, товар есть, а при обновлении страницы его нет) в конец api/Blog.php вставил public function get_self_products_blog($product_id = array()) { if(empty($product_id)) return array(); $product_id_filter = $this->db->placehold('AND product_id in(?@)', (array)$product_id); $query = $this->db->placehold("SELECT product_id, related_id, position FROM __self_products_blog WHERE 1 $product_id_filter ORDER BY position "); $this->db->query($query); return $this->db->results(); } public function add_self_product_blog($product_id, $related_id, $position=0) { $query = $this->db->placehold("INSERT IGNORE INTO __self_products_blog SET product_id=?, related_id=?, position=?", $product_id, $related_id, $position); $this->db->query($query); return $related_id; } public function delete_self_product_blog($product_id, $related_id) { $query = $this->db->placehold("DELETE FROM __self_products_blog WHERE product_id=? AND related_id=? LIMIT 1", intval($product_id), intval($related_id)); $this->db->query($query); } и еще ошибку 500 в записи дает, не пойму почемуview/BlogView.phpперед: // Соседние записи $this->design->assign('next_post', $this->blog->get_next_post($post->id)); $this->design->assign('prev_post', $this->blog->get_prev_post($post->id)); вставляю: $self_ids = array(); $self_products_blog = array(); foreach($this->products->get_self_products_blog($product->id) as $p) { $self_ids[] = $p->related_id; $self_products_blog[$p->related_id] = null; } if(!empty($self_ids)) { foreach($this->products->get_products(array('id'=>$self_ids, 'in_stock'=>1, 'visible'=>1)) as $p) $self_products_blog[$p->id] = $p; $self_products_blog_images = $this->products->get_images(array('product_id'=>array_keys($self_products_blog))); foreach($self_products_blog_images as $self_product_blog_image) if(isset($self_products_blog[$self_product_blog_image->product_id])) $self_products_blog[$self_product_blog_image->product_id]->images[] = $self_product_blog_image; $self_products_blog_variants = $this->variants->get_variants(array('product_id'=>array_keys($self_products_blog), 'in_stock'=>1)); foreach($self_products_blog_variants as $self_product_blog_variant) { if(isset($self_products_blog[$self_product_blog_variant->product_id])) { $self_products_blog[$self_product_blog_variant->product_id]->variants[] = $self_product_blog_variant; } } foreach($self_products_blog as $id=>$s) { if(is_object($s)) { $s->image = &$s->images[0]; $s->variant = &$s->variants[0]; } else { unset($self_products_blog[$id]); } } $this->design->assign('self_products_blog', $self_products_blog); } Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 6 сентября, 2020 Жалоба Поделиться Опубликовано 6 сентября, 2020 и еще ошибку 500 в записи дает, не пойму почемуС ходу видно, что вызов foreach($this->products->get_self_products_blog($product->id) as $p) явно неправильный. А судя по Вашему подходу, скорее всего, еще масса ошибок есть... Цитата Ссылка на сообщение Поделиться на другие сайты
n1c Опубликовано 6 сентября, 2020 Жалоба Поделиться Опубликовано 6 сентября, 2020 С ходу видно, что вызовforeach($this->products->get_self_products_blog($product->id) as $p)явно неправильный.А судя по Вашему подходу, скорее всего, еще масса ошибок есть... тю, точно))) спасибо за наводку))убрал ошибку 500.просмотрел код далее но не вижу причину почему не сохраняет в БД =( Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 6 сентября, 2020 Жалоба Поделиться Опубликовано 6 сентября, 2020 тю, точно))) спасибо за наводку))убрал ошибку 500.просмотрел код далее но не вижу причину почему не сохраняет в БД =( Надо ж не по верхам смотреть, а поглубже - проверять, есть ли вообще попытка сохранения и если есть, то каким запросом... Цитата Ссылка на сообщение Поделиться на другие сайты
n1c Опубликовано 6 сентября, 2020 Жалоба Поделиться Опубликовано 6 сентября, 2020 (изменено) Надо ж не по верхам смотреть, а поглубже - проверять, есть ли вообще попытка сохранения и если есть, то каким запросом... а не подскажете как это сделать? Изменено 6 сентября, 2020 пользователем n1c Цитата Ссылка на сообщение Поделиться на другие сайты
alexivchenko Опубликовано 6 сентября, 2020 Жалоба Поделиться Опубликовано 6 сентября, 2020 а не подскажете как это сделать? зайдите в личные сообщения, я вам кинул готовое решение Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.