Как вытащить из таблицы manager_shopkeeper данные заказа?

Добрый день.
Есть страница заказа с вызовом Shopkeeper и FormLister, примерно как здесь
modx.im/blog/fast-solution/5917.html

Есть задача сделать так, чтобы при отправлении заказа менялся статус товаров, которые были только что заказаны.
Статус представляет собой обычный TV с названием nalichie и id=12, может принимать значения в наличии||по запросу||снят с продажи||отложено.
Смысл в том, что товар единичный, и нужно при заказе перевести его с «в наличии» в «отложено».

Как мне представляется, для FormLister нужно написать prepareAfter, но я не знаю:
1. Как вытащить id заказа, который только что состоялся (вообще не представляю, откуда его брать и как).
2. Как из таблицы manager_shopkeeper вытащить id товаров в этом заказе (с json у меня пока не важно).

Подскажите, пожалуйста, как это правильно сделать.

3. Что делать потом — дальше понятно.

Спасибо.

17 комментариев

avatar
В столбце «content» хранится инфа о заказанных товарах (там сериализованный массив). можно плагин навесить на событие сохранения заказа (тут можно работать с если сущ. $_SESSION['purchases'])
avatar
нуловеой элемент каждого массива и есть id
avatar
Я этот массив видел, и что 0=id тоже видел. Вытащить из этого всего не умею ((
Смотрел для примера class.shk_manager.php, как это выводится в модуль, но как то все грустно.

И совсем не понятно — откуда брать id заказа, как его идентифицировать с только что сделанным заказом.
avatar
unserialize($content), если плагин unserialize($_SESSION['purchases'])
avatar
На выходе получете массив и уже работаете с ним
Для примера:
$data = unserialize($data);
$i =0;
foreach($data as $k=>$v){
	$doc = $modx->getDocument($v[0]);
	$data[$i][3] = addslashes($doc['pagetitle']);
	echo $k.'-'.$v[0].'-'.$v[3].'-'.$v['tv']['main_photo'].'
';
	$i++;
}
avatar
Спасибо, попробую.
avatar
а как получить список ids?

Сделал так
$id_order = "1"; //id заказа, пока вручную

$table = $modx->getFullTableName('manager_shopkeeper');

$data = $modx->db->select("content", $table, "id='".$id_order."'");
while ($row=$modx->db->getRow($data)) {
    $ids[] = $row['content'];
    $data = implode(',', $ids); 
}

$data = unserialize($data);
$i =0;
foreach($data as $k=>$v){
        $doc = $modx->getDocument($v[0]);
        $data[$i][0] = addslashes($doc['id']);
        echo $ids = $v[0];
        $i++;
}

Если в корзине один товар, например, с id 85, выводит 85. А если в корзине 2 товара, например 85 и 86, выводит 8586. А как получить 85,86? Через implode у меня не получилось.
avatar
1 — Если только один заказ то лучше через
<code>$modx->db->getValue();</code>
2- не понятен смысл этой конструкции:
<code>while ($row=$modx->db->getRow($data)) {
    $ids[] = $row['content'];
    $data = implode(',', $ids); 
}</code>
3 — Лучше тогда через for():
<code>$new_array = array()
for($i;$i < count($data);$i++){
  $new_array[$i] = $data[$i][0];
}
echo implode(',',$new_array);</code>
Комментарий отредактирован 2019-07-18 13:07:20 пользователем sahar-08
avatar
Спасибо, сейчас отлично работает.

2. Без while не работает, не в первом варианте, ни сейчас. Ни при одном товаре, ни при больше.
avatar
В общем, получился такой препаре

$table = $modx->getFullTableName('manager_shopkeeper');
$table2 = $modx->getFullTableName('site_tmplvar_contentvalues');

$id_order = "1"; //id заказа
//$id_order = $FormLister->getField('orderID'); //если отдаст


$content = $modx->db->select("content", $table, "id='".$id_order."'");

while ($row=$modx->db->getRow($content)) {
    $ids[] = $row['content'];
    $content = implode(',', $ids); 
}

$content = unserialize($content);
$i=0;
$id_item = array();
for($i;$i < count($content);$i++){
  $id_item[$i] = $content[$i][0];
}
// id товаров в заказе
$ids = implode(',',$id_item);

$fields = array(
	'tmplvarid' => '12',
	'value' => 'отложено'
);
// изменяем значение TV параметра с id=12 у товаров в списке ids
$res = $modx->db->update($fields, $table2, "contentid IN ($ids)");


Но он не запускается по непонятной причине. Не срабатывает почему-то update. Т.е. даже если я просто вызываю на странице как обычный сниппет тот так
$table2 = $modx->getFullTableName('site_tmplvar_contentvalues');
$ids = "84";
$fields = array(
	'tmplvarid' => '12',
	'value' => 'отложено'
);
$result = $modx->db->update($fields, $table2, "contentid IN ($ids)"); 
//return $result;
if( $result ) {  
    echo 'Информация обновлена!';  
} else {  
    echo 'Возникла проблема во время запроса...';  
}

или даже еще проще
$fields = array('tmplvarid'=>'12','value'=>'отложено');
$result = $modx->db->update( $fields, $table2, "contentid = '84'" );

Пишет «Возникла проблема во время запроса...» и ничего не обновляет. Ошибок в логах нет.

Подскажите, что не так?
Версия 1.4.9. хотя на этом же сайте есть и другие подобные сниппеты и плагины, и они работают. А это не хочет((
avatar
Как оказалось — не обновляется только таблица site_tmplvar_contentvalues, поменял для теста на другую таблицу — site_content, все отлично работает, поменял на jot_content — тоже все отлично.

А таблица site_tmplvar_contentvalues не обновляется!

Подскажите, куда копать??
avatar
есть скайп или телеграм?
avatar
скайп есть
avatar
sahar-08
avatar
уже машу там руками))
avatar
сейчас наберу
avatar
Спасибо sahar-08 за помощь и за разъяснения по обновлению site_tmplvar_contentvalues.

ТВ-шки надо обновлять так
$fields = array('value' => 'отложено');
$result = $modx->db->update($fields, $table2, "tmplvarid='12' AND contentid IN ($ids)");

И ormLister orderID тоже прекрасно отдает, т.е.
$id_order = $FormLister->getField('orderID');
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.