Проблема с сохранением опций товара
Доброго времени.
Вводная информация: Modx 2.4.2 + Minishop 2.2.0
Делаю личный кабинет для партнеров, через который они могут создавать свои товары и управлять ими.
Пользователи регистрируются и авторизуются через Login, доступ только к контексту web.
Вот кусок сниппета, который отвечает за создание товара на основе уже имеющегося:
Вводная информация: Modx 2.4.2 + Minishop 2.2.0
Делаю личный кабинет для партнеров, через который они могут создавать свои товары и управлять ими.
Пользователи регистрируются и авторизуются через Login, доступ только к контексту web.
Вот кусок сниппета, который отвечает за создание товара на основе уже имеющегося:
/* Получаю товар, который надо копировать */
$r = $modx->getObject('msProduct', array(
'id' => (int)$_GET['rid']
));
/* Создаю новый с такими же свойствами и сохраняю */
$n = $modx->newObject('msProduct', array(
'pagetitle' => $r->pagetitle,
'introtext' => $r->introtext,
'content' => $r->content,
'parent' => $r->parent,
'template' => $r->template,
'published' => $r->published,
'show_in_tree' => 0,
'createdby' => $uid,
'source' => $r->source
));
$n->save();
/*
Пытаюсь создать связь между созданным товаром и оригиналом. Не работает
$l = $modx->newObject('msProductLink', array(
'link' => 1,
'master' => $r->id,
'slave' => $n->id
));
$l->save();
*/
/* Создаю таким образом */
$mid = $r->id;
$sid = $n->id;
$sql = "INSERT INTO modx_ms2_product_links (link,master,slave) VALUES ('1','$mid','$sid')";
$stmt = $modx->prepare($sql);
$stmt->execute();
/* Преобразую в массив, потому что не знаю, как получить доступ к значению пользовательской опции в исходном виде */
$r = $r->toArray();
/* Ниже двумя способами пытаюсь задать товару значение пользовательской опции.
В первом случае в базу пишутся значения с пустым value, во втором в базу вообще ничего не пишется. */
$o = $modx->newObject('msProductOption', array(
'product_id' => $sid,
'key' => 'options_phone',
'value' => $r['options_phone']
));
$o->save();
$n_options_phone = $r['options_phone'];
$sql = "INSERT INTO modx_ms2_product_options(product_id,key,value) VALUES('$sid','options_phone','$n_options_phone')";
$stmt = $modx->prepare($sql);
$stmt->execute();Последний кусок кода у меня есть еще в другом сниппете — который отвечает за редактирование товара, только там идет обработка другой опции./* Получаю товар для редактирования */
$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();В этом сниппете этот код пишет в базу вроде бы правильное значение, но когда я открываю товар для редактирования в админке ModX, после значения опции добавлена запятая. Т.е. если в личном кабинете я поменял длительность нанеделято при редактировании товара через админку я увижу
неделя,Не понимаю, в чем может быть проблема. Если с запято я еще смогу справиться какими-нибудь костылями, то почему при создании товара в базу пишутся значения с пустым value — не понимаю.
Комментарии: 21
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Как-то так:
Попробуйте переделать с учетом этого, не гоняя значения лишний раз из объекта в массив и назад. Ну и надо смотреть значение 'options_phone' на разных этапах, $modx->log и все такое.
Ну и еще из любви к исскусству:
можно заменить на
А еще лучше при получении объекта оборачивать всё это дело в if и получить переменную rid (мало ли где то еще будет использоваться):
Эта строчка работает, но дает ложное ощущение, что $modx->getObject() возвращает false, если объект не найден, в то время как он в этом случае возвращает null. Поэтому более правильно проверять результат с помощью is_null() или is_object().
Вывод прост: даст тот же результат, что и , но первый вариант воспринимается проще и быстрее при чтении кода.
Поскольку вызывая $modx->getObject() мы рассчитываем получить _объект_, а не булево, мне видится более правильным работать с результатом как с объектом, поэтому is_object, а не просто логическое «не». Вкусовщина, конечно.
?
Скорее всего, ваш options_phone' окажется пуст.
или
В базу пишется пустое значение.
Я не совсем понимаю, именно создаем, а не получаем, к примеру так?
Просто сама связь у меня уже существует под идентификатором 1.
В целом ничего не поменялось, options_phone пишется в базу с пустым value, при этом
выводит правильное значение.
Связь между товарами вообще не создается — в базе не появляется записей.
Спасибо еще раз, Михаил, за работающее решение, очень круто.
Потому все равно достаточно одного сохранения, но с другой стороны — сохранить $linkProducts, а все остальные объекты тоже сохранятся. То есть,
совершенно необязательное действие, если есть строка выше.
Бесполезная запись, тк newObject() вторым параметром принимает массив. Если передано что угодно другое, параметр игнорируется.
Более того, даже если передать массив
, то все равно новому объекту не будет установлено значение поля id == 1. Причина: метод fromArray(), который используется для установки переданных значений созданному объекту, по умолчанию не выставляет значение первичного ключа, коим является поле id.
После создания объекта требуется либо явно задать первичный ключ через set():
, либо указать третий параметр для fromArray():
Если же требуется получить созданную ранее связь по ее id, используйте такой вариант:
Спасибо за столь подробные и работоспособные разъяснения.
После этого значения опции options_phone и options_length затираются и появляется дублирующая строка с опцией options_length.
С этим, думаю, я уже смогу разобраться. Главное что уже понятно, где происходит ошибка.
Не понимаю, как мне поменять значение опции у создаваемого или уже существующего товара на то, то я получаю POST-запросом от пользователя. Прикладываю весь код сниппета, но вопрос исключительно по той части, где комментарий.
Меня интересует как мне сохранить много массиво в качестве ресурсов MODX
Объясню кратко: Спарсил кое какие данные с сайта (php Query )? распихал данные по массивам. И теперь мне нужно эти массивы сохранить в базе модекс как ресурсы.
Пробывал вот так:
Не получается…
Подскажите пожайлуста новичку)