digimon Опубликовано 7 января, 2014 Жалоба Поделиться Опубликовано 7 января, 2014 к примеру есть сайт куда заливаем инфу (парсим с другого) сайта.возникла проблема из 10 000 возможно у 50ти товаров.отсутствует картинка(возможно она задано в его параметрах но физически в files) она возможно отсутствует. при отображение к примеру новинок с рандомной сортировкой этот товар без изображение вылезает и портит картину. Что можно сделать? как его убрать вниз или вообще отключить! Конечно вручную это запарка...Думаю смог передать свою мысль. уважаемые эксперты жду вашего мнения Цитата Ссылка на сообщение Поделиться на другие сайты
Foх Опубликовано 7 января, 2014 Жалоба Поделиться Опубликовано 7 января, 2014 советую вам поставить заглушку на товар какую нибудь интересного плана)и будет смотреться хорошо.и товар не прийдется отключать Цитата Ссылка на сообщение Поделиться на другие сайты
Виталий Анатольевич Опубликовано 8 января, 2014 Жалоба Поделиться Опубликовано 8 января, 2014 1 в файле api/Products.php, примерно 83 строка в функции get_products. добавить: if(!empty($filter['is_photo'])) $in_stock_filter = $this->db->placehold('AND (SELECT COUNT(i.id) FROM __images i WHERE i.product_id=p.id) > 1'); 2 файл view/ProductView.php, примерно 116 строка foreach($this->products->get_products(array('id'=>$related_ids, 'in_stock'=>1, 'visible'=>1, 'is_photo'=>1)) as $p) $related_products[$p->id] = $p; и строка 136 if(is_object($r) && isset($r->id)) { $r->image = &$r->images[0]; $r->variant = &$r->variants[0]; } else { unset($related_products[$id]); } Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 8 января, 2014 Жалоба Поделиться Опубликовано 8 января, 2014 И как это поможет, если в базе есть название картинки, а оригинала в папке нет? Цитата Ссылка на сообщение Поделиться на другие сайты
Ruslan Kopyl Опубликовано 8 января, 2014 Жалоба Поделиться Опубликовано 8 января, 2014 function get_images($filter = array()) { $product_id_filter = ''; $group_by = ''; if(!empty($filter['product_id'])) $product_id_filter = $this->db->placehold('AND i.product_id in(?@)', (array)$filter['product_id']); // images $query = $this->db->placehold("SELECT i.id, i.product_id, i.name, i.filename, i.position FROM __images AS i WHERE 1 $product_id_filter $group_by ORDER BY i.product_id, i.position"); $this->db->query($query); $images = $this->db->results(); /* заглушка если нет фото */ $haystack = (array)$filter['product_id']; if (!empty($images)) { foreach ($images as $image) { if (($id = array_search($image->product_id, $haystack)) !== false) { unset($haystack[$id]); } } } if (!empty($haystack)) { foreach ($haystack as $need_id) { $obj = new StdClass(); $obj->position = 1; $obj->filename = 'no_image.gif'; $obj->product_id = $need_id; $obj->name = 'no_image'; array_push($images, $obj); } } return $images; } Меняем метод get_images в файле api/Poducts.phpИ ложим заглушку в папку files/original , файл no_image.gif или можно переназвать на своё усмотрение, соответственно исправив в методе.Это конечно не поможет если в базе название все таки есть, но позволить не рушится дизайну, при битой или отсутвующей кртинке в папке original Цитата Ссылка на сообщение Поделиться на другие сайты
Виталий Анатольевич Опубликовано 8 января, 2014 Жалоба Поделиться Опубликовано 8 января, 2014 не учел условие что картинки физически может не быть...можно поставить проверку в методе get_images класса products тупняк Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 8 января, 2014 Жалоба Поделиться Опубликовано 8 января, 2014 Ого, а не проще это все сделать одной строкой в шаблоне? {if $product->image}{$product->image->filename|resize:200:200}{else}design/{$settings->theme|escape}/images/no_image.gif{/if} Цитата Ссылка на сообщение Поделиться на другие сайты
Виталий Анатольевич Опубликовано 8 января, 2014 Жалоба Поделиться Опубликовано 8 января, 2014 а если есть название и нет картики в файлах? Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 8 января, 2014 Жалоба Поделиться Опубликовано 8 января, 2014 Это не решает эту проблему Но решение не трогает движок и занимает 1 строку. А вообще, по-моему, проще написать скриптик, который при запуске из админки пробежится по картинкам в базе и удалит из базы те, которых нету физически в files/originals Цитата Ссылка на сообщение Поделиться на другие сайты
Ruslan Kopyl Опубликовано 8 января, 2014 Жалоба Поделиться Опубликовано 8 января, 2014 Ого, а не проще это все сделать одной строкой в шаблоне?{if $product->image}{$product->image->filename|resize:200:200}{else}design/{$settings->theme|escape}/images/no_image.gif{/if}Ну таких одних строчек придется писать во многих файлах и не один раз, и потом если сменится название картинки, исправлять это все в этих файлах.На странице продукта к примеру 200*200 картинка а в корзине 50*50.А так сразу и ресайз делается, и все в одном месте находится.А разговоры о том что трогает или не трогает движок, это вообще не о чем, в данном случае Цитата Ссылка на сообщение Поделиться на другие сайты
digimon Опубликовано 11 января, 2014 Автор Жалоба Поделиться Опубликовано 11 января, 2014 ой классно ребят,аж сообщество чувствуется....название в Бд есть, физически отсутствует файлы...какой из ваших решений наиболее приземлем в данном случаи? Цитата Ссылка на сообщение Поделиться на другие сайты
Ruslan Kopyl Опубликовано 11 января, 2014 Жалоба Поделиться Опубликовано 11 января, 2014 Немного изменить в моем методе http://forum.simplacms.ru/topic/6437-вопрос-с-изображениями/?p=49700 одну строчку , будет так же проверять на наличие файлаВот эту строку if (($id = array_search($image->product_id, $haystack)) !== false) { нужно заменить на if (($id = array_search($image->product_id, $haystack)) !== false && is_readable($this->config->original_images_dir.$image->filename)) { И будет вставлять заглушки, и если в базе нет записи, и если в базе запись есть но в папке фото нет Цитата Ссылка на сообщение Поделиться на другие сайты
Ruslan Kopyl Опубликовано 11 января, 2014 Жалоба Поделиться Опубликовано 11 января, 2014 Это кстати ответ на ваш вопрос Kosjak76 о том что лучше менять в шаблоне одну строку Цитата Ссылка на сообщение Поделиться на другие сайты
digimon Опубликовано 24 января, 2014 Автор Жалоба Поделиться Опубликовано 24 января, 2014 Ruslan Kopyl глушилка пашет но... если у товара боллее чем 1 фото...то тогда глушилка может стоят на 3ьем или пятом место,тогда эффекта 0...портится диз..подскажите что делать? Цитата Ссылка на сообщение Поделиться на другие сайты
Ruslan Kopyl Опубликовано 24 января, 2014 Жалоба Поделиться Опубликовано 24 января, 2014 Вот так попробуйте function get_images($filter = array()) { $product_id_filter = ''; $group_by = ''; if(!empty($filter['product_id'])) $product_id_filter = $this->db->placehold('AND i.product_id in(?@)', (array)$filter['product_id']); // images $query = $this->db->placehold("SELECT i.id, i.product_id, i.name, i.filename, i.position FROM __images AS i WHERE 1 $product_id_filter $group_by ORDER BY i.product_id, i.position"); $this->db->query($query); $images = $this->db->results(); /* заглушка если нет фото */ $haystack = (array)$filter['product_id']; if (!empty($images)) { foreach ($images as $key => $image) { if (!is_readable($this->config->original_images_dir.$image->filename) && !filter_var($image->filename, FILTER_VALIDATE_URL)) { unset($images[$key]); continue; } if (($id = array_search($image->product_id, $haystack)) !== false) { unset($haystack[$id]); } } } if (!empty($haystack)) { foreach ($haystack as $need_id) { $obj = new StdClass(); $obj->position = 1; $obj->filename = 'no_image.gif'; $obj->product_id = $need_id; $obj->name = 'no_image'; array_push($images, $obj); } } return $images; } Цитата Ссылка на сообщение Поделиться на другие сайты
digimon Опубликовано 27 января, 2014 Автор Жалоба Поделиться Опубликовано 27 января, 2014 спасибо огромное!помогло! Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.