Модуль MicrodataPro (микроразметка json-ld/microdata) v.10 NULL

  • Автор темы Автор темы dell2201
  • Дата начала Дата начала
воу, долго у разраба обнов не было)
 
Установил на окСтор 2.3, модификации в контроллеры пишет, но вот на страницы ничего не выводит.
В админке все четко, диагностику проходит и т.д. Ошибок в логах нет.
Откатил обратно на версию 8.1.

Кто-то пробовал ставить?
 
Установил на окСтор 2.3, модификации в контроллеры пишет, но вот на страницы ничего не выводит.
В админке все четко, диагностику проходит и т.д. Ошибок в логах нет.
Откатил обратно на версию 8.1.

Кто-то пробовал ставить
Не доломал, отпишусь
 
MicrodataPro - v 10
Ошибка "Отсутствует поле "price" (в offers.priceSpecification)" для товаров без акций
catalog\controller\extension\module\microdatapro.php
строка 348
if(isset($mdp['price_old'])){ заменить на if (!empty($mdp['price_old'] ?? '')) {
 
Еще есть проблема между: <!--MDP v10 Product start--> и <!--MDP v10 Product end-->
в "description": "" не обрезается текст, он там во всю длину. В итоге имеем ошибку "Данные о товарах продавца > Недопустимая длина значения в поле "description""

catalog\controller\extension\module\microdatapro.php
строка 1579
Это
$mdp['description'] = $this->clearDiv($mdp['description']);

заменить на это

$mdp['description'] = $this->clearDiv($mdp['description']);

if(mb_strlen($mdp['description']) > 290){
$mdp['description'] = mb_substr($mdp['description'], 0, 290);

$mdp['description'] = mb_substr($mdp['description'], 0, mb_strrpos($mdp['description'], ' '));
}
 
Еще есть проблема между:
<!--MDP v10 Product start--> и <!--MDP v10 Product end-->
в "description": "" не подтягивается текст с поля "Мета-тег Description" вместо него подтягивается текст с поля полного "Description"

Насколько я понимаю логика должна быть такой: проверяется поле "Мета-тег Description" если оно пустое тогда вместо него подтягивается поле полного "Description"
Тут же почему-то проверяется только поле полного "Description" если оно пустое тогда вместо него подтягивается поле 'title'
catalog\controller\extension\module\microdatapro.php
строка 1547

Это

if(!isset($data['description'])){
$data['description'] = '';
}
$mdp['description'] = trim($this->clearText($data['description']));
if(!$mdp['description']){
$mdp['description'] = $this->clearText($this->document->getDescription()?$this->document->getDescription():$mdp['title']);
}

заменить на это

if(!isset($data['meta_description'])){
$data['meta_description'] = '';
}
$mdp['description'] = trim($this->clearText($data['meta_description']));
if(!$mdp['description']){
$mdp['description'] = trim($this->clearText($this->document->getDescription()?$this->document->getDescription():$data['description']));
}
 
Еще есть проблема с переключением "скрыть цену", тоже ошибка появляется если включить. Надо будет смотреть, когда-то поправлял такое на старих релизах, автор почему-то не фиксит.
 
автор почему-то не фиксит
а можеш скинуть свой правленный модуль? чтоб не ходить - не искать этот код по файлам
я на один рабочий магазин его поставил, он каждый день в журнал ошибок пишет, примерно такое:
2026-04-07 11:36:17 - PHP Notice: Undefined index: popup in .../catalog/controller/extension/module/microdatapro.php on line 1262
2026-04-07 11:36:17 - PHP Notice: Undefined index: thumb in .../catalog/controller/extension/module/microdatapro.php on line 1263
2026-04-07 11:36:17 - PHP Notice: Undefined index: images in .../catalog/controller/extension/module/microdatapro.php on line 1273
2026-04-07 11:36:17 - PHP Notice: Undefined index: special in .../catalog/controller/extension/module/microdatapro.php on line 1845
2026-04-07 11:36:17 - PHP Notice: Undefined index: price in .../catalog/controller/extension/module/microdatapro.php on line 1846
2026-04-07 11:36:17 - PHP Notice: Undefined index: product_id in .../catalog/controller/extension/module/microdatapro.php on line 1821
2026-04-07 11:36:17 - PHP Notice: Undefined index: stock_status_id in .../catalog/controller/extension/module/microdatapro.php on line 1822
2026-04-07 11:36:17 - PHP Notice: Undefined index: product_id in .../catalog/controller/extension/module/microdatapro.php on line 1796
2026-04-07 11:36:17 - PHP Notice: Undefined index: attribute_groups in .../catalog/controller/extension/module/microdatapro.php on line 1771
2026-04-07 11:36:17 - PHP Warning: Invalid argument supplied for foreach() in .../catalog/controller/extension/module/microdatapro.php on line 1771
2026-04-07 11:36:17 - PHP Notice: Undefined index: model in .../catalog/controller/extension/module/microdatapro.php on line 1638
2026-04-07 11:36:17 - PHP Notice: Undefined index: manufacturer in .../catalog/controller/extension/module/microdatapro.php on line 1639

Дополнил позже:
1. Зашел на Генспарк, описал что и как получил такой ответ:
## Какие именно места ломались

### 1. Картинки товара
Лог:
- line 1262 — `popup`
- line 1263 — `thumb`
- line 1273 — `images`

Причина: модуль напрямую обращался к индексам массива без `isset()` / `!empty()`.

### 2. Атрибуты
Лог:
- line 1771 — `attribute_groups`
- line 1771 — `Invalid argument supplied for foreach()`

Причина: `foreach($data['attribute_groups'] as ...)` выполнялся даже когда `attribute_groups` отсутствует или не массив.

### 3. Отзывы и остатки
Лог:
- line 1796 — `product_id`
- line 1821 — `product_id`
- line 1822 — `stock_status_id`

Причина: код делает SQL-запросы по `product_id`, даже когда `product_id` не передан.
Плюс обращение к `$ss_id_query->row['stock_status_id']` без проверки.

### 4. Цена
Лог:
- line 1845 — `special`
- line 1846 — `price`

Причина: цена и спеццена не всегда присутствуют в массиве `$data`.

### 5. Данные товара
Лог:
- line 1638 — `model`
- line 1639 — `manufacturer`

Причина: на некоторых страницах эти поля отсутствуют.

---

## Что я исправил

Я внёс защитные проверки:

- заменил прямой доступ к индексам на безопасный:
- `isset(...)`
- `!empty(...)`
- добавил проверки, что данные являются массивом перед `foreach`
- добавил значения по умолчанию для:
- `price`
- `special`
- `model`
- `manufacturer`
- `reviewCount`
- `rating`
- защитил запросы к БД, если нет `product_id`
- защитил чтение `stock_status_id`
- защитил обработку галереи товара, если `images` отсутствует

---

## Суть правок по коду

### Было
```php
$mdp['image'] = $this->clearImage($data['popup']);
$mdp['thumb'] = $this->clearImage($data['thumb']);
```

### Стало
```php
$mdp['image'] = !empty($data['popup']) ? $this->clearImage($data['popup']) : '';
$mdp['thumb'] = !empty($data['thumb']) ? $this->clearImage($data['thumb']) : '';
```

---

### Было
```php
if($this->mdp->mdc('product_gallery') && $data['images']){
foreach($data['images'] as $image){
```

### Стало
```php
if($this->mdp->mdc('product_gallery') && !empty($data['images']) && is_array($data['images'])){
foreach($data['images'] as $image){
```

---

### Было
```php
foreach($data['attribute_groups'] as $attribute_group){
```

### Стало
```php
if($this->mdp->mdc('product_attribute') && !empty($data['attribute_groups']) && is_array($data['attribute_groups'])){
foreach($data['attribute_groups'] as $attribute_group){
```

---

### Было
```php
$reviews_query = $this->db->query("... product_id = '" . (int)$data['product_id'] . "'");
```

### Стало
```php
if($this->mdp->mdc('product_reviews') && !empty($data['product_id'])){
$reviews_query = $this->db->query("... product_id = '" . (int)$data['product_id'] . "'");
```

---

### Было
```php
$data['special'] = strip_tags(str_replace(",",".",$data['special']));
$data['price'] = strip_tags(str_replace(",",".",$data['price']));
```

### Стало
```php
$data['special'] = isset($data['special']) ? strip_tags(str_replace(",",".",$data['special'])) : '';
$data['price'] = isset($data['price']) ? strip_tags(str_replace(",",".",$data['price'])) : '';
```

---

### Было
```php
$mdp['model'] = $this->clearText($data['model']);
$mdp['brand'] = $this->clearText($data['manufacturer']);
```

### Стало
```php
$mdp['model'] = isset($data['model']) ? $this->clearText($data['model']) : '';
$mdp['brand'] = isset($data['manufacturer']) ? $this->clearText($data['manufacturer']) : '';
```

---

А вот готовый исправленнный файл так и не скачал, типо на бесплатном тарифе - не дам :)
Так, что "ручками"
 
Последнее редактирование:
Назад
Верх