Добро пожаловать в наше сообщество!
skripters.net - небольшой форум для вэб-мастеров на котором вам предоставляется широкий выбор скриптов, плагинов, стилей и много чего еще для запуска собственного проекта: интернет-магазина, форума, корпоративного сайта, продающего лендинга. Здесь вы найдете много решений по заработку в интернет. Сможете продать или купить нужное вам решение для старта своего веб-проекта. Опытные пользователи проконсультируют вас если вы вначале пути, подскажут как лучше, помогут в установке и настройке.

Помощь Импорт товаров (не заполняются alt и title изображений)

rdl

Пользователь
Регист
10 Мар 2017
Сообщения
1
Реакции
0
С версии 6.9.8 добавлена возможность импорта картинок через CSV по ссылкам.
Может быть кто то столкнулся уже с такой проблемой, что не заполняются теги alt и title у изображений при импорте?

Например, импортируем csv файл в котором в поле "Изображение" указано -
Код:
http://primer.test/img-test.jpg[:param:][alt=test][title=test2]
, тогда могута просто создаст пустой файл с названием -
Код:
img-test.jpg[:param:][alt=test][title=test2]
Если импортировать со значением -
Код:
primer.test/img-test.jpg
, товар создастся с нужным изображением, но тегов alt и title, соответственно, уже не будет.

ПыСы: Можно делать двойной импорт. С начало импортируем csv файл со значением в поле Изображение -
Код:
primer.test/img-test.jpg[:param:][alt=test][title=test2]
, затем импортируем тот же файл. но уже со значением в этом поле -
Код:
img-test.jpg[: Param:][alt=test][title=test2]
, но мне кажется каждый раз импортировать прайс по два раза - сомнительное решение :)

тогда могута просто создаст пустой файл с названием -
img-test.jpg[:param:][alt=test][title=test2]
точнее название файла будет - img-test.jpg[-param-][alt=test][title=test2]
 
Последнее редактирование модератором:

k4el4

Premium+
Регист
9 Фев 2017
Сообщения
41
Реакции
38
Это так реализован импорт со ссылкой, можно попробовать исправить функцию createProduct в файле mg-core/lib/import.php если религия позволяет менять файлы движка))
 

legale

Пользователь
Регист
10 Окт 2017
Сообщения
1
Реакции
1
Куда ни сунься, везде все допиливать руками приходится.

Стандартный импорт csv в могуте умеет делать импорт изображений по ссылке при условии включения соотв. настройки в config.ini

Код:
; загрузка изображений по ссылкам из csv
HTTP_IMGCSV_DOWNLOAD = 1

Импорт по ссылке работает, но только если у вас там 1 изображение, т.е. несколько ссылок не принимаются. Чтобы исправить этот недостаток я поправил метод createProduct в классе import (файл /mg-core/lib/import.php)

Это переделанный метод. Линиями выделен измененный кусок.


PHP:
  /**
   * Создает продукт в БД если его не было.
   * @param type $product - массив с данными о продукте.
   * @param type $catId - категория к которой относится продукт.
   */
  public function createProduct($product, $catId = null) {

    $model = new Models_Product();
    $variant = $product['variant'];
    $img_var = $product['image'];
    $property = $product['property'];
    $product['price'] = MG::numberDeFormat($product['price']);
    $product['old_price'] = MG::numberDeFormat($product['old_price']);
    unset($product['cat_url']);
    unset($product['variant']);

PHP:
    unset($product['image']);
    unset($product['property']);
//************************************************
    //Если у нас несколько изображений, качаем их по очереди
    $images = explode('|', $product['image_url']);
    if(is_array($images)){
        foreach($images as &$image){
            self::$downloadLink==false;
            // если в строке содержится ссылка
            if (strpos($image, "http:") !== false|| strpos($image, "https:") !== false) {
                self::$downloadLink = true;
                $this->downloadImgFromSite($image);
                $image = basename($image);
            }
        }
        $product['image_url'] = implode('|', $images);
    }

    //если у нас в изображениях есть доп. параметры, вытащим их оттуда
    if(strpos($product['image_url'], '[:param:]')!==false) {
        // Парсим изображение, его alt и title.
      $images = $this->parseImgSeo($product['image_url']);
      $product['image_url'] = $images[0];
      $product['image_alt'] = $images[1];
      $product['image_title'] = $images[2];

    }
//************************************************
    if($catId === null){
      // 1 находим ID категории по заданному пути.
      $product['cat_id'] = MG::translitIt($product['cat_id'], 1);
      $product['cat_id'] = URL::prepareUrl($product['cat_id']);

      if($product['cat_id']){
        $product['cat_id'] = (empty($product['cat_id'])) ? $product['cat_url'] : $product['cat_id'];
     
        $url = URL::parsePageUrl($product['cat_id']);
        $parentUrl = URL::parseParentUrl($product['cat_id']);
        $parentUrl = $parentUrl != '/' ? $parentUrl : '';             
     
        $cat = MG::get('category')->getCategoryByUrl($url, $parentUrl);   
        $product['cat_id'] = $cat['id'];
      }
    }else{
      $product['cat_id'] = $catId;
    }

    if($catId == -1){
      unset($product['cat_id']);
    }else{
      $product['cat_id'] = !empty($product['cat_id']) ? $product['cat_id'] : 0;
    }

    if(!empty($product['id'])&&  is_numeric($product['id'])){
        $dbRes = DB::query('SELECT `id`, `url`, `title` FROM `'.PREFIX.'product` WHERE `id` = '.DB::quote($product['id'], 1));
   
      if($res = DB::fetchArray($dbRes)){     
        if($res['title'] == $product['title']){
          $product['url'] = $res['url'];
        }     
         unset($product['id']);
      }else{
        if(empty($_SESSION['csv_import_full'])){
          $_SESSION['csv_import_full'] = 'y';
          $this->formateMogutaCMS(self::$fullProduct, true);
          return;
        }else{
          unset($_SESSION['csv_import_full']);
        }     
        $arrProd = $model->addProduct($product);             
      }           
    }

   
  }

PHP:
if(empty($arrProd)){
      // 2 если URL не задан в файле, то транслитирируем его из названия товара.
      $product['url'] = !empty($product['url'])?$product['url']:preg_replace('~-+~','-',MG::translitIt($product['title'], 0));
      $product['url'] = str_replace(array(':', '/'),array('', '-'),$product['url']);
      $product['url'] = URL::prepareUrl($product['url'], true);

   
      if($_POST['identifyType'] == 'name'){
        if(empty($product['cat_id']) || $product['cat_id'] == 0){
          $alreadyProduct = $model->getProductByUrl($product['url']);
        }else{
          $alreadyProduct = $model->getProductByUrl($product['url'], $product['cat_id']);
        }
      }elseif(!empty($product['code'])){
        $res = DB::query('
          SELECT id, url
          FROM `'.PREFIX.'product`
          WHERE code = '.DB::quote($product['code'])
        );
     
        $alreadyProduct = DB::fetchAssoc($res);
     
        if(!$alreadyProduct){
          $res = DB::query('
            SELECT p.id, p.url
            FROM `'.PREFIX.'product` p
              LEFT JOIN `'.PREFIX.'product_variant` pv
                ON pv.product_id = p.id
            WHERE pv.code = '.DB::quote($product['code'])
          );
       
          $alreadyProduct = DB::fetchAssoc($res);
        }
     
        if(empty($alreadyProduct)){
          if($product['cat_id'] == 0){
            $alreadyProduct = $model->getProductByUrl($product['url']);
          }else{
            $alreadyProduct = $model->getProductByUrl($product['url'], $product['cat_id']);
          }
        }
      }

      // Если в базе найден этот продукт, то при обновлении будет сохранен ID и URL.
      if(!empty($alreadyProduct['id'])){
        $product['id'] = $alreadyProduct['id'];
        $product['url'] = $alreadyProduct['url'];
      }
   
      if(empty($_SESSION['csv_import_full']) && (empty($alreadyProduct['id']) || !empty($variant))){
        $_SESSION['csv_import_full'] = 'y';
        $this->formateMogutaCMS(self::$fullProduct, true);
        return;
      }else{
        unset($_SESSION['csv_import_full']);
      }
   
      // обновляем товар, если его не было то метод вернет массив с параметрами вновь созданного товара, в том числе и ID. Иначе  вернет true     
      $arrProd = $model->updateProduct($product);
    }
     
    $product_id = $product['id']?$product['id']:$arrProd['id'];
    $categoryId = $product['cat_id'];
    $productId = $product_id;
    $listProperty = $property;
    $arrProperty = $this->parseListProperty($listProperty);

    foreach($arrProperty as $key => $value){
      $type = 'string';
      $data = '';
      // Если характеристика сложная, то выделим параметры - тип, значение, наценки.
      if ($value[0]=='['&&$value[strlen($value)-1]==']'&&stristr($value, 'type')!== FALSE
        &&stristr($value, 'value')!== FALSE&&stristr($value, 'product_margin')!== FALSE) {
        if(preg_match("/type=([^&]*)value/", $value, $matches))  {
          $type = trim($matches[1]);
        }
        if(preg_match("/value=([^&]*)product_margin/", $value, $matches))  {
          $value_prop = trim($matches[1]);
        }
        if(preg_match("/product_margin=([^&]*)]/", $value, $matches))  {
          $data = trim($matches[1]);
        }
        $value = $value_prop;
      }
      $this->createProperty($key, $value, $categoryId, $productId, $type, $data);
    }
    if(!$variant){
      return true;
    }

    $var = $model->getVariants($product['id'], $variant);
    $varUpdate = null;

    if(!empty($var)){
      foreach($var as $k => $v){
        if($v['title_variant'] == $variant && $v['product_id'] == $product_id){
          $varUpdate = $v['id'];
        }
      }
    }

    // Иначе обновляем существующую запись в таблице вариантов.
    $varFields = array(   
      'price',
      'old_price',
      'count',
      'code',
      'weight',
      'activity',
      'currency_iso'
    );

    $newVariant = array(
      'product_id' => $product_id,
      'title_variant' => $variant,
    );

    if($img_var){
      $newVariant['image'] = $img_var;
    }

    if($_POST['schemeType'] != 'default'){
      foreach(self::$notUpdate as $id){
        $notUpdateFields[$id] = self::$fields[$this->typeCatalog][$id];
      }
    }     

    foreach($varFields as $field){
      if(isset($product[$field])){
        if(!in_array($field, $notUpdateFields)){
          $newVariant[$field] = $product[$field];
        }     
      }
    }

    $model->importUpdateProductVariant($varUpdate, $newVariant, $product_id);

    // Обновляем продукт по первому варианту.
    $res = DB::query('
      SELECT  pv.*
      FROM `'.PREFIX.'product_variant` pv
      WHERE pv.product_id = '.DB::quote($product_id).'
      ORDER BY sort
    ');
    if($row = DB::fetchAssoc($res)){

      if(!empty($row)){
        if($product['title']){
          $row['title'] = $product['title'];
        }     
     
        $row['id'] = $row['product_id'];
        unset($row['image']);
        unset($row['sort']);
        unset($row['title_variant']);
        unset($row['product_id']);
        $model->updateProduct($row);
      }
    }
 
Последнее редактирование модератором:

legale

Пользователь
Регист
10 Окт 2017
Сообщения
1
Реакции
1
А вообще, когда я увидел код этой могуты, желание пользоваться ей сразу отпало. Феерический кусок, где автор для проверки является ли текстовая строка ссылкой пишет:
PHP:
if(strpos($image, "http:") !== false)
Маловероятно, конечно, что где-то в имени файла будет использоваться http:
но это возможно, поэтому такой код - гавно. Наверняка подобные вещи есть еще, а поскольку скрипт не маленький, такой хрени тут много.
 
Сверху