Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 Только что, egortide сказал: Хотел еще спросить. Есть ли ограничение по размеру файла XML? Сайт донора может отдать 600к товаров. это реально сделать через обработчик? Для самого модуля ограничений нет. Но есть ограничения физические хостинга . 1. Время выполнения скрипт. 2. Оперативная память (С этим редко сталкиваюсь) Если скрипт имеет право работать только 30 секунд. Тогда модуль успеет выполнить задание только в том случаи если за эти 30 сек донор передаст весь файл в 600k И у модуля останется время нарезать его. И это все должно вложится в 30 сек. Если у вас своя виртуальный сервер и вы сами себе хозяин по выделении времени на выполнение скриптов, то для вас никаких ограничений нет. То есть в самом скрипте ограничений нет, но есть косвенные от хостинга. Надіслати Поділитися на інших сайтах More sharing options... Відповіді 13,5k Created 6 р Остання відповідь %d годину Top Posters In This Topic 5192 683 1072 493 Popular Days 21 лип 81 27 лип 80 2 бер 76 1 лют 72 Top Posters In This Topic Rassol2 5 192 posts Axelenz 683 posts partshez 1 072 posts Reanimaster 493 posts Popular Days 21 лип 2021 81 posts 27 лип 2021 80 posts 2 бер 2021 76 posts 1 лют 2022 72 posts Popular Posts Rassol2 1 листопада 2018 Ну что займу первый пост. Поскольку модуль все же выложил ушел писать инструкцию к этому франкенштейну. Может кому то пригодится PS. Чуть не забыл. Кому пригодился нажмите палец верх Rassol2 1 листопада 2018 26 Rassol2 23 листопада 2020 Обновление v4.0-12_beta Главная страница. Немного переработал убогость главной страницы. Теперь с этой страницы можно сразу же отключить крон, если собираетесь работать вручную. Так Posted Images egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Выставил 25 секунд. Тоже не успевает Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 Только что, egortide сказал: Выставил 25 секунд. Тоже не успевает Узнайте сколько у на вашем хостинге ограничение по выполнению скрипта, если оно выше 30 сек напишите и я подскажу где вы можно увеличить максимальное время ожидания ответа в моем модуле. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 9 минут назад, Rassol2 сказал: Узнайте сколько у на вашем хостинге ограничение по выполнению скрипта, если оно выше 30 сек напишите и я подскажу где вы можно увеличить максимальное время ожидания ответа в моем модуле. Узнал. 120 секунд Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 6 минут назад, egortide сказал: Узнал. 120 секунд Открываете файл по адресу/admin/view/template/catalog/simplepars_browser.twig Находите там строку. Удаляете !-- в начале и -- в конце строки. Туда куда я указал крассными стрелочками. Затем меняете цифры 50 на которые указывают синие стрелочки на 100. Спойлер Что бы в итоге вышло вот так. Спойлер Сохраняете, и после этого зайдя в раздел настройки запросов у вас появится выбор 100 секунд. 1 Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 14 минут назад, Rassol2 сказал: Открываете файл по адресу/admin/view/template/catalog/simplepars_browser.twig Находите там строку. Удаляете !-- в начале и -- в конце строки. Туда куда я указал крассными стрелочками. Затем меняете цифры 50 на которые указывают синие стрелочки на 100. Показать контент Что бы в итоге вышло вот так. Показать контент Сохраняете, и после этого зайдя в раздел настройки запросов у вас появится выбор 100 секунд. Сделал. Только в этом файле у меня не было такой строки в комментариях , поэтому я ее прописал сам. Получилось так. Только вот не появляется выбор 100 сек. Модификаторы обновлял. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 А стоп. я дурачок. не тот файл открыл) Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине/admin/view/template/catalog/simplepars_browser.twig Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 5 минут назад, egortide сказал: Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине/admin/view/template/catalog/simplepars_browser.twig Да точно. не забудьте обновить кеш если у вас включен, после правок конечно же. Спойлер Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Спойлер Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Спойлер Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Спойлер 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 8 Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Спасибо огромное! Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Всем привет! Год назад уже задавал такой вопрос. Модуль изменился, появилась возможность работать со скриптами. Сам скрипты писать не умею. Обращаюсь к спецам. Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 Еще вопрос. Отзывы о товаре. Как спарсить и, главное, загрузить на вкладку Отзывы в нашем магазине? Поделитесь опытом, пожалуйста. Надіслати Поділитися на інших сайтах More sharing options... kamrik Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 11 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Очень крутое дополнение! Снимает множество головняков в формировании сложных атрибутов. Надіслати Поділитися на інших сайтах More sharing options... ArtemZH Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 1 минуту назад, ArtemZH сказал: Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Здравствуйте. Искать пост. В 99.99% он есть, ищите. На одном гете авторизацию не строят. Надіслати Поділитися на інших сайтах More sharing options... Mixxxa163 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Благодарю! То что нужно было и вовремя) Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 9 годин назад, partshez сказав: Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 а в чем трудность? Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 36 минут назад, Flint2000 сказал: а в чем трудность? Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 48 хвилин назад, partshez сказав: Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода я понял, там с куками проблема Надіслати Поділитися на інших сайтах More sharing options... REVO123 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 хвилин назад, REVO123 сказав: Помогите не пойму в чём дело в других случаях работает в этом нет, Ну так нужно еще и границы сбора ссылок указать Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення EasyMods Автор: kJlukOo PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Выставил 25 секунд. Тоже не успевает Надіслати Поділитися на інших сайтах More sharing options...
Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 Только что, egortide сказал: Выставил 25 секунд. Тоже не успевает Узнайте сколько у на вашем хостинге ограничение по выполнению скрипта, если оно выше 30 сек напишите и я подскажу где вы можно увеличить максимальное время ожидания ответа в моем модуле. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 9 минут назад, Rassol2 сказал: Узнайте сколько у на вашем хостинге ограничение по выполнению скрипта, если оно выше 30 сек напишите и я подскажу где вы можно увеличить максимальное время ожидания ответа в моем модуле. Узнал. 120 секунд Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 6 минут назад, egortide сказал: Узнал. 120 секунд Открываете файл по адресу/admin/view/template/catalog/simplepars_browser.twig Находите там строку. Удаляете !-- в начале и -- в конце строки. Туда куда я указал крассными стрелочками. Затем меняете цифры 50 на которые указывают синие стрелочки на 100. Спойлер Что бы в итоге вышло вот так. Спойлер Сохраняете, и после этого зайдя в раздел настройки запросов у вас появится выбор 100 секунд. 1 Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 14 минут назад, Rassol2 сказал: Открываете файл по адресу/admin/view/template/catalog/simplepars_browser.twig Находите там строку. Удаляете !-- в начале и -- в конце строки. Туда куда я указал крассными стрелочками. Затем меняете цифры 50 на которые указывают синие стрелочки на 100. Показать контент Что бы в итоге вышло вот так. Показать контент Сохраняете, и после этого зайдя в раздел настройки запросов у вас появится выбор 100 секунд. Сделал. Только в этом файле у меня не было такой строки в комментариях , поэтому я ее прописал сам. Получилось так. Только вот не появляется выбор 100 сек. Модификаторы обновлял. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 А стоп. я дурачок. не тот файл открыл) Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине/admin/view/template/catalog/simplepars_browser.twig Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 5 минут назад, egortide сказал: Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине/admin/view/template/catalog/simplepars_browser.twig Да точно. не забудьте обновить кеш если у вас включен, после правок конечно же. Спойлер Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Спойлер Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Спойлер Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Спойлер 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 8 Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Спасибо огромное! Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Всем привет! Год назад уже задавал такой вопрос. Модуль изменился, появилась возможность работать со скриптами. Сам скрипты писать не умею. Обращаюсь к спецам. Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 Еще вопрос. Отзывы о товаре. Как спарсить и, главное, загрузить на вкладку Отзывы в нашем магазине? Поделитесь опытом, пожалуйста. Надіслати Поділитися на інших сайтах More sharing options... kamrik Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 11 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Очень крутое дополнение! Снимает множество головняков в формировании сложных атрибутов. Надіслати Поділитися на інших сайтах More sharing options... ArtemZH Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 1 минуту назад, ArtemZH сказал: Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Здравствуйте. Искать пост. В 99.99% он есть, ищите. На одном гете авторизацию не строят. Надіслати Поділитися на інших сайтах More sharing options... Mixxxa163 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Благодарю! То что нужно было и вовремя) Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 9 годин назад, partshez сказав: Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 а в чем трудность? Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 36 минут назад, Flint2000 сказал: а в чем трудность? Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 48 хвилин назад, partshez сказав: Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода я понял, там с куками проблема Надіслати Поділитися на інших сайтах More sharing options... REVO123 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 хвилин назад, REVO123 сказав: Помогите не пойму в чём дело в других случаях работает в этом нет, Ну так нужно еще и границы сбора ссылок указать Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення EasyMods Автор: kJlukOo PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 9 минут назад, Rassol2 сказал: Узнайте сколько у на вашем хостинге ограничение по выполнению скрипта, если оно выше 30 сек напишите и я подскажу где вы можно увеличить максимальное время ожидания ответа в моем модуле. Узнал. 120 секунд Надіслати Поділитися на інших сайтах More sharing options...
Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 6 минут назад, egortide сказал: Узнал. 120 секунд Открываете файл по адресу/admin/view/template/catalog/simplepars_browser.twig Находите там строку. Удаляете !-- в начале и -- в конце строки. Туда куда я указал крассными стрелочками. Затем меняете цифры 50 на которые указывают синие стрелочки на 100. Спойлер Что бы в итоге вышло вот так. Спойлер Сохраняете, и после этого зайдя в раздел настройки запросов у вас появится выбор 100 секунд. 1 Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 14 минут назад, Rassol2 сказал: Открываете файл по адресу/admin/view/template/catalog/simplepars_browser.twig Находите там строку. Удаляете !-- в начале и -- в конце строки. Туда куда я указал крассными стрелочками. Затем меняете цифры 50 на которые указывают синие стрелочки на 100. Показать контент Что бы в итоге вышло вот так. Показать контент Сохраняете, и после этого зайдя в раздел настройки запросов у вас появится выбор 100 секунд. Сделал. Только в этом файле у меня не было такой строки в комментариях , поэтому я ее прописал сам. Получилось так. Только вот не появляется выбор 100 сек. Модификаторы обновлял. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 А стоп. я дурачок. не тот файл открыл) Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине/admin/view/template/catalog/simplepars_browser.twig Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 5 минут назад, egortide сказал: Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине/admin/view/template/catalog/simplepars_browser.twig Да точно. не забудьте обновить кеш если у вас включен, после правок конечно же. Спойлер Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Спойлер Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Спойлер Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Спойлер 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 8 Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Спасибо огромное! Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Всем привет! Год назад уже задавал такой вопрос. Модуль изменился, появилась возможность работать со скриптами. Сам скрипты писать не умею. Обращаюсь к спецам. Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 Еще вопрос. Отзывы о товаре. Как спарсить и, главное, загрузить на вкладку Отзывы в нашем магазине? Поделитесь опытом, пожалуйста. Надіслати Поділитися на інших сайтах More sharing options... kamrik Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 11 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Очень крутое дополнение! Снимает множество головняков в формировании сложных атрибутов. Надіслати Поділитися на інших сайтах More sharing options... ArtemZH Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 1 минуту назад, ArtemZH сказал: Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Здравствуйте. Искать пост. В 99.99% он есть, ищите. На одном гете авторизацию не строят. Надіслати Поділитися на інших сайтах More sharing options... Mixxxa163 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Благодарю! То что нужно было и вовремя) Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 9 годин назад, partshez сказав: Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 а в чем трудность? Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 36 минут назад, Flint2000 сказал: а в чем трудность? Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 48 хвилин назад, partshez сказав: Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода я понял, там с куками проблема Надіслати Поділитися на інших сайтах More sharing options... REVO123 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 хвилин назад, REVO123 сказав: Помогите не пойму в чём дело в других случаях работает в этом нет, Ну так нужно еще и границы сбора ссылок указать Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення EasyMods Автор: kJlukOo PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 14 минут назад, Rassol2 сказал: Открываете файл по адресу/admin/view/template/catalog/simplepars_browser.twig Находите там строку. Удаляете !-- в начале и -- в конце строки. Туда куда я указал крассными стрелочками. Затем меняете цифры 50 на которые указывают синие стрелочки на 100. Показать контент Что бы в итоге вышло вот так. Показать контент Сохраняете, и после этого зайдя в раздел настройки запросов у вас появится выбор 100 секунд. Сделал. Только в этом файле у меня не было такой строки в комментариях , поэтому я ее прописал сам. Получилось так. Только вот не появляется выбор 100 сек. Модификаторы обновлял. Надіслати Поділитися на інших сайтах More sharing options...
egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 А стоп. я дурачок. не тот файл открыл) Надіслати Поділитися на інших сайтах More sharing options...
egortide Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине/admin/view/template/catalog/simplepars_browser.twig Надіслати Поділитися на інших сайтах More sharing options...
Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 5 минут назад, egortide сказал: Точно файл по этому пути?. У меня в этом файле по-другому написан код немного и нет закоменченной строчки как у Вас на скрине/admin/view/template/catalog/simplepars_browser.twig Да точно. не забудьте обновить кеш если у вас включен, после правок конечно же. Спойлер Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Спойлер Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Спойлер Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Спойлер 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 8 Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Спасибо огромное! Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Всем привет! Год назад уже задавал такой вопрос. Модуль изменился, появилась возможность работать со скриптами. Сам скрипты писать не умею. Обращаюсь к спецам. Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 Еще вопрос. Отзывы о товаре. Как спарсить и, главное, загрузить на вкладку Отзывы в нашем магазине? Поделитесь опытом, пожалуйста. Надіслати Поділитися на інших сайтах More sharing options... kamrik Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 11 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Очень крутое дополнение! Снимает множество головняков в формировании сложных атрибутов. Надіслати Поділитися на інших сайтах More sharing options... ArtemZH Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 1 минуту назад, ArtemZH сказал: Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Здравствуйте. Искать пост. В 99.99% он есть, ищите. На одном гете авторизацию не строят. Надіслати Поділитися на інших сайтах More sharing options... Mixxxa163 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Благодарю! То что нужно было и вовремя) Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 9 годин назад, partshez сказав: Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 а в чем трудность? Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 36 минут назад, Flint2000 сказал: а в чем трудность? Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 48 хвилин назад, partshez сказав: Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода я понял, там с куками проблема Надіслати Поділитися на інших сайтах More sharing options... REVO123 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 хвилин назад, REVO123 сказав: Помогите не пойму в чём дело в других случаях работает в этом нет, Ну так нужно еще и границы сбора ссылок указать Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення EasyMods Автор: kJlukOo PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
Rassol2 Опубліковано: 20 серпня 2021 Автор Share Опубліковано: 20 серпня 2021 ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Спойлер Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Спойлер Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Спойлер 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 8 Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Спасибо огромное! Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Всем привет! Год назад уже задавал такой вопрос. Модуль изменился, появилась возможность работать со скриптами. Сам скрипты писать не умею. Обращаюсь к спецам. Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 Еще вопрос. Отзывы о товаре. Как спарсить и, главное, загрузить на вкладку Отзывы в нашем магазине? Поделитесь опытом, пожалуйста. Надіслати Поділитися на інших сайтах More sharing options... kamrik Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 11 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Очень крутое дополнение! Снимает множество головняков в формировании сложных атрибутов. Надіслати Поділитися на інших сайтах More sharing options... ArtemZH Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 1 минуту назад, ArtemZH сказал: Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Здравствуйте. Искать пост. В 99.99% он есть, ищите. На одном гете авторизацию не строят. Надіслати Поділитися на інших сайтах More sharing options... Mixxxa163 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Благодарю! То что нужно было и вовремя) Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 9 годин назад, partshez сказав: Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 а в чем трудность? Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 36 минут назад, Flint2000 сказал: а в чем трудность? Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 48 хвилин назад, partshez сказав: Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода я понял, там с куками проблема Надіслати Поділитися на інших сайтах More sharing options... REVO123 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 хвилин назад, REVO123 сказав: Помогите не пойму в чём дело в других случаях работает в этом нет, Ну так нужно еще и границы сбора ссылок указать Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення EasyMods Автор: kJlukOo PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
partshez Опубліковано: 20 серпня 2021 Share Опубліковано: 20 серпня 2021 Спасибо огромное! Надіслати Поділитися на інших сайтах More sharing options...
partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Всем привет! Год назад уже задавал такой вопрос. Модуль изменился, появилась возможность работать со скриптами. Сам скрипты писать не умею. Обращаюсь к спецам. Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 Еще вопрос. Отзывы о товаре. Как спарсить и, главное, загрузить на вкладку Отзывы в нашем магазине? Поделитесь опытом, пожалуйста. Надіслати Поділитися на інших сайтах More sharing options...
kamrik Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 11 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Очень крутое дополнение! Снимает множество головняков в формировании сложных атрибутов. Надіслати Поділитися на інших сайтах More sharing options...
ArtemZH Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Надіслати Поділитися на інших сайтах More sharing options...
Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 1 минуту назад, ArtemZH сказал: Подскажите по авторизации, попробовал через мазилу и сафари найти все данные, но нет post запроса у донора, есть get. Но по аналогии email=[email protected]&password=111111 авторизация не проходит. Что делать с этим? Здравствуйте. Искать пост. В 99.99% он есть, ищите. На одном гете авторизацию не строят. Надіслати Поділитися на інших сайтах More sharing options... Mixxxa163 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Благодарю! То что нужно было и вовремя) Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 9 годин назад, partshez сказав: Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 а в чем трудность? Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 36 минут назад, Flint2000 сказал: а в чем трудность? Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 48 хвилин назад, partshez сказав: Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода я понял, там с куками проблема Надіслати Поділитися на інших сайтах More sharing options... REVO123 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 хвилин назад, REVO123 сказав: Помогите не пойму в чём дело в других случаях работает в этом нет, Ну так нужно еще и границы сбора ссылок указать Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення EasyMods Автор: kJlukOo PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
Mixxxa163 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 часов назад, Rassol2 сказал: ВНИМАНИЕ!!! PHP скрипт позволяющий парсить характеристики с Группами, и раскладывать атрибуты с учетом групп. Предисловие. Скрипт довольно сложный так как пришлось полностью переписать логику работы атрибутов, и заняло много времени. Этот же скрипт будет свидетельствовать тому что вы можете расширять возможности модуля как вам угодно. В данном случаи я полностью переписал логику работы атрибутов, по этой же логике вы можете переписать любую часть модуля которая работает не так как вы мечтаете. Так же вы можете дописать любую другую часть.Инструкция к скрипту. Если вы собираетесь использовать этот скрипт для работы атрибутов то сразу отключайте стандартную логику работы атрибутов. Вот так. Показать контент Единственное что, можете выбрать группу для атрибутов по умолчанию. Этот параметр так же учитывается в скрипте. Далее настраиваем работу С скриптом. Выбираем какой скрипт, и выбираем когда выполнять. Выполнять нужно исключительно После парсинга в ИМ! Показать контент Сам файл скрипта будет прикреплен к этому посту в самом низу. Вы можете его загрузить через фтп в директорию /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; } ?> Настройки скрипта. Показать контент 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 Благодарю! То что нужно было и вовремя) Надіслати Поділитися на інших сайтах More sharing options...
Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 9 годин назад, partshez сказав: Возможен ли парсинг данного сайта? https://e-matras.ua/mebli/stoly/stol-sorbonna-hy-t042-stal-setka-tkannaja-kakao-8031-tm-amf-516021 а в чем трудность? Надіслати Поділитися на інших сайтах More sharing options... partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 36 минут назад, Flint2000 сказал: а в чем трудность? Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 48 хвилин назад, partshez сказав: Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода я понял, там с куками проблема Надіслати Поділитися на інших сайтах More sharing options... REVO123 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 хвилин назад, REVO123 сказав: Помогите не пойму в чём дело в других случаях работает в этом нет, Ну так нужно еще и границы сбора ссылок указать Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення EasyMods Автор: kJlukOo PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
partshez Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 36 минут назад, Flint2000 сказал: а в чем трудность? Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода Надіслати Поділитися на інших сайтах More sharing options...
Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 48 хвилин назад, partshez сказав: Откройте страницу в Симплпарс и попробуйте настроить пару границ. Я не вижу нужного кода я понял, там с куками проблема Надіслати Поділитися на інших сайтах More sharing options... REVO123 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Надіслати Поділитися на інших сайтах More sharing options... Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 хвилин назад, REVO123 сказав: Помогите не пойму в чём дело в других случаях работает в этом нет, Ну так нужно еще и границы сбора ссылок указать Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення EasyMods Автор: kJlukOo PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
REVO123 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Надіслати Поділитися на інших сайтах More sharing options...
Flint2000 Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 17 хвилин назад, REVO123 сказав: Помогите не пойму в чём дело в других случаях работает в этом нет, Ну так нужно еще и границы сбора ссылок указать Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення EasyMods Автор: kJlukOo PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains 1.0 Синхронізація Замовлень Rozetka.ua та Opencart Автор: sinco Product Manipulator Автор: Hiperlynx007 Видалення дублікатів товарів для OpenCart Автор: Hatshypsut
Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 56 минут назад, REVO123 сказал: Помогите не пойму в чём дело в других случаях работает в этом нет, нужно спарсить товары только 1 группы https://sanmix.нет.юа/nasosnoe-oborudovanie/nasosy-skvazhinnye/ Стартовая ссылка сам сайт без чего либо Шаблон ссылок очередиИли/И ставлю /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Шаблон ссылок на товарИли/И /nasosnoe-oborudovanie/nasosy-skvazhinnye/ Он мне собирает все товары по сайту Что то вы не так говорите он не будет собирать все ссылки в магазине, у него нет на это права. Он будет собирать только ссылки которые содержат текст что вы указали выше, только так и иначе. Вот демонстрация того что вы описали. Спойлер Из которой наглядно видно что все ссылки в очереди, и ссылки на товар содержат часть ссылки что вы указали. Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Модулі та розширення Парсеры [Поддержка] SimplePars - Универсальный парсер для ИМ
Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 42 минуты назад, Flint2000 сказал: Ну так нужно еще и границы сбора ссылок указать Это только одна настройка из многих, она не обязательна. Её можно использовать а можно и нет. Все зависит от потребностей. Надіслати Поділитися на інших сайтах More sharing options... egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options... Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81 Перейти до списку тем Схожі публікації [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 березня парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 0 коментарів 1 450 переглядів solohaigor 11 грудня 2023 [Поддержка] [Підтримка, навчання] SimplePars - Універсальний парсер для ІМ Автор: solohaigor, 10 грудня 2023 парсинг simplepars (і ще %d) Теги: парсинг simplepars наполнение товары каталог спарсить наполнить 1 відповідь 289 переглядів 18768_1484692309 1 травня Модуль PRICE MASTER - Модуль импорта/экспорта товаров, парсинг, перевод, генерация текстов, редактор каталога и многое другое [Поддержка] 1 2 Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 25 відповідей 983 перегляди prizruslan 12 грудня PRICE MASTER - Модуль імпорту/експорту товарів, парсинг, переклад, генерація текстів, редактор каталогу та багато іншого Автор: ScriptBrains, 29 листопада загрука загрузка yml (і ще %d) Теги: загрука загрузка yml загрузка товаров импорт товаров экспорт товаров парсинг сайтов excel xls xlsx csv yml xml word наполнение товаром import export parsing массовый редактор chat gpt переводчик описаний товаров перевод автоматический импорт автоматизация автоматическая выгрузка товаров автоматическое обновление автоматическое заполнение автоматическое заполнение seo url наполнение магазина поставщики фид фид для гугл фид товаров 0 коментарів 4 293 перегляди ScriptBrains 11 вересня batch [Поддержка] Універсальний масовий редактор товарів. MultiEdit AI 1 2 3 4 11 Автор: Sha, 16 березня 2017 top sale (і ще %d) Теги: top sale chat gpt pro атрибуты опции массовое редактирование editor products скидки мета мета-теги пакетное редактирование товаров админка групповое массовое массовая продукты быстрое изменение добавление добавить цена цены опций акции управление статус обработка категорий премиум групповая скидка товар стоимость валюта прайс price акция категория корзина продажа продажи баллы отзывы статьи галерея заказ быстрый обновление цены ocmod atribute модели автодополнение снипеты скорость модуль блоки форма product наполнение интернетмагазина обновление товар опции в категории универсальный рекомендуем opencart фильтр filter регистрация опция изменить товары категории производители українською українська chatgpt chatbots multi multiedit search replace replacer find search and replace find and replace edit seo faq seo faq filter products filter opencart filter for brands filter for products filter pro filteroc ocfilter oc filter open openai opencart ai ai opencart new 253 відповіді 59 235 переглядів Sha 17 листопада Зараз на сторінці 1 користувач partshez
egortide Опубліковано: 21 серпня 2021 Share Опубліковано: 21 серпня 2021 Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют 1 Надіслати Поділитися на інших сайтах More sharing options...
Rassol2 Опубліковано: 21 серпня 2021 Автор Share Опубліковано: 21 серпня 2021 2 минуты назад, egortide сказал: Как возможно реализовать парсинг отзывов и вопрос-ответ? В вкладке Парсинг в ИМ только такие поля присутствуют Загрузка в товар отзывов и вопрос ответ не реализованы, поскольку разные магазины используют собственные системы отзывов. Если вы хотите реализовать загрузку отзывов к себе, вы можете настроить их парсинг в любые границы и в собственно скрипте сделать sql запросы на добавления в базу данных, так как это реализовано у вас в магазине. 1 Надіслати Поділитися на інших сайтах More sharing options... Назад 356 357 358 359 360 361 362 363 364 365 366 Вперед Сторінка 361 з 539 Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 81
Recommended Posts