Александр

Александр

Был в сети 02 ноября 2020, 06:34
Заказы не принимаю
Если сделать так
[[!getImageList?
    &tvname=`options`
    &docid=`[[*id]]`
]]
То не выводится ничего. Если жестко указать id товара
[[!getImageList?
    &tvname=`options`
    &docid=`29`
]]
То массив с нужными данными (данные ТВ 'options' для страницы с id=29) выводится на всех страницах, кроме страницы с id=29. На ней, опять же, не выводится ничего.
Если менять ID страницы на любой другой, то данные выводятся на всех страницах, кроме страницы с указанным ID.
Если не сложно, Михаил, подскажите ответ на еще 1 вопрос.
Не понимаю, как мне поменять значение опции у создаваемого или уже существующего товара на то, то я получаю POST-запросом от пользователя. Прикладываю весь код сниппета, но вопрос исключительно по той части, где комментарий.
<?php
if (empty($modx->getLoginUserID('web')))
    $modx->sendRedirect($modx->makeUrl(1));

$uid = $modx->getLoginUserID('web');

if (!empty($_POST)) {
    $r = $modx->getObject('msProduct', (int)$_POST['rid']);
    if (!$r || $uid != $r->createdby)
        $modx->sendRedirect($modx->makeUrl(8));

    $productData = $r->toArray();
    unset($productData['publishedon']);
    $productData['createdon'] = time();
    $productData['published'] = 1;
    $productData['favorite'] = 0;
    $productData['description'] = trim($_POST['description']);
    $productData['old_price'] = (int)$_POST['old_price'];
    $productData['price'] = (int)$_POST['price'];

    $n = $modx->newObject('msProduct', $productData);

    $link = $modx->getObject('msLink', 1);

    $linkProducts = $modx->newObject('msProductLink');
    $linkProducts->addOne($r, 'Master');
    $linkProducts->addOne($n, 'Slave');
    $linkProducts->addOne($link, 'Link');
    $linkProducts->save();

    $optionPhone = $modx->newObject('msProductOption', array('key' => $r->get('options_phone')));
    $n->addOne($optionPhone, 'Options');
    $optionExp = $modx->newObject('msProductOption', array('key' => $r->get('options_experience')));
    $n->addOne($optionExp, 'Options');
/* С копированием опций более-менее понятно. Не понимаю как поменять значение опции на получаемое из формы */
    $optionLength = $modx->newObject('msProductOption', array('key' => trim($_POST['options_length'])));
    $n->addOne($optionLength, 'Options');

    $n->save();

    $modx->sendRedirect($modx->makeUrl(8));
}

return $output;
Каюсь, Ваш код работает верно — товар копируется со всеми опциями абсолютно верно. Они затираются на следующем шаге, когда я пытаюсь поменять опцию options_length у новосозданного товара
/* Получаю товар для редактирования */
            $r = $modx->getObject('msProduct', array(
                'id' => (int)$_POST['rid']
            ));

            /* Меняю полученные данные */
            $r->fromArray(array(
                'description' => trim($_POST['description']),
                'old_price' => (int)$_POST['old_price'],
                'price' => (int)$_POST['price']
            ));
            $r->save();

            /* Меняю значение опции на полученное */
            $o = $modx->newObject('msProductOption', array(
                'product_id' => $r->id,
                'key' => 'options_length',
                'value' => trim($_POST['options_length'])
            ));
            $o->save();
После этого значения опции options_phone и options_length затираются и появляется дублирующая строка с опцией options_length.
С этим, думаю, я уже смогу разобраться. Главное что уже понятно, где происходит ошибка.
Большое спасибо за развернутый ответ.
/* Создаем новую связь */
    $link = $modx->newObject('msLink', array(
        'type' => 'one_to_many',
        'name' => 'Название связи',
    ));
Я не совсем понимаю, именно создаем, а не получаем, к примеру так?
/* Создаем новую связь */
    $link = $modx->newObject('msLink', 1);
Просто сама связь у меня уже существует под идентификатором 1.
В целом ничего не поменялось, options_phone пишется в базу с пустым value, при этом
$r->get('options_phone')
выводит правильное значение.
Связь между товарами вообще не создается — в базе не появляется записей.