Воеводский Михаил

Воеводский Михаил

С нами с 07 февраля 2013; Место в рейтинге пользователей: #28
23 февраля 2016, 18:08
0
Добавлю только одно: этот процессор только помечает ресурс как удаленный. После него для полного удаления необходимо «очищать корзину». Точное название этого процессора могу посмотреть позже.
23 февраля 2016, 16:40
0
Все удаляйте.
21 февраля 2016, 19:29
+1
Ответ есть выше.
21 февраля 2016, 19:27
1
+1
/* Меняю значение опции на полученное */
            $o = $modx->newObject('msProductOption', array(
                'product_id' => $r->id,
                'key' => 'options_length',
                'value' => trim($_POST['options_length'])
            ));
            $o->save();
Не надо так делать. Достаточно проверить существование опции у товара, а выставлять значение опции самому товару. Как минимум, такой механизм я понял из чтения исходников MS 2.2 (с опциями мне еще не приходилось работать).

<?php
$optionKey = 'options_length';
$optionKeys = $r->getOptionKeys();
if (!in_array($optionKey, $optionKeys) and $option = $modx->getObject('msOption', array('key' => $optionKey))) {
    $productOption = $modx->newObject('msProductOption');
    $productOption->addOne($option, 'Option');
    $productOption->addOne($r, 'Product');
}
$r->set($optionKey, trim($_POST[$optionKey]));
$r->save();
21 февраля 2016, 18:56
+1
Связь просто надо было сохранить
$linkProducts->save();
Не обратил внимание, что у товара нет прямой связи (на уровне xPDO) со связью msLink.
Потому все равно достаточно одного сохранения, но с другой стороны — сохранить $linkProducts, а все остальные объекты тоже сохранятся. То есть,
$n->save()
совершенно необязательное действие, если есть строка выше.
21 февраля 2016, 18:51
+1
Я не совсем понимаю, именно создаем, а не получаем
Я не совсем понял Вашу идею, потому в коде создал связь. Конечно, можно использовать созданную ранее.

$link = $modx->newObject('msLink', 1);
Бесполезная запись, тк newObject() вторым параметром принимает массив. Если передано что угодно другое, параметр игнорируется.

Более того, даже если передать массив
array('id' => 1);
, то все равно новому объекту не будет установлено значение поля id == 1. Причина: метод fromArray(), который используется для установки переданных значений созданному объекту, по умолчанию не выставляет значение первичного ключа, коим является поле id.

После создания объекта требуется либо явно задать первичный ключ через set():
$link->set('id', 1);
, либо указать третий параметр для fromArray():
$link->fromArray(array('id' => 1), '', true);
Если же требуется получить созданную ранее связь по ее id, используйте такой вариант:
$link = $modx->getObject('msLink', $id);
21 февраля 2016, 15:06
+1
Код написал без проверки. В теории должен работать.

<?php

/* Получаем товар, который надо копировать */
if ($r = $modx->getObject('msProduct', (int)$_GET['rid'])) {

    /* Если товар создается с такими же свойствами, корректнее их брать полностью */
    $productData = $r->toArray();
    /* Сбрасываем некоторые свойства оригинального товара */
    unset($productData['publishedon'], $productData['publishedby']);
    /* Устанавливаем правильные свойства */
    $productData['createdon'] = time();
    $productData['createdby'] = $modx->user->id;
    /* Создаем и сохраняем */
    $n = $modx->newObject('msProduct', $productData);

    /* Создаем новую связь */
    $link = $modx->newObject('msLink', array(
        'type' => 'one_to_many',
        'name' => 'Название связи',
    ));
    
    /* Создаем новую связку */
    $linkProducts = $modx->newObject('msProductLink');
    /* Добавляем товары в связку */
    $linkProducts->addOne($r, 'Master');
    $linkProducts->addOne($n, 'Slave');
    /* Добавляем основную связь в связку */
    $linkProducts->addOne($link, 'Link');

    /* Создаем новую опцию */
    $option = $modx->newObject('msProductOption', array('key' => $r->get('options_phone')));
    /* Добавляем опцию к новому товару */
    $n->addOne($option, 'Options');

    /* Сохраняем товар. Благодаря связыванию объектов через addOne(), все необходимые ID подставляются автоматически */
    $n->save();
    
}
21 февраля 2016, 14:29
+1
Согласен.
21 февраля 2016, 00:46
+1
Ради интереса только что проверил:
<?php
$a = null;
$b = false;
if ((!$a) === (!$b)) echo 'equal';
else echo 'not equal';
// equal
Вывод прост:
!$modx->getObject()
даст тот же результат, что и
is_null($modx->getObject())
, но первый вариант воспринимается проще и быстрее при чтении кода.
20 февраля 2016, 14:46
0
Отправь «спасибо», считая, что приобрел курс со скидкой :)
18 февраля 2016, 01:42
+2
Иван, уж если в репо есть компонент If, то это точно имеет право на жизнь, дабы парой кликов поставить на сайт без лишних телодвижений.
Да и компонент собрать не так уж сложно. На мой взгляд, конечно :)
18 февраля 2016, 01:06
0
В сниппете можно навести красоту, но и в таком виде хорошо читается.
Евгений, собери пакет из этого? ;)
18 февраля 2016, 00:15
+3
modstore.pro/packages/other/smf
Двухсторонняя интеграция MODX с Simple Machines Forum.
17 февраля 2016, 15:44
0
Видел в основном репо пакет для сокращения URL с использованием сервиса гугла.
17 февраля 2016, 11:42
+1
Когда использовал (2-3 месяца назад) на одном из проектов, товары успешно обновлялись.
15 февраля 2016, 01:51
+1
Илья, твой комментарий — наглядное подтверждение озвученной в нем мысли :)
14 февраля 2016, 19:37
+1
1)
$data = array('param1' => 'value1', 'param2' => 'value2');
return $AjaxForm->success('Форма обработана', $data);
2)
$(document).on('af_complete', function(event, response) {
    var form = response.form;
    if (response.data !== undefined) $('#html_element').val(response.data.param1);
});
14 февраля 2016, 19:35
0
Поставь Tickets, как рекомендует Василий, или сделай сохранение времени активности в modActiveUser по аналогии с Tickets: github.com/bezumkin/Tickets/blob/master/core/components/tickets/elements/plugins/plugin.tickets.php#L80
14 февраля 2016, 10:15
0
1. В сниппете в функции AjaxForm->success() вторым параметром передавай массив
2. Вешай JS обработчик на событие afComplete, в нем получишь переданный в п. 1 массив, можешь вставлять значения куда угодно.
14 февраля 2016, 09:56
0
Почему modActiveUser не подходит? Есть поля username и internalKey. Второе — искомый Id пользователя.