Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Recommended Posts

Только что, egortide сказал:

Хотел еще спросить. Есть ли ограничение по размеру файла XML? Сайт донора может отдать 600к товаров. это реально сделать через обработчик? 

Для самого модуля ограничений нет.
Но есть ограничения физические хостинга .

1. Время выполнения скрипт.
2. Оперативная память (С этим редко сталкиваюсь)

Если скрипт имеет право работать только 30 секунд. Тогда модуль успеет выполнить задание только в том случаи если за эти 30 сек донор передаст весь файл в 600k
И у модуля останется время нарезать его. И это все должно вложится в 30 сек.

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

То есть в самом скрипте ограничений нет, но есть косвенные от хостинга.

Надіслати
Поділитися на інших сайтах

Только что, egortide сказал:

Выставил 25 секунд. Тоже не успевает

Узнайте сколько у на вашем хостинге ограничение по выполнению скрипта, если оно выше 30 сек напишите и я подскажу где вы можно увеличить максимальное время ожидания ответа в моем модуле.

Надіслати
Поділитися на інших сайтах

9 минут назад, Rassol2 сказал:

Узнайте сколько у на вашем хостинге ограничение по выполнению скрипта, если оно выше 30 сек напишите и я подскажу где вы можно увеличить максимальное время ожидания ответа в моем модуле.

Узнал. 120 секунд

Надіслати
Поділитися на інших сайтах


6 минут назад, egortide сказал:

Узнал. 120 секунд

Открываете файл по адресу
/admin/view/template/catalog/simplepars_browser.twig

 

Находите там строку. Удаляете !-- в начале и -- в конце строки. Туда куда я указал крассными стрелочками.
Затем меняете цифры 50 на которые указывают синие стрелочки на 100.

Спойлер

KTxVhBk.png

 

Что бы в итоге вышло вот так.

Спойлер

HmDkpJS.png


Сохраняете, и после этого зайдя в раздел настройки запросов у вас появится выбор 100 секунд.

  • +1 1
Надіслати
Поділитися на інших сайтах

14 минут назад, Rassol2 сказал:

Открываете файл по адресу
/admin/view/template/catalog/simplepars_browser.twig

 

Находите там строку. Удаляете !-- в начале и -- в конце строки. Туда куда я указал крассными стрелочками.
Затем меняете цифры 50 на которые указывают синие стрелочки на 100.

  Показать контент

KTxVhBk.png

 

Что бы в итоге вышло вот так.

  Показать контент

HmDkpJS.png


Сохраняете, и после этого зайдя в раздел настройки запросов у вас появится выбор 100 секунд.

Сделал. Только в этом файле у меня не было такой строки в комментариях , поэтому я ее прописал сам. Получилось так. Только вот не появляется выбор 100 сек. Модификаторы обновлял.
 

Ответ.png

Надіслати
Поділитися на інших сайтах


Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине
/admin/view/template/catalog/simplepars_browser.twig

Надіслати
Поділитися на інших сайтах


5 минут назад, egortide сказал:

Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине
/admin/view/template/catalog/simplepars_browser.twig

Да точно.
не забудьте обновить кеш если у вас включен, после правок конечно же.
 

Спойлер

0RSTnDq.png

 

Надіслати
Поділитися на інших сайтах

ВНИМАНИЕ!!!

PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп.
 

Предисловие.
Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени.
Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете.
Так же вы можете дописать любую другую часть.

Инструкция к скрипту.
Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов.
Вот так.
 

Спойлер

1zos1cp.png


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

Далее настраиваем работу С скриптом.
Выбираем какой скрипт, и выбираем когда выполнять.

Выполнять нужно исключительно После парсинга в ИМ!

Спойлер

kXDhLTP.png


Сам файл скрипта будет прикреплен к этому посту в самом низу.
Вы можете его загрузить через фтп в директорию /admin/simplepars/scripts/
Или же создать свой и перенсти туда код через встроенный редактор, просто скопировать вставить и сохранить.

 

Код для просмотра.

Спойлер

<?php
  
  # УПРАВЛЕНИЕ АТРИБУТАМИ 
  
  //Укажите номер границы парсинга в которой находится текст подготовленный для загрузки в атрибуты.
  $gran_id = 0;

  //////////////////////////////////////////////////
  // Работа с атрибутами при СОЗДАНИИ товара 
  // 0 - Не работать с атрибутами
  // 1 - Создавать атрибута если такого нет, добавлять атрибуты в товар
  // 2 - Добавлять в товар без создания новых атрибутов
  ////////////////////////////////////////////////////
  $r_attr = 0;

  //////////////////////////////////////
  // Работа с атрибутами при ОБНОВЛЕНИИ товара 
  // 0 - Не работать с атрибутами.
  // 1 - Создавать/Добавлять/Обновлять атрибуты.
  // 2 - Добавить/Обновить атрибуты в товаре, не создавать новые.
  // 3 - Добавить новый не обновлять существующие, не создавать новые
  // 4 - Обновить значения существующих атрибутов, не добавлять, не создавать новые.
  // 5 - Удалить все атрибуты в товаре и загрузить заново
  ///////////////////////////////////////
  $u_attr = 0;

  // Разрешить или запретить создание новый груп атрибутов. 
  // 1 - разрешить 
  // 0 - запретить, в этом случаи для атрибутов будет указана группа с настроек модуля.
  $add_new_group = 1;



  //навожу удобство.
  $setting = $script_data['setting'];
  $langs = $this->getLang($setting);


  //определяем что у нас обновление или добавлени товара. 
  $add_permit = 0;
  $up_permit = 0;
  $pr_id = 0;

  if($script_data['permit']['add']['permit']){
    $pr_id = $script_data['permit']['add']['pr_id'];
    $add_permit = 1;
  }elseif($script_data['permit']['up']['permit']){
    $pr_id = $script_data['permit']['up']['pr_id'];
    $up_permit = 1;
  }

  //Разбиваем границу на массив
  if(!empty($script_data['form']['script_gran'][$gran_id])){
    $attr_str = $script_data['form']['script_gran'][$gran_id];
  }else{
    $attr_str = '';
  }
  $attr_arr = explode('{g-start}', $attr_str);

  foreach ($attr_arr as $key => &$value) {
    $value = explode('{g-stop}', $value);

    //присваемвам для удобства ключи.
    if(empty($value[1])){
      $value['group'] = '';
      $value['value'] = $this->madeAttrArrey($value[0]);
    }else{
      $value['group'] = trim($value[0]);
      $value['value'] = $this->madeAttrArrey($value[1]);
    }
    unset($value[0]);
    unset($value[1]);

  }


  //обрабатываем полученные данные.
  foreach($attr_arr as $attr_data){

    // Проверяем есть ли такая группа атрибутов в магазине. И если нет создаем. И возврашаем id
    // По умолчанию группа будет с настрек модуля;
    $group_id = $setting['r_attr_group'];
    
    if(!empty($attr_data['group'])){
      
      //Приводим в порядок имя группы.
      $grop_name = mb_substr(trim($attr_data['group']), 0, 64);

      //проверяем есть ли группа атрибутов
      $group_id = getGroupId($this, $grop_name);

      //если такая группа отсуцтвует создаем ее.
      if(empty($group_id) && $add_new_group){
        $group_id = addNewGroupAttr($this, $grop_name, $langs, $dn_id);
      }

      if(empty($group_id)){ $group_id = $setting['r_attr_group']; }

    }

    //дополнительный блок исключительно для пятой версии атрибутов при обновлении.
    if($u_attr == 5 && $up_permit){
      #Сначала удаляем все атрибуты из товара.
      $this->db->query("DELETE FROM `".DB_PREFIX."product_attribute` WHERE `product_id`=".(int)$pr_id);
    }

    //переходим к работе с атрибутами.
    foreach($attr_data['value'] as $attr){

      //Работае с атрибутами при создании товара
      if($r_attr == 1 && $add_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);
        #Если нету тогда создаем.
        if($attr['id'] == 0){
          $attr['id'] = addAttr($this, $attr[0], $langs, $group_id, $dn_id);

          //Если после создания атрибут есть тогда записываем его в товар. Если нет проходим дальше.
          if($attr['id'] != 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
          }

        }else{
          #Если такой атрибут найден тогда присвяеваем его товару.
          $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
        }

      }elseif($r_attr == 2 && $add_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);
        //Если есть такой атрибут добавляем его в товар. Если нет пропускаем.
        if($attr['id'] != 0){
          $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
        }

      }

      //Работа с атрибутами при обновлении товара.
      if($u_attr == 1 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если нету тогда создаем.
        if($attr['id'] == 0){

          $attr['id'] = addAttr($this, $attr[0], $langs, $group_id, $dn_id);
          //Если после создания атрибут есть тогда записываем его в товар. Если нет проходим дальше.
          if($attr['id'] != 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);

            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }

        }elseif($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          if($check_attr->num_rows > 0){

            //Значит такой атрибут есть и нужно его обновить.
            $attr[1] = trim($attr[1]);
            $this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET `text`='".$this->db->escape($attr[1])."' WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);
            $log[] = ['name'=>'Атрибут обновлен в товаре '.$attr[0], 'value'=>$attr[1]];

          }else{

            //если нет тогда добавить его в товар.
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }
        }

      }elseif($u_attr == 2 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если сушествует тогда проверяем если в товаре.
        if($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          if($check_attr->num_rows > 0){

            //Значит такой атрибут есть и нужно его обновить.
            $attr[1] = trim($attr[1]);
            $this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET `text`='".$this->db->escape($attr[1])."' WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);
            $log[] = ['name'=>'Атрибут обновлен в товаре '.$attr[0], 'value'=>$attr[1]];

          }else{

            //если нет тогда добавить его в товар.
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }
        }

      }elseif($u_attr == 3 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если сушествует тогда проверяем если в товаре.
        if($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          //если нет тогда добавить его в товар.
          if($check_attr->num_rows == 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }
        }

      }elseif($u_attr == 4 && $up_permit){
        
        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если сушествует тогда проверяем если в товаре.
        if($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          if($check_attr->num_rows > 0){

            //Значит такой атрибут есть и нужно его обновить.
            $attr[1] = trim($attr[1]);
            $this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET `text`='".$this->db->escape($attr[1])."' WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);
            $log[] = ['name'=>'Атрибут обновлен в товаре '.$attr[0], 'value'=>$attr[1]];

          }
        }

      }elseif($u_attr == 5 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если нету тогда создаем.
        if($attr['id'] == 0){

          $attr['id'] = addAttr($this, $attr[0], $langs, $group_id, $dn_id);
          //Если после создания атрибут есть тогда записываем его в товар. Если нет проходим дальше.
          if($attr['id'] != 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);

            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }

        }elseif($attr['id'] > 0){
          //если нет тогда добавить его в товар.
          $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
          $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
        }

      }


    }
  }


//проверка присуцтвия группы атрибутов.
function getGroupId($thiss, $grop_name){

  //проверяем есть ли такая граппа атрибутов.
  $group_id = $thiss->db->query("SELECT attribute_group_id FROM `".DB_PREFIX."attribute_group_description` WHERE name = '".$thiss->db->escape($grop_name)."'");
  #$thiss->wtfarrey($group_id);

  //если есть используем ее, если нет создаем.
  if($group_id->num_rows > 0){
    $group_id = $group_id->row['attribute_group_id'];
  }else{
    $group_id = 0;
  }

  return $group_id;
}

//создание новой группы.
function addNewGroupAttr($thiss, $grop_name, $langs, $dn_id){

  //Создаем новую группу.
  $thiss->db->query("INSERT INTO `".DB_PREFIX."attribute_group` SET sort_order = '0'");
  $group_id = $thiss->db->getLastId();

  //Описание группы
  foreach($langs as $lang){
    $thiss->db->query("INSERT INTO `".DB_PREFIX."attribute_group_description` SET attribute_group_id = ".(int)$group_id.", name = '".$thiss->db->escape($grop_name)."', language_id =".(int)$lang['language_id']);
  }

  $path = DIR_LOGS."simplepars_id-".$dn_id.".log";
  $text = date("Y-m-d H:i:s").'| -> СОЗДАНА НОВАЯ ГРУППА для атрибутов | Название - ['.$grop_name.'] | id новой группы - ['.$group_id.']'.PHP_EOL;
  file_put_contents($path, $text, FILE_APPEND);

  return $group_id;
}

//Проверяем сушествует ли атрибут в нужно группе. 
function getIdAttr($thiss, $name, $group_id){
  $name = substr(trim($name), 0, 256);
  #Убираем двое точие в конце атрибута.
  if(substr($name, -1) == ':'){ $name = substr($name, 0, -1); }
  #Вдруг имя атрибута стало пустым.
  if(empty($name)){
    return 0;
  }

  $rows = $thiss->db->query("SELECT d.attribute_id as attr_id FROM `".DB_PREFIX."attribute_description` d INNER JOIN ".DB_PREFIX."attribute a ON 
    d.attribute_id = a.attribute_id WHERE attribute_group_id = ".(int)$group_id." AND d.name ='".$thiss->db->escape($name)."'");
  if($rows->num_rows == 0){
    $attr_id = 0;
  }else{
    $attr_id = $rows->row['attr_id'];
  }
  return $attr_id;
}

//Создаем атрибут и возврашаем его id
function addAttr($thiss, $name, $langs, $group_id, $dn_id){
  $name = substr(trim($name), 0, 256);
  $attr_id = 0;
  #Убираем двое точие в конце атрибута.
  if(substr($name, -1) == ':'){ $name = substr($name, 0, -1); }

  if(empty($name)){
    return $attr_id;
  }

  $thiss->db->query("INSERT INTO `".DB_PREFIX."attribute` SET `attribute_group_id`='".(int)$group_id."',`sort_order`=0");
  $attr_id = $thiss->db->getLastId();

  //проверяем что бы создался
  if($attr_id > 0){
    #Записываем в дескрипшн.
    foreach($langs as $lang){
      $thiss->db->query("INSERT INTO ".DB_PREFIX."attribute_description SET attribute_id = '".(int)$attr_id."', language_id = '".(int)$lang['language_id']."', name = '".$thiss->db->escape($name)."'");
    }
    //Сообшаем о создании нового атрибута.
    $log = ['attr_name' => $name, 'r_attr_group' => $group_id];
    $thiss->log('AddNewAttr', $log, $dn_id);
  }else{
    $log = ['attr_name' => $name, 'r_attr_group' => $group_id];
    $thiss->log('NoAddNewAttr', $log, $dn_id);
  }

  return $attr_id;
}

?>

 


Настройки скрипта.
 

Спойлер

3NXTrKW.png


1. Укажите id границы парсинга в которой составлен текст для работы с атрибутами (Как составлен текст будет описано дальше.)
2. Укажите режим работы атрибутов при создании товара. (Цифра от 0 до 2)
3. Укажите режим работы пр обновлении товара. (Цифра от 0 до 5)
4. Разрешить создавать группы атрибутов или нет. Если указано нет то группа для атрибутов будет братся из настроек атрибутов что я показал в начале статьи.

 

Как составлять строку для создания атрибутов с учетом групп.
Логика формирования осталась прежняя, имя атрибута отделяется от значения тегом {csvnc} но так же добавились еше два тега.
{g-start} - текст начала имени группы атрибутов.

{g-stop} - текст окончания имени группы атрибутов.
Модуль сперва находит группу атрибутов, и затем все атрибуты которые идут после группы будут записаны в эту группу. Пока не закончатся или не встретится указание новой группы.

Пример нового формата.

Спойлер

{g-start}Электрические характеристики{g-stop}Выбор диапазона{csvnc}Автоматический{csvnc}Аналого-цифровой преобразователь{csvnc} 4 канала, 24 бит{csvnc}  Рабочий диапазон частот{csvnc}  От 2 Гц до 20 кГц{csvnc}  Дискретизация{csvnc}  51,2 Гц{csvnc}  Функции обработки цифрового сигнала{csvnc}  Автоматически настраиваемый фильтр защиты от наложения частот, фильтр верхних частот, прореживание, наложение, отсечение части сигнала, быстрое преобразование Фурье и усреднение.{csvnc}  Частота дискретизации{csvnc}  От 2,5 кГц до 50 кГц{csvnc}  Динамический диапазон{csvnc}  128 дБ{csvnc}  Отношение сигнала/шума{csvnc}  100 дБ{csvnc}  Разрешение быстрого преобразования Фурье{csvnc}  800 линий{csvnc}  Спектральные окна{csvnc}  Ганнирование{csvnc}  Единицы измерения частоты{csvnc}  Гц, порядки, цикл/мин{csvnc}  Единицы измерения амплитуды{csvnc}  дюйм/с, мм/с, колебательная скорость в дБ (VdB (США)), колебательная скорость в дБ (VdB* (Европа)){csvnc}  Энергонезависимая память{csvnc}  Карта памяти SD micro, 2 Гб внутренней памяти + разъем для установки пользовательского дополнительного устройства хранения данных{csvnc}{g-start}Общие характеристики{g-stop}  Размеры (В x Ш x Д){csvnc}  18,56 см x 7,00 см x 26,72 см (7,30 дюйма x 2,76 дюйма x 10,52 дюйма){csvnc}  Масса (с аккумуляторной батареей){csvnc}  1,9 кг (4,2 фунта){csvnc}  Дисплей{csvnc}  VGA, 320x240, цветной, диагональ 5,7 дюйма, жидкокристаллический дисплей на тонкоплёночных транзисторах со светодиодной подсветкой{csvnc}  


Как это будет работать?
При использовании этого скрипта атрибуты будут создаваться, каждый в своей группе.
Так же при обновлении добавлении скрипт будет проверять присутствие атрибута в конкретной группе.
То есть теперь атрибутов могут быть одинаковые атрибуты и располагаться в разных группах, и скрипт при добавлении и обновлении будет учитывать это.

================================
Все кому это было нужно копируйте ссылку сохраняйте себе.
Так же с этим постом заканчиваю вопрос скриптов.
Я думаю скрипт который состоит из 350 строк использует как встроенные функции в модуль, так и свои личные функции, получает данные из модуля для своей работы, является самым большим пособием по написанию собственных скриптов под любые задачи!

Сам PHP скрипт attr_group.php => attr_group.php

  • +1 8
Надіслати
Поділитися на інших сайтах

Всем привет!

Год назад уже задавал такой вопрос. Модуль изменился, появилась возможность работать со скриптами. Сам скрипты писать не умею. Обращаюсь к спецам.

Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021

Еще вопрос. Отзывы о товаре. Как спарсить и, главное, загрузить на вкладку Отзывы в нашем магазине? Поделитесь опытом, пожалуйста.

Надіслати
Поділитися на інших сайтах


11 часов назад, Rassol2 сказал:

ВНИМАНИЕ!!!

PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп.
 

Предисловие.
Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени.
Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете.
Так же вы можете дописать любую другую часть.

Инструкция к скрипту.
Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов.
Вот так.
 

  Показать контент

1zos1cp.png


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

Далее настраиваем работу С скриптом.
Выбираем какой скрипт, и выбираем когда выполнять.

Выполнять нужно исключительно После парсинга в ИМ!

  Показать контент

kXDhLTP.png


Сам файл скрипта будет прикреплен к этому посту в самом низу.
Вы можете его загрузить через фтп в директорию /admin/simplepars/scripts/
Или же создать свой и перенсти туда код через встроенный редактор, просто скопировать вставить и сохранить.

 

Код для просмотра.

  Показать контент


<?php
  
  # УПРАВЛЕНИЕ АТРИБУТАМИ 
  
  //Укажите номер границы парсинга в которой находится текст подготовленный для загрузки в атрибуты.
  $gran_id = 0;

  //////////////////////////////////////////////////
  // Работа с атрибутами при СОЗДАНИИ товара 
  // 0 - Не работать с атрибутами
  // 1 - Создавать атрибута если такого нет, добавлять атрибуты в товар
  // 2 - Добавлять в товар без создания новых атрибутов
  ////////////////////////////////////////////////////
  $r_attr = 0;

  //////////////////////////////////////
  // Работа с атрибутами при ОБНОВЛЕНИИ товара 
  // 0 - Не работать с атрибутами.
  // 1 - Создавать/Добавлять/Обновлять атрибуты.
  // 2 - Добавить/Обновить атрибуты в товаре, не создавать новые.
  // 3 - Добавить новый не обновлять существующие, не создавать новые
  // 4 - Обновить значения существующих атрибутов, не добавлять, не создавать новые.
  // 5 - Удалить все атрибуты в товаре и загрузить заново
  ///////////////////////////////////////
  $u_attr = 0;

  // Разрешить или запретить создание новый груп атрибутов. 
  // 1 - разрешить 
  // 0 - запретить, в этом случаи для атрибутов будет указана группа с настроек модуля.
  $add_new_group = 1;



  //навожу удобство.
  $setting = $script_data['setting'];
  $langs = $this->getLang($setting);


  //определяем что у нас обновление или добавлени товара. 
  $add_permit = 0;
  $up_permit = 0;
  $pr_id = 0;

  if($script_data['permit']['add']['permit']){
    $pr_id = $script_data['permit']['add']['pr_id'];
    $add_permit = 1;
  }elseif($script_data['permit']['up']['permit']){
    $pr_id = $script_data['permit']['up']['pr_id'];
    $up_permit = 1;
  }

  //Разбиваем границу на массив
  if(!empty($script_data['form']['script_gran'][$gran_id])){
    $attr_str = $script_data['form']['script_gran'][$gran_id];
  }else{
    $attr_str = '';
  }
  $attr_arr = explode('{g-start}', $attr_str);

  foreach ($attr_arr as $key => &$value) {
    $value = explode('{g-stop}', $value);

    //присваемвам для удобства ключи.
    if(empty($value[1])){
      $value['group'] = '';
      $value['value'] = $this->madeAttrArrey($value[0]);
    }else{
      $value['group'] = trim($value[0]);
      $value['value'] = $this->madeAttrArrey($value[1]);
    }
    unset($value[0]);
    unset($value[1]);

  }


  //обрабатываем полученные данные.
  foreach($attr_arr as $attr_data){

    // Проверяем есть ли такая группа атрибутов в магазине. И если нет создаем. И возврашаем id
    // По умолчанию группа будет с настрек модуля;
    $group_id = $setting['r_attr_group'];
    
    if(!empty($attr_data['group'])){
      
      //Приводим в порядок имя группы.
      $grop_name = mb_substr(trim($attr_data['group']), 0, 64);

      //проверяем есть ли группа атрибутов
      $group_id = getGroupId($this, $grop_name);

      //если такая группа отсуцтвует создаем ее.
      if(empty($group_id) && $add_new_group){
        $group_id = addNewGroupAttr($this, $grop_name, $langs, $dn_id);
      }

      if(empty($group_id)){ $group_id = $setting['r_attr_group']; }

    }

    //дополнительный блок исключительно для пятой версии атрибутов при обновлении.
    if($u_attr == 5 && $up_permit){
      #Сначала удаляем все атрибуты из товара.
      $this->db->query("DELETE FROM `".DB_PREFIX."product_attribute` WHERE `product_id`=".(int)$pr_id);
    }

    //переходим к работе с атрибутами.
    foreach($attr_data['value'] as $attr){

      //Работае с атрибутами при создании товара
      if($r_attr == 1 && $add_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);
        #Если нету тогда создаем.
        if($attr['id'] == 0){
          $attr['id'] = addAttr($this, $attr[0], $langs, $group_id, $dn_id);

          //Если после создания атрибут есть тогда записываем его в товар. Если нет проходим дальше.
          if($attr['id'] != 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
          }

        }else{
          #Если такой атрибут найден тогда присвяеваем его товару.
          $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
        }

      }elseif($r_attr == 2 && $add_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);
        //Если есть такой атрибут добавляем его в товар. Если нет пропускаем.
        if($attr['id'] != 0){
          $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
        }

      }

      //Работа с атрибутами при обновлении товара.
      if($u_attr == 1 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если нету тогда создаем.
        if($attr['id'] == 0){

          $attr['id'] = addAttr($this, $attr[0], $langs, $group_id, $dn_id);
          //Если после создания атрибут есть тогда записываем его в товар. Если нет проходим дальше.
          if($attr['id'] != 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);

            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }

        }elseif($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          if($check_attr->num_rows > 0){

            //Значит такой атрибут есть и нужно его обновить.
            $attr[1] = trim($attr[1]);
            $this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET `text`='".$this->db->escape($attr[1])."' WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);
            $log[] = ['name'=>'Атрибут обновлен в товаре '.$attr[0], 'value'=>$attr[1]];

          }else{

            //если нет тогда добавить его в товар.
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }
        }

      }elseif($u_attr == 2 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если сушествует тогда проверяем если в товаре.
        if($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          if($check_attr->num_rows > 0){

            //Значит такой атрибут есть и нужно его обновить.
            $attr[1] = trim($attr[1]);
            $this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET `text`='".$this->db->escape($attr[1])."' WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);
            $log[] = ['name'=>'Атрибут обновлен в товаре '.$attr[0], 'value'=>$attr[1]];

          }else{

            //если нет тогда добавить его в товар.
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }
        }

      }elseif($u_attr == 3 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если сушествует тогда проверяем если в товаре.
        if($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          //если нет тогда добавить его в товар.
          if($check_attr->num_rows == 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }
        }

      }elseif($u_attr == 4 && $up_permit){
        
        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если сушествует тогда проверяем если в товаре.
        if($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          if($check_attr->num_rows > 0){

            //Значит такой атрибут есть и нужно его обновить.
            $attr[1] = trim($attr[1]);
            $this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET `text`='".$this->db->escape($attr[1])."' WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);
            $log[] = ['name'=>'Атрибут обновлен в товаре '.$attr[0], 'value'=>$attr[1]];

          }
        }

      }elseif($u_attr == 5 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если нету тогда создаем.
        if($attr['id'] == 0){

          $attr['id'] = addAttr($this, $attr[0], $langs, $group_id, $dn_id);
          //Если после создания атрибут есть тогда записываем его в товар. Если нет проходим дальше.
          if($attr['id'] != 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);

            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }

        }elseif($attr['id'] > 0){
          //если нет тогда добавить его в товар.
          $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
          $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
        }

      }


    }
  }


//проверка присуцтвия группы атрибутов.
function getGroupId($thiss, $grop_name){

  //проверяем есть ли такая граппа атрибутов.
  $group_id = $thiss->db->query("SELECT attribute_group_id FROM `".DB_PREFIX."attribute_group_description` WHERE name = '".$thiss->db->escape($grop_name)."'");
  #$thiss->wtfarrey($group_id);

  //если есть используем ее, если нет создаем.
  if($group_id->num_rows > 0){
    $group_id = $group_id->row['attribute_group_id'];
  }else{
    $group_id = 0;
  }

  return $group_id;
}

//создание новой группы.
function addNewGroupAttr($thiss, $grop_name, $langs, $dn_id){

  //Создаем новую группу.
  $thiss->db->query("INSERT INTO `".DB_PREFIX."attribute_group` SET sort_order = '0'");
  $group_id = $thiss->db->getLastId();

  //Описание группы
  foreach($langs as $lang){
    $thiss->db->query("INSERT INTO `".DB_PREFIX."attribute_group_description` SET attribute_group_id = ".(int)$group_id.", name = '".$thiss->db->escape($grop_name)."', language_id =".(int)$lang['language_id']);
  }

  $path = DIR_LOGS."simplepars_id-".$dn_id.".log";
  $text = date("Y-m-d H:i:s").'| -> СОЗДАНА НОВАЯ ГРУППА для атрибутов | Название - ['.$grop_name.'] | id новой группы - ['.$group_id.']'.PHP_EOL;
  file_put_contents($path, $text, FILE_APPEND);

  return $group_id;
}

//Проверяем сушествует ли атрибут в нужно группе. 
function getIdAttr($thiss, $name, $group_id){
  $name = substr(trim($name), 0, 256);
  #Убираем двое точие в конце атрибута.
  if(substr($name, -1) == ':'){ $name = substr($name, 0, -1); }
  #Вдруг имя атрибута стало пустым.
  if(empty($name)){
    return 0;
  }

  $rows = $thiss->db->query("SELECT d.attribute_id as attr_id FROM `".DB_PREFIX."attribute_description` d INNER JOIN ".DB_PREFIX."attribute a ON 
    d.attribute_id = a.attribute_id WHERE attribute_group_id = ".(int)$group_id." AND d.name ='".$thiss->db->escape($name)."'");
  if($rows->num_rows == 0){
    $attr_id = 0;
  }else{
    $attr_id = $rows->row['attr_id'];
  }
  return $attr_id;
}

//Создаем атрибут и возврашаем его id
function addAttr($thiss, $name, $langs, $group_id, $dn_id){
  $name = substr(trim($name), 0, 256);
  $attr_id = 0;
  #Убираем двое точие в конце атрибута.
  if(substr($name, -1) == ':'){ $name = substr($name, 0, -1); }

  if(empty($name)){
    return $attr_id;
  }

  $thiss->db->query("INSERT INTO `".DB_PREFIX."attribute` SET `attribute_group_id`='".(int)$group_id."',`sort_order`=0");
  $attr_id = $thiss->db->getLastId();

  //проверяем что бы создался
  if($attr_id > 0){
    #Записываем в дескрипшн.
    foreach($langs as $lang){
      $thiss->db->query("INSERT INTO ".DB_PREFIX."attribute_description SET attribute_id = '".(int)$attr_id."', language_id = '".(int)$lang['language_id']."', name = '".$thiss->db->escape($name)."'");
    }
    //Сообшаем о создании нового атрибута.
    $log = ['attr_name' => $name, 'r_attr_group' => $group_id];
    $thiss->log('AddNewAttr', $log, $dn_id);
  }else{
    $log = ['attr_name' => $name, 'r_attr_group' => $group_id];
    $thiss->log('NoAddNewAttr', $log, $dn_id);
  }

  return $attr_id;
}

?>

 


Настройки скрипта.
 

  Показать контент

3NXTrKW.png


1. Укажите id границы парсинга в которой составлен текст для работы с атрибутами (Как составлен текст будет описано дальше.)
2. Укажите режим работы атрибутов при создании товара. (Цифра от 0 до 2)
3. Укажите режим работы пр обновлении товара. (Цифра от 0 до 5)
4. Разрешить создавать группы атрибутов или нет. Если указано нет то группа для атрибутов будет братся из настроек атрибутов что я показал в начале статьи.

 

Как составлять строку для создания атрибутов с учетом групп.
Логика формирования осталась прежняя, имя атрибута отделяется от значения тегом {csvnc} но так же добавились еше два тега.
{g-start} - текст начала имени группы атрибутов.

{g-stop} - текст окончания имени группы атрибутов.
Модуль сперва находит группу атрибутов, и затем все атрибуты которые идут после группы будут записаны в эту группу. Пока не закончатся или не встретится указание новой группы.

Пример нового формата.

  Скрыть контент

{g-start}Электрические характеристики{g-stop}Выбор диапазона{csvnc}Автоматический{csvnc}Аналого-цифровой преобразователь{csvnc} 4 канала, 24 бит{csvnc}  Рабочий диапазон частот{csvnc}  От 2 Гц до 20 кГц{csvnc}  Дискретизация{csvnc}  51,2 Гц{csvnc}  Функции обработки цифрового сигнала{csvnc}  Автоматически настраиваемый фильтр защиты от наложения частот, фильтр верхних частот, прореживание, наложение, отсечение части сигнала, быстрое преобразование Фурье и усреднение.{csvnc}  Частота дискретизации{csvnc}  От 2,5 кГц до 50 кГц{csvnc}  Динамический диапазон{csvnc}  128 дБ{csvnc}  Отношение сигнала/шума{csvnc}  100 дБ{csvnc}  Разрешение быстрого преобразования Фурье{csvnc}  800 линий{csvnc}  Спектральные окна{csvnc}  Ганнирование{csvnc}  Единицы измерения частоты{csvnc}  Гц, порядки, цикл/мин{csvnc}  Единицы измерения амплитуды{csvnc}  дюйм/с, мм/с, колебательная скорость в дБ (VdB (США)), колебательная скорость в дБ (VdB* (Европа)){csvnc}  Энергонезависимая память{csvnc}  Карта памяти SD micro, 2 Гб внутренней памяти + разъем для установки пользовательского дополнительного устройства хранения данных{csvnc}{g-start}Общие характеристики{g-stop}  Размеры (В x Ш x Д){csvnc}  18,56 см x 7,00 см x 26,72 см (7,30 дюйма x 2,76 дюйма x 10,52 дюйма){csvnc}  Масса (с аккумуляторной батареей){csvnc}  1,9 кг (4,2 фунта){csvnc}  Дисплей{csvnc}  VGA, 320x240, цветной, диагональ 5,7 дюйма, жидкокристаллический дисплей на тонкоплёночных транзисторах со светодиодной подсветкой{csvnc}  


Как это будет работать?
При использовании этого скрипта атрибуты будут создаваться, каждый в своей группе.
Так же при обновлении добавлении скрипт будет проверять присутствие атрибута в конкретной группе.
То есть теперь атрибутов могут быть одинаковые атрибуты и располагаться в разных группах, и скрипт при добавлении и обновлении будет учитывать это.

================================
Все кому это было нужно копируйте ссылку сохраняйте себе.
Так же с этим постом заканчиваю вопрос скриптов.
Я думаю скрипт который состоит из 350 строк использует как встроенные функции в модуль, так и свои личные функции, получает данные из модуля для своей работы, является самым большим пособием по написанию собственных скриптов под любые задачи!

Сам PHP скрипт attr_group.php => attr_group.php

Очень крутое дополнение! Снимает множество головняков в формировании сложных атрибутов.

Надіслати
Поділитися на інших сайтах


Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get.

Но по аналогии email=[email protected]&password=111111

авторизация не проходит. Что делать с этим?

Надіслати
Поділитися на інших сайтах


1 минуту назад, ArtemZH сказал:

Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get.

Но по аналогии email=[email protected]&password=111111

авторизация не проходит. Что делать с этим?

Здравствуйте.
Искать пост. В 99.99% он есть, ищите. На одном гете авторизацию не строят.

Надіслати
Поділитися на інших сайтах

17 часов назад, Rassol2 сказал:

ВНИМАНИЕ!!!

PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп.
 

Предисловие.
Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени.
Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете.
Так же вы можете дописать любую другую часть.

Инструкция к скрипту.
Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов.
Вот так.
 

  Показать контент

1zos1cp.png


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

Далее настраиваем работу С скриптом.
Выбираем какой скрипт, и выбираем когда выполнять.

Выполнять нужно исключительно После парсинга в ИМ!

  Показать контент

kXDhLTP.png


Сам файл скрипта будет прикреплен к этому посту в самом низу.
Вы можете его загрузить через фтп в директорию /admin/simplepars/scripts/
Или же создать свой и перенсти туда код через встроенный редактор, просто скопировать вставить и сохранить.

 

Код для просмотра.

  Показать контент


<?php
  
  # УПРАВЛЕНИЕ АТРИБУТАМИ 
  
  //Укажите номер границы парсинга в которой находится текст подготовленный для загрузки в атрибуты.
  $gran_id = 0;

  //////////////////////////////////////////////////
  // Работа с атрибутами при СОЗДАНИИ товара 
  // 0 - Не работать с атрибутами
  // 1 - Создавать атрибута если такого нет, добавлять атрибуты в товар
  // 2 - Добавлять в товар без создания новых атрибутов
  ////////////////////////////////////////////////////
  $r_attr = 0;

  //////////////////////////////////////
  // Работа с атрибутами при ОБНОВЛЕНИИ товара 
  // 0 - Не работать с атрибутами.
  // 1 - Создавать/Добавлять/Обновлять атрибуты.
  // 2 - Добавить/Обновить атрибуты в товаре, не создавать новые.
  // 3 - Добавить новый не обновлять существующие, не создавать новые
  // 4 - Обновить значения существующих атрибутов, не добавлять, не создавать новые.
  // 5 - Удалить все атрибуты в товаре и загрузить заново
  ///////////////////////////////////////
  $u_attr = 0;

  // Разрешить или запретить создание новый груп атрибутов. 
  // 1 - разрешить 
  // 0 - запретить, в этом случаи для атрибутов будет указана группа с настроек модуля.
  $add_new_group = 1;



  //навожу удобство.
  $setting = $script_data['setting'];
  $langs = $this->getLang($setting);


  //определяем что у нас обновление или добавлени товара. 
  $add_permit = 0;
  $up_permit = 0;
  $pr_id = 0;

  if($script_data['permit']['add']['permit']){
    $pr_id = $script_data['permit']['add']['pr_id'];
    $add_permit = 1;
  }elseif($script_data['permit']['up']['permit']){
    $pr_id = $script_data['permit']['up']['pr_id'];
    $up_permit = 1;
  }

  //Разбиваем границу на массив
  if(!empty($script_data['form']['script_gran'][$gran_id])){
    $attr_str = $script_data['form']['script_gran'][$gran_id];
  }else{
    $attr_str = '';
  }
  $attr_arr = explode('{g-start}', $attr_str);

  foreach ($attr_arr as $key => &$value) {
    $value = explode('{g-stop}', $value);

    //присваемвам для удобства ключи.
    if(empty($value[1])){
      $value['group'] = '';
      $value['value'] = $this->madeAttrArrey($value[0]);
    }else{
      $value['group'] = trim($value[0]);
      $value['value'] = $this->madeAttrArrey($value[1]);
    }
    unset($value[0]);
    unset($value[1]);

  }


  //обрабатываем полученные данные.
  foreach($attr_arr as $attr_data){

    // Проверяем есть ли такая группа атрибутов в магазине. И если нет создаем. И возврашаем id
    // По умолчанию группа будет с настрек модуля;
    $group_id = $setting['r_attr_group'];
    
    if(!empty($attr_data['group'])){
      
      //Приводим в порядок имя группы.
      $grop_name = mb_substr(trim($attr_data['group']), 0, 64);

      //проверяем есть ли группа атрибутов
      $group_id = getGroupId($this, $grop_name);

      //если такая группа отсуцтвует создаем ее.
      if(empty($group_id) && $add_new_group){
        $group_id = addNewGroupAttr($this, $grop_name, $langs, $dn_id);
      }

      if(empty($group_id)){ $group_id = $setting['r_attr_group']; }

    }

    //дополнительный блок исключительно для пятой версии атрибутов при обновлении.
    if($u_attr == 5 && $up_permit){
      #Сначала удаляем все атрибуты из товара.
      $this->db->query("DELETE FROM `".DB_PREFIX."product_attribute` WHERE `product_id`=".(int)$pr_id);
    }

    //переходим к работе с атрибутами.
    foreach($attr_data['value'] as $attr){

      //Работае с атрибутами при создании товара
      if($r_attr == 1 && $add_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);
        #Если нету тогда создаем.
        if($attr['id'] == 0){
          $attr['id'] = addAttr($this, $attr[0], $langs, $group_id, $dn_id);

          //Если после создания атрибут есть тогда записываем его в товар. Если нет проходим дальше.
          if($attr['id'] != 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
          }

        }else{
          #Если такой атрибут найден тогда присвяеваем его товару.
          $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
        }

      }elseif($r_attr == 2 && $add_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);
        //Если есть такой атрибут добавляем его в товар. Если нет пропускаем.
        if($attr['id'] != 0){
          $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
        }

      }

      //Работа с атрибутами при обновлении товара.
      if($u_attr == 1 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если нету тогда создаем.
        if($attr['id'] == 0){

          $attr['id'] = addAttr($this, $attr[0], $langs, $group_id, $dn_id);
          //Если после создания атрибут есть тогда записываем его в товар. Если нет проходим дальше.
          if($attr['id'] != 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);

            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }

        }elseif($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          if($check_attr->num_rows > 0){

            //Значит такой атрибут есть и нужно его обновить.
            $attr[1] = trim($attr[1]);
            $this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET `text`='".$this->db->escape($attr[1])."' WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);
            $log[] = ['name'=>'Атрибут обновлен в товаре '.$attr[0], 'value'=>$attr[1]];

          }else{

            //если нет тогда добавить его в товар.
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }
        }

      }elseif($u_attr == 2 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если сушествует тогда проверяем если в товаре.
        if($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          if($check_attr->num_rows > 0){

            //Значит такой атрибут есть и нужно его обновить.
            $attr[1] = trim($attr[1]);
            $this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET `text`='".$this->db->escape($attr[1])."' WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);
            $log[] = ['name'=>'Атрибут обновлен в товаре '.$attr[0], 'value'=>$attr[1]];

          }else{

            //если нет тогда добавить его в товар.
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }
        }

      }elseif($u_attr == 3 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если сушествует тогда проверяем если в товаре.
        if($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          //если нет тогда добавить его в товар.
          if($check_attr->num_rows == 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }
        }

      }elseif($u_attr == 4 && $up_permit){
        
        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если сушествует тогда проверяем если в товаре.
        if($attr['id'] > 0){

          //Проверяем есть ли в товере такой атрибут.
          $check_attr = $this->db->query("SELECT * FROM `".DB_PREFIX."product_attribute`
            WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);

          if($check_attr->num_rows > 0){

            //Значит такой атрибут есть и нужно его обновить.
            $attr[1] = trim($attr[1]);
            $this->db->query("UPDATE `".DB_PREFIX."product_attribute` SET `text`='".$this->db->escape($attr[1])."' WHERE `product_id`=".(int)$pr_id." AND `attribute_id`=".(int)$attr['id']);
            $log[] = ['name'=>'Атрибут обновлен в товаре '.$attr[0], 'value'=>$attr[1]];

          }
        }

      }elseif($u_attr == 5 && $up_permit){

        $attr['id'] = getIdAttr($this, $attr[0], $group_id);

        #Если нету тогда создаем.
        if($attr['id'] == 0){

          $attr['id'] = addAttr($this, $attr[0], $langs, $group_id, $dn_id);
          //Если после создания атрибут есть тогда записываем его в товар. Если нет проходим дальше.
          if($attr['id'] != 0){
            $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);

            $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
          }

        }elseif($attr['id'] > 0){
          //если нет тогда добавить его в товар.
          $this->addAttrToProduct($pr_id, $attr, $langs, $dn_id);
          $log[] = ['name'=>'Атрибут добавлен в товар '.trim($attr[0]), 'value'=>trim($attr[1])];
        }

      }


    }
  }


//проверка присуцтвия группы атрибутов.
function getGroupId($thiss, $grop_name){

  //проверяем есть ли такая граппа атрибутов.
  $group_id = $thiss->db->query("SELECT attribute_group_id FROM `".DB_PREFIX."attribute_group_description` WHERE name = '".$thiss->db->escape($grop_name)."'");
  #$thiss->wtfarrey($group_id);

  //если есть используем ее, если нет создаем.
  if($group_id->num_rows > 0){
    $group_id = $group_id->row['attribute_group_id'];
  }else{
    $group_id = 0;
  }

  return $group_id;
}

//создание новой группы.
function addNewGroupAttr($thiss, $grop_name, $langs, $dn_id){

  //Создаем новую группу.
  $thiss->db->query("INSERT INTO `".DB_PREFIX."attribute_group` SET sort_order = '0'");
  $group_id = $thiss->db->getLastId();

  //Описание группы
  foreach($langs as $lang){
    $thiss->db->query("INSERT INTO `".DB_PREFIX."attribute_group_description` SET attribute_group_id = ".(int)$group_id.", name = '".$thiss->db->escape($grop_name)."', language_id =".(int)$lang['language_id']);
  }

  $path = DIR_LOGS."simplepars_id-".$dn_id.".log";
  $text = date("Y-m-d H:i:s").'| -> СОЗДАНА НОВАЯ ГРУППА для атрибутов | Название - ['.$grop_name.'] | id новой группы - ['.$group_id.']'.PHP_EOL;
  file_put_contents($path, $text, FILE_APPEND);

  return $group_id;
}

//Проверяем сушествует ли атрибут в нужно группе. 
function getIdAttr($thiss, $name, $group_id){
  $name = substr(trim($name), 0, 256);
  #Убираем двое точие в конце атрибута.
  if(substr($name, -1) == ':'){ $name = substr($name, 0, -1); }
  #Вдруг имя атрибута стало пустым.
  if(empty($name)){
    return 0;
  }

  $rows = $thiss->db->query("SELECT d.attribute_id as attr_id FROM `".DB_PREFIX."attribute_description` d INNER JOIN ".DB_PREFIX."attribute a ON 
    d.attribute_id = a.attribute_id WHERE attribute_group_id = ".(int)$group_id." AND d.name ='".$thiss->db->escape($name)."'");
  if($rows->num_rows == 0){
    $attr_id = 0;
  }else{
    $attr_id = $rows->row['attr_id'];
  }
  return $attr_id;
}

//Создаем атрибут и возврашаем его id
function addAttr($thiss, $name, $langs, $group_id, $dn_id){
  $name = substr(trim($name), 0, 256);
  $attr_id = 0;
  #Убираем двое точие в конце атрибута.
  if(substr($name, -1) == ':'){ $name = substr($name, 0, -1); }

  if(empty($name)){
    return $attr_id;
  }

  $thiss->db->query("INSERT INTO `".DB_PREFIX."attribute` SET `attribute_group_id`='".(int)$group_id."',`sort_order`=0");
  $attr_id = $thiss->db->getLastId();

  //проверяем что бы создался
  if($attr_id > 0){
    #Записываем в дескрипшн.
    foreach($langs as $lang){
      $thiss->db->query("INSERT INTO ".DB_PREFIX."attribute_description SET attribute_id = '".(int)$attr_id."', language_id = '".(int)$lang['language_id']."', name = '".$thiss->db->escape($name)."'");
    }
    //Сообшаем о создании нового атрибута.
    $log = ['attr_name' => $name, 'r_attr_group' => $group_id];
    $thiss->log('AddNewAttr', $log, $dn_id);
  }else{
    $log = ['attr_name' => $name, 'r_attr_group' => $group_id];
    $thiss->log('NoAddNewAttr', $log, $dn_id);
  }

  return $attr_id;
}

?>

 


Настройки скрипта.
 

  Показать контент

3NXTrKW.png


1. Укажите id границы парсинга в которой составлен текст для работы с атрибутами (Как составлен текст будет описано дальше.)
2. Укажите режим работы атрибутов при создании товара. (Цифра от 0 до 2)
3. Укажите режим работы пр обновлении товара. (Цифра от 0 до 5)
4. Разрешить создавать группы атрибутов или нет. Если указано нет то группа для атрибутов будет братся из настроек атрибутов что я показал в начале статьи.

 

Как составлять строку для создания атрибутов с учетом групп.
Логика формирования осталась прежняя, имя атрибута отделяется от значения тегом {csvnc} но так же добавились еше два тега.
{g-start} - текст начала имени группы атрибутов.

{g-stop} - текст окончания имени группы атрибутов.
Модуль сперва находит группу атрибутов, и затем все атрибуты которые идут после группы будут записаны в эту группу. Пока не закончатся или не встретится указание новой группы.

Пример нового формата.

  Показать контент

{g-start}Электрические характеристики{g-stop}Выбор диапазона{csvnc}Автоматический{csvnc}Аналого-цифровой преобразователь{csvnc} 4 канала, 24 бит{csvnc}  Рабочий диапазон частот{csvnc}  От 2 Гц до 20 кГц{csvnc}  Дискретизация{csvnc}  51,2 Гц{csvnc}  Функции обработки цифрового сигнала{csvnc}  Автоматически настраиваемый фильтр защиты от наложения частот, фильтр верхних частот, прореживание, наложение, отсечение части сигнала, быстрое преобразование Фурье и усреднение.{csvnc}  Частота дискретизации{csvnc}  От 2,5 кГц до 50 кГц{csvnc}  Динамический диапазон{csvnc}  128 дБ{csvnc}  Отношение сигнала/шума{csvnc}  100 дБ{csvnc}  Разрешение быстрого преобразования Фурье{csvnc}  800 линий{csvnc}  Спектральные окна{csvnc}  Ганнирование{csvnc}  Единицы измерения частоты{csvnc}  Гц, порядки, цикл/мин{csvnc}  Единицы измерения амплитуды{csvnc}  дюйм/с, мм/с, колебательная скорость в дБ (VdB (США)), колебательная скорость в дБ (VdB* (Европа)){csvnc}  Энергонезависимая память{csvnc}  Карта памяти SD micro, 2 Гб внутренней памяти + разъем для установки пользовательского дополнительного устройства хранения данных{csvnc}{g-start}Общие характеристики{g-stop}  Размеры (В x Ш x Д){csvnc}  18,56 см x 7,00 см x 26,72 см (7,30 дюйма x 2,76 дюйма x 10,52 дюйма){csvnc}  Масса (с аккумуляторной батареей){csvnc}  1,9 кг (4,2 фунта){csvnc}  Дисплей{csvnc}  VGA, 320x240, цветной, диагональ 5,7 дюйма, жидкокристаллический дисплей на тонкоплёночных транзисторах со светодиодной подсветкой{csvnc}  


Как это будет работать?
При использовании этого скрипта атрибуты будут создаваться, каждый в своей группе.
Так же при обновлении добавлении скрипт будет проверять присутствие атрибута в конкретной группе.
То есть теперь атрибутов могут быть одинаковые атрибуты и располагаться в разных группах, и скрипт при добавлении и обновлении будет учитывать это.

================================
Все кому это было нужно копируйте ссылку сохраняйте себе.
Так же с этим постом заканчиваю вопрос скриптов.
Я думаю скрипт который состоит из 350 строк использует как встроенные функции в модуль, так и свои личные функции, получает данные из модуля для своей работы, является самым большим пособием по написанию собственных скриптов под любые задачи!

Сам PHP скрипт attr_group.php => attr_group.php

Благодарю! То что нужно было и вовремя)

Надіслати
Поділитися на інших сайтах


9 годин назад, partshez сказав:

Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021

 

 а в чем трудность?

Надіслати
Поділитися на інших сайтах

36 минут назад, Flint2000 сказал:

 а в чем трудность?

Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода

Надіслати
Поділитися на інших сайтах


48 хвилин назад, partshez сказав:

Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода

я понял, там с куками проблема

Надіслати
Поділитися на інших сайтах

Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ 

Стартовая ссылка сам сайт без чего либо 

Шаблон ссылок очередиИли/И  ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/

Шаблон ссылок на товарИли/И  /nasosnoe-oborudovanie/nasosy-skvazhinnye/

Он мне собирает все товары по сайту 

Надіслати
Поділитися на інших сайтах


17 хвилин назад, REVO123 сказав:

Помогите не пойму в чём дело в других случаях работает в этом нет,

Ну так нужно еще и границы сбора ссылок указать

Надіслати
Поділитися на інших сайтах

56 минут назад, REVO123 сказал:

Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ 

Стартовая ссылка сам сайт без чего либо 

Шаблон ссылок очередиИли/И  ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/

Шаблон ссылок на товарИли/И  /nasosnoe-oborudovanie/nasosy-skvazhinnye/

Он мне собирает все товары по сайту 

Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права.
Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе.

Вот демонстрация того что вы описали.

Спойлер

Iq7Bipf.png


Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали.

Надіслати
Поділитися на інших сайтах

42 минуты назад, Flint2000 сказал:

Ну так нужно еще и границы сбора ссылок указать

Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей.

Надіслати
Поділитися на інших сайтах

2 минуты назад, egortide сказал:

Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют

Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов.
Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине.

  • +1 1
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.