Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

Всего 126 095 комментариев

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

Очень странная картинка — по идее, при обновлении полей, должны изменяться данные только тех полей, которые были в csv. А в результате идет затирание целого ряда полей, которых даже не прописывали в csv.

Вобще, функционал данного модуля для импорта-обновления уже существующих ресурсов мягко сказать странный. Нафига, для обновления 2 полей товара/ресурса мне прописывать его алиас, родительский ресурс и другие поля, которые вообще трогать не планировал? По идее, все, что надо — это айдишник ресурса и содержимое обновляемых полей.
Сергей Фещуков
Сергей Фещуков
Сергей Карпович
Сергей Карпович
Это таблица компонента msProductRemains
он использует поле remains, но в Minishop2 4.0.0 тоже появилось это поле, и что то пошло не так. Может оно всегда было, но не участвовало в схеме, хз.

Тут скоррее вопрос к msProductRemains, нужно его научить смотреть remains из своей таблицы
Сергей Карпович
Сергей Карпович
Обнаружил прикол, как понимаю он возникает в Minishop => 4.4.0
Поле remains присутствует в стандартных полях минишопа — присутствует в таблице modx_ms2_products
И в админке на странице со всеми остатками: /manager/?a=mgr/remains&namespace=msproductremains тянется именно поле из modx_ms2_product, а не из modx_ms2_product_remains

А если перейти в карточку товара, на вкладку остатки — там все правильно, остаток подтягивается из таблицы modx_ms2_product_remains

Не понимаю, как это так получается и как это исправить?
SYAN
SYAN
А вот все то же самое, только на fenom сразу вызов на странице без дополнительных чанков
{set $rows = $.php.array_reverse(json_decode($_modx->resource.videogallery, true))}
{if $rows && is_array($rows)}
<!-- Табы (заголовки) -->
<ul class="nav nav-tabs" id="videoTab" role="tablist">
    {foreach $rows as $idx => $row}
    <li class="nav-item" role="presentation">
        <button class="nav-link {if $idx == 0}active{/if}" id="videogal-tab-{$idx}" data-bs-toggle="tab" data-bs-target="#videogal{$idx}" type="button" role="tab" aria-controls="videogal{$idx}" aria-selected="{if $idx == 0}true{else}false{/if}">
            Источник {$idx + 1}
        </button>
    </li>
    {/foreach}
</ul>
<!-- Контент табов -->
<div class="tab-content" id="videoTabContent">
    {foreach $rows as $idx => $row}
    {* Декодируем JSON из поля video *}
    {set $videoData = json_decode(trim($row.video, '"') | replace:'\"':'"', true)}
    {if $videoData}
    <div class="tab-pane fade {if $idx == 0}show active{/if}" id="videogal{$idx}" role="tabpanel" aria-labelledby="videogal-tab-{$idx}">
        <!-- Видео -->
        <div class="pb-3">
            <div class="embed-responsive embed-responsive-16by9" style="width: 100%;">
                <iframe class="embed-responsive-item" src="{$videoData.video}" title="{$videoData.title | default:'Видео'}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" webkitAllowFullScreen mozallowfullscreen allowFullScreen allowtransparency="true" name="main" style="width:100%; height:100%; background-image:url({$videoData.image | default:''}); background-size: cover; background-repeat: no-repeat; background-position: center center;"></iframe>
            </div>
        </div>
        <!-- Ссылка на источник -->
        <div class="pb-3">
            Видео в источнике: <ignore><a href="{$videoData.video}" target="_blank">{$videoData.video}</a></ignore>
        </div>
        <!-- Описание (если есть) -->
        {if isset($videoData.desc) && $videoData.desc}
        <div class="pb-3">{$videoData.desc | nl2br}</div>
        {/if}
    </div>
    {else}
    <!-- Резервный блок при ошибке декодирования -->
    <div class="tab-pane fade {if $idx == 0}show active{/if}" id="videogal{$idx}" role="tabpanel" aria-labelledby="videogal-tab-{$idx}">
        <p class="text-danger">Не удалось загрузить видео (ошибка JSON).</p>
    </div>
    {/if}
    {/foreach}
</div>
{else}
<p>Нет данных для отображения.</p>
{/if}
SYAN
SYAN
Переносим все видео ранее созданные на сайте с tv-полями video =1 и video2 = 26 в новое tv-поле videogallery = 38
-- Шаг 1: увеличиваем лимит для текущей сессии
SET SESSION group_concat_max_len = 1000000;
-- Шаг 2: выполняем основной запрос
INSERT INTO modx_site_tmplvar_contentvalues (tmplvarid, contentid, value)
SELECT
    38 AS tmplvarid,
    src.contentid,
    CONCAT(
        '[',
        GROUP_CONCAT(
            CONCAT(
                '{',
                '"MIGX_id":"', src.migx_num, '",',
                '"video":"',
                REPLACE(
                    REPLACE(
                        REPLACE(src.value, '\\', '\\\\'),
                        '"', '\\"'
                    ),
                    '\n', '\\n'
                ),
                '"}'
            )
            ORDER BY src.migx_num
            SEPARATOR ','
        ),
        ']'
    ) AS value
FROM (
    SELECT t1.contentid, t1.value, 1 AS migx_num
    FROM modx_site_tmplvar_contentvalues t1
    WHERE tmplvarid = 1

    UNION ALL

    SELECT t26.contentid, t26.value, 2 AS migx_num
    FROM modx_site_tmplvar_contentvalues t26
    WHERE tmplvarid = 26
) AS src
GROUP BY src.contentid
ON DUPLICATE KEY UPDATE
    value = VALUES(value);
Николай Савин
Николай Савин
Поле остаток не было добавлено в базу данных и модель (был только внешний интерфейс)
В последнем обновлении 1.4.0. добавил это поле. Должно работать. На крайний случай можно добавить поле руками в таблицу ms3_products
SYAN
SYAN
Для вывода данной migx videogallery в виде табов Источник1, Источник2 и тд

Чанк videogalleryVideosTabs.tpl
[[!VideoJsonToPlaceholders? &json=`[[+video]]` &prefix=`video[[+idx]].`]]
<li class="nav-item" role="videocase">
        <button class="nav-link [[+idx:isequal=`1`:then=`active`:else=``]]" id="videogal[[+idx]]-tab" data-bs-toggle="tab" data-bs-target="#videogal[[+idx]]" type="button" role="tab" aria-controls="videogal[[+idx]]" aria-selected="true">Источник [[+idx]]</button>
</li>`

Чанк videogalleryVideos.tpl
<div class="tab-pane fade [[+idx:isequal=`1`:then=`show active`:else=``]]"  id="videogal[[+idx]]" role="tabpanel" aria-labelledby="videogal[[+idx]]-tab">
        <div class="pb-3">
            <div class="embed-responsive embed-responsive-16by9" style="width: 100%;"> 
            <iframe class="embed-responsive-item" 
            src="[[+video[[+idx]].video]]" title="[[+video[[+idx]].title]]" 
            frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
            webkitAllowFullScreen mozallowfullscreen allowFullScreen allowtransparency="true" name="main" 
            style="width:100%;height:100%;background-image:url([[+video[[+idx]].image]]);background-size: cover; background-repeat: no-repeat;background-position: center center;">
            </iframe> 
            </div>
        </div>
        <div class="pb-3">видео в источнике <ignore><a href="[[+video[[+idx]].video]]" target="_blank">[[+video[[+idx]].video]]</a></ignore></div>
    </div>

Вызов на странице
<ul class="nav nav-tabs" id="videoTab" role="tablist">
[[!getImageList?
    &tvname=`videogallery`
    &tpl=`videogalleryVideosTabs.tpl`
]]
</ul>

<div class="tab-content" id="videoTabContent">
{'!getImageList' | snippet : [
'tvname' => 'videogallery',
'tpl' => 'videogalleryVideos.tpl']}
</div>
SYAN
SYAN
решал эту проблему следующим образом
  1. установил autoRedirector
  2. далее через phpMyAdmin
  3. экспортировал со старого сайта modx_site_content
  4. залил в базу к новому с именем modx_site_content_old
  5. сравнил две базы. если у одинаковых id ресурсов значения uri не совпадают, то добавил новые редиректы в базу modx_ar_rules
  6. удалил дубликаты записей в modx_ar_rules
  7. удалил modx_site_content_old
INSERT INTO `modx_ar_rules` (`res_id`, `context_key`, `uri`)
SELECT
    sc.id AS res_id,
    'web' AS context_key,
    sc2.uri AS uri
FROM
    modx_site_content sc
    LEFT JOIN modx_site_content_old sc2 ON sc.id = sc2.id
WHERE
sc.uri <> sc2.uri; -- uri не совпадают


DELETE FROM `modx_ar_rules`
WHERE id NOT IN (
    SELECT `min_id`
    FROM (
        SELECT MIN(id) AS min_id
        FROM modx_ar_rules
        GROUP BY `res_id`, `context_key`, `uri`
    ) AS keep
);
все четенько на 7К ресурсов в несколько кликов
Ivan K.
Ivan K.
Николай сделай пожалуйста, невозможность установки компонентов если версия меньше 8.2.
А то если на сайте 8.1, потребуется восстановление из резервной копии) после попытки установить компонент.