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

Recommended Posts

1 час назад, cartmandeejay сказал:

Ребят. у моего поставщика аттрибуты прописаны в виде таблицы из трех колонок: название атрибута, его наименованите (шт; кг; и т.п.) и его значение. Вот код:

  Скрыть контент
  1. <table border="1">
  2. <tbody>
  3. <tr>
  4. <td style="text-align: center;" colspan="8"><strong>Модель</strong></td>
  5. <td style="text-align: center;">FDM06V</td>
  6. </tr>
  7. <tr>
  8. <td style="text-align: center;" colspan="7">Осушение ( 30&deg;С RH 80% )</td>
  9. <td style="text-align: center;">л/ч</td>
  10. <td style="text-align: center;">6</td>
  11. </tr>
  12. <tr>
  13. <td style="text-align: center;" colspan="7">Осушение ( 30&deg;С RH 80% )</td>
  14. <td style="text-align: center;">л/сутки</td>
  15. <td style="text-align: center;">144</td>
  16. </tr>
  17. <tr>
  18. <td style="text-align: center;" colspan="7">Расход воздуха</td>
  19. <td style="text-align: center;">м3/ч</td>
  20. <td style="text-align: center;">900</td>
  21. </tr>
  22. <tr>
  23. <td style="text-align: center;" colspan="7">Объем бака для сбора конденсата</td>
  24. <td style="text-align: center;">л</td>
  25. <td style="text-align: center;">нет</td>
  26. </tr>
  27. <tr>
  28. <td style="text-align: center;" colspan="7">Диаметр дренажной трубки</td>
  29. <td style="text-align: center;">мм</td>
  30. <td style="text-align: center;">20</td>
  31. </tr>
  32. <tr>
  33. <td style="text-align: center;" colspan="7">Электропитание</td>
  34. <td style="text-align: center;">В/Гц</td>
  35. <td style="text-align: center;">220/50</td>
  36. </tr>
  37. <tr>
  38. <td style="text-align: center;" colspan="7">Потребляемая мощность</td>
  39. <td style="text-align: center;">кВт</td>
  40. <td style="text-align: center;">2.3</td>
  41. </tr>
  42. <tr>
  43. <td style="text-align: center;" colspan="7">Рабочий ток</td>
  44. <td style="text-align: center;">А</td>
  45. <td style="text-align: center;">10.5</td>
  46. </tr>
  47. <tr>
  48. <td style="text-align: center;" colspan="7">Марка фреона</td>
  49. <td style="text-align: center;">R</td>
  50. <td style="text-align: center;">410А</td>
  51. </tr>
  52. <tr>
  53. <td style="text-align: center;" colspan="7">Уровень звукового давления</td>
  54. <td style="text-align: center;">дБ</td>
  55. <td style="text-align: center;">50</td>
  56. </tr>
  57. <tr>
  58. <td style="text-align: center;" colspan="7">Рабочий диапазон влажности</td>
  59. <td style="text-align: center;">%</td>
  60. <td style="text-align: center;">40-100</td>
  61. </tr>
  62. <tr>
  63. <td style="text-align: center;" colspan="7">Рабочий диапазон температуры</td>
  64. <td style="text-align: center;">С</td>
  65. <td style="text-align: center;">10-36</td>
  66. </tr>
  67. <tr>
  68. <td style="text-align: center;" colspan="7">Степень защиты</td>
  69. <td style="text-align: center;">IP</td>
  70. <td style="text-align: center;">IPX0</td>
  71. </tr>
  72. <tr>
  73. <td style="text-align: center;" colspan="7">Вес</td>
  74. <td style="text-align: center;">кг</td>
  75. <td style="text-align: center;">83</td>
  76. </tr>
  77. <tr>
  78. <td style="text-align: center;" colspan="7">Размеры (Ш*Г*В)</td>
  79. <td style="text-align: center;">мм</td>
  80. <td style="text-align: center;">&nbsp;480х580(640)х1010&nbsp;</td>
  81. </tr>
  82. <tr>
  83. <td style="text-align: center;" colspan="7">Страна производитель</td>
  84. <td style="text-align: center;">&nbsp;</td>
  85. <td style="text-align: center;">Китай</td>
  86. </tr>
  87. <tr>
  88. <td style="text-align: center;" colspan="7">Срок гарантии</td>
  89. <td style="text-align: center;">&nbsp;</td>
  90. <td style="text-align: center;">
  91. <p>12 мес</p>
  92. </td>
  93. </tr>
  94. </tbody>

Мне необходимо в идеале первое значение склеить со вторым или, хотя-бы, вырезать второе значение, чтобы атрибуты заполнялись корректно. По коду видно, что тут и привязаться особо не к чему. Ситуацию усложняет то, что у некоторых товаров колонок как положено - две. Я так понимаю, модуль в данном случае бесполезен?

Дайте настройки в личку. Попробую помочь

Две ссылки. Одну с тремя, вторую с двумя

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


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

Открываем логи модуля и читаем что там написано.

Operation timed out after 25007 milliseconds with 637998 bytes received
Тоесть, больше время для выполнения запроса выставить нельзя?

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


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

Operation timed out after 25007 milliseconds with 637998 bytes received
Тоесть, больше время для выполнения запроса выставить нельзя?

А у вас на сервере хостер позволяет выполнятся скрипту больше 30 сек ?

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

@Denis8585 Я же заходил к вам, я же ковырялся и уже отписал все по вашему вопросу.
Ошибок со стороны модуля нет.
Ни одного лога нет где было бы написано ошибка симпле парс. Зачем вы опять подымаете тему.
Я вам даже показал что в логах у вас база данных периодически падает.
Вот ваш лог, данные авторизации затер понятное дело.
 

Спойлер

80yeANl.png

А теперь давайте подумаем.
В момент когда модуль запускает выполнение он ставит пометку что сейчас идет работа. И метка эта устанавливается в таблице базы данных.
И если после установки метки кто то попытается запустить повторно выполнение, модуль увидит метку и напишет что уже идет выполнение, и повторно запустить нельзя.
Когда закончится обработка, модуль снимает метку, и отдает приказ запустить следующий партию.
При запуске следующей партии модуль проверяет что бы не было метки, и если ее нет начинает работать.

В целях безопасности стоит тайм аут в 5 минут, если задание за 5 минут не выполнилось и метка не была снята, значит что то пошло не так и модуль сам ее снимает.


И теперь чисто теоретическое размышление.
Допустим вы запускаете крон, он парсит партию или несколько, и работает по указанной выше логике. И в один прекрасный момент у вас (отрыгнула база данных) произошел сбой база данных и метка не была снята, так как запрос на снятие не прошел, база то отконектилась. Что произойдет ?
Правильно, крон хостинга, или вы сами будете пытаться запустить и получать в ответ что идет выполнение и оно закончится через 4 минут, затем 3минуты. И так пока не закончится 5 минут. Тогда модуль сам снимет метку и начнется выполнение следующей партии.
Так сказать один заход в 5 минут.

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

Со своей стороны я зашел к вам и все протестировал ни одной ошибки я не нашел, и вы мне сами лично скидывали логи сервера и там тоже не было ошибок в файлах simplepars
Если у вас появились другие логи и там есть ошибка в файлах моего модуля, пишите я с радостью все проверю и попробую вам помочь, но сейчас без изменения тестовой площадкти не вижу смысла мусолить этот вопрос по кругу.

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

5 часов назад, Denis8585 сказал:

Я не хостинг)

если я не знаю, значит хостинг плохой?

Но к примеру хостинг где разница между временем базы данных и временем веб сервера составляет 4 часа это не очень хорошо. Я бы даже сказал очень плохо.
Но хуже всего что эту разницу они не исправляют а вы идете компенсировать разницу времени в скрипт.
А завтра у них будет тех обслуживание или еше что то и они подвинуть еше разницу сделают ее с 4ч до 6ч
А вы не будете это знать, а у вас логика приложения стоит на этом.
Допустим отключение товаров которые не обновились. И вот в черную пятницу у вас отключатся все товары и вы не сделаете продажи, потому что они вот так решили.

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

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

2 хвилини назад, Zetx сказав:

так что в таком случае делать?

Менять хостинг или покупать VDS

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

4 минуты назад, Zetx сказал:

так что в таком случае делать?

Ответить хотя бы на мой вопрос. :) 

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

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

Ответить хотя бы на мой вопрос. :) 

только что уточнил... ответили, что 120 сек.

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

Парсинг : УСПЕШНЫЙ ЗАПРОС  | Код ответа [200] Ссылка |

но ссылки так и не появились

 

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


45 минут назад, Zetx сказал:

только что уточнил... ответили, что 120 сек.

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

Парсинг : УСПЕШНЫЙ ЗАПРОС  | Код ответа [200] Ссылка |

но ссылки так и не появились

 

Заходите в файл шаблона модуля.
/admin/view/template/catalog/simplepars_browser.tpl
тут находите строку.
<option value="25" <?php echo ($browser['timeout'] == 25)?'selected':''?>>25 сек</option>
И под ней по аналогии добавляете любое нужное вам количество.
К примеру 100 сек

<option value="100" <?php echo ($browser['timeout'] == 100)?'selected':''?>>100 сек</option>

И у вас в настройках запросов появится вариант максимального времени в 100 секунд.

 

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

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

И у вас в настройках запросов появится вариант максимального времени в 100 секунд.

появился, но когда его выбираю, то перебрасывает на 1 сек., тоесть чтоб был выбран вариант именно на 100 сек, то мне надо выбрать 25 сек., другими словами модуль просто устанавливает значение на позицию выше от той, что я ему указываю...

 

в логе выдает:

| Парсинг : УСПЕШНЫЙ ЗАПРОС  | Код ответа [200] Ссылка |

но никаких ссылок нет

Змінено користувачем Zetx
Надіслати
Поділитися на інших сайтах


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

появился, но когда его выбираю, то перебрасывает на 1 сек., тоесть чтоб был выбран вариант именно на 100 сек, то мне надо выбрать 25 сек., другими словами модуль просто устанавливает значение на позицию выше от той, что я ему указываю...

 

в логе выдает:

| Парсинг : УСПЕШНЫЙ ЗАПРОС  | Код ответа [200] Ссылка |

но никаких ссылок нет

Значить внимательнее пропишите текст что я вам дал. Должно выбирается именно значение с 100с 

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

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

Значить внимательнее пропишите текст что я вам дал. Должно выбирается именно значение с 100с 

у меня 3-ка...

я указал здесь, 119 строка:

 <div class="col-sm-2">
                      <label for="input-pr">Макс. время выполнения запроса</label>
                      <select name="timeout" class="form-control">
                        <option value="1" {{ browser['timeout'] == 1?'selected':''}}>1 сек</option>
                       ...
                        <option value="25" {{ browser['timeout'] == 25?'selected':''}}>25 сек</option>
                        <option value="100" {{ browser['timeout'] == 100?'selected':''}}>100 сек</option>
                      </select>
                    </div>

 

 

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


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

у меня 3-ка...

я указал здесь, 119 строка:


 <div class="col-sm-2">
                      <label for="input-pr">Макс. время выполнения запроса</label>
                      <select name="timeout" class="form-control">
                        <option value="1" {{ browser['timeout'] == 1?'selected':''}}>1 сек</option>
                       ...
                        <option value="25" {{ browser['timeout'] == 25?'selected':''}}>25 сек</option>
                        <option value="100" {{ browser['timeout'] == 100?'selected':''}}>100 сек</option>
                      </select>
                    </div>

 

 

Обновите Кеша если к вас тройка. 
вы берите значение с 100 и нажмите сохранить. После этого на странице должно быть выбрано значение с 100

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

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

Обновите Кеша если к вас тройка. 
вы берите значение с 100 и нажмите сохранить. После этого на странице должно быть выбрано значение с 100

в настройках все ок., выставлено 100 сек., 

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

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


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

в настройках все ок., выставлено 100 сек., 

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

Какие либо другие ошибки есть в логах движка , или сервера?

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

Здравствуйте, такой вопрос, никак не удается собрать более 24х ссылок на товары в "Икеи"...

https://www.ikea.com/ro/ro/cat/seturi-de-huse-de-pilota-10680/?page=5
 

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

 

Так же на заметку, - было бы не плохо, если была возможность в после "текст начало/текст конца", вставлять селекторы или "selector", "js pach", "Xpath", - тут точно не промахнешься...

Змінено користувачем AndreiBV
Надіслати
Поділитися на інших сайтах


В 20.08.2021 в 23:29, 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

Спойлер

Как быть, если 

1. Атрибуты у донора идут сначало без групп, а затем появляются группы с атрибутами?

2. Что делать когда группы атрибутов у донора имеют не уникальное название,а привязанное к конкретному товару, например , "внутренний блок НАЗВАНИЕ" и .д. (можно ли обрезать "НАЗВАНИЕ")?

3. До конца не понял как собрать атрибуты с группами, это повторяющаяся граница парсинга. Получается оставить либо атрибуты, либо группы, но что-бы вместе... Если скрипт сам будет собирать атрибуты, исходя из найденых групп, то вопрос №1, как быть ,когда не все атрибуты помещены в группы?

 

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


6 минут назад, climatyuga сказал:
  Скрыть контент

Как быть, если 

1. Атрибуты у донора идут сначало без групп, а затем появляются группы с атрибутами?

2. Что делать когда группы атрибутов у донора имеют не уникальное название,а привязанное к конкретному товару, например , "внутренний блок НАЗВАНИЕ" и .д. (можно ли обрезать "НАЗВАНИЕ")?

3. До конца не понял как собрать атрибуты с группами, это повторяющаяся граница парсинга. Получается оставить либо атрибуты, либо группы, но что-бы вместе... Если скрипт сам будет собирать атрибуты, исходя из найденых групп, то вопрос №1, как быть ,когда не все атрибуты помещены в группы?

 

Ответ на ваш вопрос банален и написан в той же инструкции что вы процитировали.
 

Просто вдумайтесь.
Все что вам нужно составить строку такого типа.
 

Спойлер

{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}  

Где

Спойлер

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

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

 

Ну что бы вы не злились я разъясню почему это исчерпывающий ответ на все ваши вопросы.
 

1) составить строку как выше, можете добавлять группы если их нет. Можете имя группы сделать пробел, все равно. Соблюдайте формат строки.

2) можно все, поиск замена в помощь. Главное соблюдайте формат строки.

3) все что вам нужно понять это: Соблюдайте формат строки описанный в инструкции. Как вы это будете делать все равно, хоть повторяющиеся, хоть через поиск замену. Хоть вручную. Вообще все равно. Главное соблюдайте формат строки.

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

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

Ответ на ваш вопрос банален и написан в той же инструкции что вы процитировали.
 

Просто вдумайтесь.
Все что вам нужно составить строку такого типа.
 

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

{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}  

Где

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

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

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

 

Ну что бы вы не злились я разъясню почему это исчерпывающий ответ на все ваши вопросы.
 

1) составить строку как выше, можете добавлять группы если их нет. Можете имя группы сделать пробел, все равно. Соблюдайте формат строки.

2) можно все, поиск замена в помощь. Главное соблюдайте формат строки.

3) все что вам нужно понять это: Соблюдайте формат строки описанный в инструкции. Как вы это будете делать все равно, хоть повторяющиеся, хоть через поиск замену. Хоть вручную. Вообще все равно. Главное соблюдайте формат строки.

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

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


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

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

Это вполне рабочий вариант. 
 

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

4 минуты назад, climatyuga сказал:

Не подскажите , как из этого {g-start}Панель LZ-B4COBA{g-stop}, сделать {g-start}Панель{g-stop} с учетом, что " LZ-B4COBA" всегда разное для разных товаров?

Можно вот так.
 

Спойлер

eUd3N1A.png

 

Само правило.
{g-start}{skip} {skip}{g-stop}|{g-start}$1{g-stop}

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

 

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

@climatyuga а вот вариант для "простых смертных" которые знают только про существование одного оператора {skip}

Спойлер

yqS5cOB.png

Просто вырезаем все после пробела, и заменяем на {g-stop}

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

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

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

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

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

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

Вхід

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

Вхід зараз

×
×
  • Створити...

Important Information

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