Автор Тема: Изображение обложки товара  (Прочитано 1000 раз)

04 Апрель 2017, 14:28:53
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +4/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Добрый день посмотрела много тем по форуму, но конкретного решения не увидела. Проблема возникает при загрузке товара с новой картинкой . В обложке товара в админке и в списке товаров картинка самосоятельно не меняется только, когда ставишь напротив картинке галочку в админке, обложка изменяется. При импорте тысяч иоваров это сделать проблематично, как автоматизировать процесс
04 Апрель 2017, 15:36:42
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
При работе с веб сервисиом можно гибко управлять товарами.
Есть много тем на эту тематику
http://prestashop-forum.ru/index.php/topic,5311.0.html
http://prestashop-forum.ru/index.php/topic,5250.0.html
04 Апрель 2017, 17:11:04
Ответ #2
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +4/-0
  • Сообщество PrestaShop
    • Просмотр профиля
// Associate image to shop from context
                $shops = Shop::getContextListShopID();
                $image->associateTo($shops);
                $json_shops = array();

                foreach ($shops as $id_shop) {
                    $json_shops[$id_shop] = true;
                }

                $file['status']   = 'ok';
                $file['id']       = $image->id;
                $file['position'] = $image->position;
                $file['cover']    = $image->cover;
                $file['legend']   = $image->legend;
                $file['path']     = $image->getExistingImgPath();
                $file['shops']    = $json_shops;

                @unlink(_PS_TMP_IMG_DIR_.'product_'.(int)$product->id.'.jpg');
                @unlink(_PS_TMP_IMG_DIR_.'product_mini_'.(int)$product->id.'_'.$this->context->shop->id.'.jpg');
            }
        }

        die(Tools::jsonEncode(array($image_uploader->getName() => $files)));
    }
Здесь я так понимаю определяются условия для попадания  изображения на обложку . В каком файле прописаны изменения статуса? Если я не на верном пути поправьте , пожалуйста. Хочу, чтобы для первой картинки статус всегда был "ок"
04 Апрель 2017, 17:12:25
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
Первая картинка в файле импорта становится изображением по умолчанию.
04 Апрель 2017, 17:49:01
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +4/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Но, при загрузке новой картинки, она в карточке меняется, а в обложке, когда только галочку ставишь , а по умолчанию галочки нет, я думаю, если переопределить, чтобы стояла картинка сразу поменяется, там ещё класс <i class="icon-check-empty icon-2x covered"></i> меняется на <i class="icon-check-sign icon-2x covered"></i> в js . Тоже сразу прописать нужный, не нашла, правда, в каком скрипте.
05 Апрель 2017, 00:37:10
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +4/-0
  • Сообщество PrestaShop
    • Просмотр профиля
public function processImage()
    {
        $id_image = (int)Tools::getValue('id_image');
        $image = new Image((int)$id_image);
        if (Validate::isLoadedObject($image)) {
            /* Update product image/legend */
            // @todo : move in processEditProductImage
            if (Tools::getIsset('editImage')) {
                if ($image->cover) {
                    $_POST['cover'] = 1;
                }

                $_POST['id_image'] = $image->id;
            } elseif (Tools::getIsset('coverImage')) {
                /* Choose product cover image */
                Image::deleteCover($image->id_product);
                $image->cover = 1;
                if (!$image->update()) {
                    $this->errors[] = Tools::displayError('You cannot change the product\'s cover image.');
                } else {
                    $productId = (int)Tools::getValue('id_product');
                    @unlink(_PS_TMP_IMG_DIR_.'product_'.$productId.'.jpg');
                    @unlink(_PS_TMP_IMG_DIR_.'product_mini_'.$productId.'_'.$this->context->shop->id.'.jpg');
                    $this->redirect_after = self::$currentIndex.'&id_product='.$image->id_product.'&id_category='.(Tools::getIsset('id_category') ? '&id_category='.(int)Tools::getValue('id_category') : '').'&action=Images&addproduct'.'&token='.$this->token;
                }
            } elseif (Tools::getIsset('imgPosition') && Tools::getIsset('imgDirection')) {
                /* Choose product image position */
                $image->updatePosition(Tools::getValue('imgDirection'), Tools::getValue('imgPosition'));
                $this->redirect_after = self::$currentIndex.'&id_product='.$image->id_product.'&id_category='.(Tools::getIsset('id_category') ? '&id_category='.(int)Tools::getValue('id_category') : '').'&add'.$this->table.'&action=Images&token='.$this->token;
            }
        } else {
            $this->errors[] = Tools::displayError('The image could not be found. ');
        }
    }
public function ajaxProcessUpdateCover()
    {
        if ($this->tabAccess['edit'] === '0') {
            return die(Tools::jsonEncode(array('error' => $this->l('You do not have the right permission'))));
        }
        Image::deleteCover((int)Tools::getValue('id_product'));
        $img = new Image((int)Tools::getValue('id_image'));
        $img->cover = 1;

        @unlink(_PS_TMP_IMG_DIR_.'product_'.(int)$img->id_product.'.jpg');
        @unlink(_PS_TMP_IMG_DIR_.'product_mini_'.(int)$img->id_product.'_'.$this->context->shop->id.'.jpg');

        if ($img->update()) {
            $this->jsonConfirmation($this->_conf[26]);
        } else {
            $this->jsonError(Tools::displayError('An error occurred while attempting to update the cover picture.'));
        }
    }

    public function ajaxProcessDeleteProductImage()
    {
        $this->display = 'content';
        $res = true;
        /* Delete product image */
        $image = new Image((int)Tools::getValue('id_image'));
        $this->content['id'] = $image->id;
        $res &= $image->delete();
        // if deleted image was the cover, change it to the first one
        if (!Image::getCover($image->id_product)) {
            $res &= Db::getInstance()->execute('
            UPDATE `'._DB_PREFIX_.'image_shop` image_shop
            SET image_shop.`cover` = 1
            WHERE image_shop.`id_product` = '.(int)$image->id_product.'
            AND id_shop='.(int)$this->context->shop->id.' LIMIT 1');
        }

        if (!Image::getGlobalCover($image->id_product)) {
            $res &= Db::getInstance()->execute('
            UPDATE `'._DB_PREFIX_.'image` i
            SET i.`cover` = 1
            WHERE i.`id_product` = '.(int)$image->id_product.' LIMIT 1');
        }

        if (file_exists(_PS_TMP_IMG_DIR_.'product_'.$image->id_product.'.jpg')) {
            $res &= @unlink(_PS_TMP_IMG_DIR_.'product_'.$image->id_product.'.jpg');
        }
        if (file_exists(_PS_TMP_IMG_DIR_.'product_mini_'.$image->id_product.'_'.$this->context->shop->id.'.jpg')) {
            $res &= @unlink(_PS_TMP_IMG_DIR_.'product_mini_'.$image->id_product.'_'.$this->context->shop->id.'.jpg');
        }

        if ($res) {
            $this->jsonConfirmation($this->_conf[7]);
        } else {
            $this->jsonError(Tools::displayError('An error occurred while attempting to delete the product image.'));
        }
    }
Нашла функции,отвечающие за смену обложки, но пока не знаю, как они в моём случае могут помочь.
05 Апрель 2017, 04:35:28
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +4/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Я, как поняла, системе , чтобы добавить автоматически картинку в обложку , надо чтобы изначально картинки не было.То есть, что картинка перезаписалась система не видит.Надо значит картинки эти удалять. Это возможно только через вебсервис или есть другие возможности, кроме удаления вручную? :)
05 Апрель 2017, 04:56:38
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +4/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$image = new Image();
$image->id_product = $id_product;
$image->delete();
Возможно ли этот код использовать в моём случае?
05 Апрель 2017, 10:52:51
Ответ #8
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Если работаете через вебсервис, тогда можно.
Если загружаете через импорт админки, то можно включить Удалить товары перед импортом. Только хостинг должен быть хороший, на слабом хостинге зависнет.
05 Апрель 2017, 11:00:53
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +4/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Работает через программу синхронизации 1с.
05 Апрель 2017, 11:09:38
Ответ #10
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +4/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вобще проблема в изменении обложки товара автоматически, неужели внутренними методами Prestashopa, это невозможно?
05 Апрель 2017, 11:20:20
Ответ #11
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$image = new Image();
$image->id_product = $id_product;
$image->delete();
Возможно ли этот код использовать в моём случае?
Можно.
05 Апрель 2017, 11:25:08
Ответ #12
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вобще проблема в изменении обложки товара автоматически, неужели внутренними методами Prestashopa, это невозможно?
Вы используете PrestaShop Web Service - Image management для связи сайта и программы.
05 Апрель 2017, 11:32:36
Ответ #13
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Работает через программу синхронизации 1с.
Не знаю как у вас реализованы методы обновления, но явно что проблема в них.
Удалять не обязательно. Можно выбрать все изображения товара
SELECT id_image FROM ps_image WHERE id_product = $id_productи изменить параметр "cover" у нужного.
UPDATE `ps_image` SET `cover` = '1' WHERE `ps_image` = $id_image.
05 Апрель 2017, 11:38:15
Ответ #14
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +4/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Параметр cover не настроен.