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

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

к примеру есть сайт куда заливаем инфу (парсим с другого) сайта.

возникла проблема из 10 000 возможно у 50ти товаров.отсутствует картинка

(возможно она задано в его параметрах но физически в files) она возможно отсутствует.

 

при отображение к примеру новинок с рандомной сортировкой этот товар без изображение вылезает и портит картину.

 

Что можно сделать? как его убрать вниз или вообще отключить! Конечно вручную это запарка...

Думаю смог передать свою мысль. уважаемые эксперты жду вашего мнения

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

:) советую вам поставить заглушку на товар какую нибудь интересного плана)и будет смотреться хорошо.и товар не прийдется отключать

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

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]);
				}

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

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

не учел условие что картинки физически может не быть...

можно поставить проверку в методе get_images класса products

 

тупняк

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

Ого, а не проще это все сделать одной строкой в шаблоне?

{if $product->image}{$product->image->filename|resize:200:200}{else}design/{$settings->theme|escape}/images/no_image.gif{/if}

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

Это не решает эту проблему :)

Но решение не трогает движок и занимает 1 строку.

А вообще, по-моему, проще написать скриптик, который при запуске из админки пробежится по картинкам в базе и удалит из базы те, которых нету физически в files/originals

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

Ого, а не проще это все сделать одной строкой в шаблоне?

{if $product->image}{$product->image->filename|resize:200:200}{else}design/{$settings->theme|escape}/images/no_image.gif{/if}

Ну таких одних строчек придется писать во многих файлах и не один раз, и потом если сменится название картинки, исправлять это все в этих файлах.На странице продукта к примеру 200*200 картинка а в корзине 50*50.

А так сразу и ресайз делается, и все в одном месте находится.

А разговоры о том что трогает или не трогает движок, это вообще не о чем, в данном случае

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

ой классно ребят,аж сообщество чувствуется....название в Бд есть, физически отсутствует файлы...

какой из ваших решений наиболее приземлем в данном случаи?

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

Немного изменить в моем методе 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)) {

 

И будет вставлять заглушки, и если в базе нет записи, и если в базе запись есть но в папке фото нет

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

Ruslan Kopyl

 

глушилка пашет но... если у товара боллее чем 1 фото...то тогда глушилка может стоят на 3ьем или пятом место,тогда эффекта 0...портится диз..подскажите что делать?

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

Вот так попробуйте

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

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

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

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

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

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

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

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

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

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