понедельник, 6 апреля 2020 г.

VM - распарсить/упаковать product_params (параметры товаров) из/для базы данных

VirtueMart хранит в базе данных (в таблице #__virtuemart_products) параметры товаров (product_box и ещё некоторые) в таком, скажем так, специфичном виде :)
Даже не знаю, почему так. Почему нельзя хранить, допустим, строку json...
Наверно, так сложилось исторически.
Делюсь решением парсинга и обратной упаковки, дабы упростить жизнь в будущем и себе, и людям.

Делал человеку скрипт для импорта товаров из 1С (со своеобразными условиями), столкнулся с этим вопросом.

// предположим, product_params из БД у нас в результате селекта
$old_params = $select->product_params;
// парсим
$old_params_arr = explode('|', $old_params);
$arr = [];
foreach ($old_params_arr as $o) {
    if (empty(trim($o))) continue;
    $para_arr = explode('=', $o);
    $arr[trim($para_arr[0])] = trim(trim($para_arr[1]), '"');
    unset($o, $para_arr);
}
// в массиве меняем, что хотим
$arr['product_box'] = 'что_хотим';
// упаковываем
foreach ($arr as $k => $ar) {
    $new_params[] = $k.'="'.$ar.'"';
    unset($k, $ar);
}
$prod->product_params = implode('|', $new_params).'|';
// заново упакованные параметры теперь в $prod->product_params
Особо комментировать не буду. Если что непонятно, обращайтесь в комментариях!

Комментариев нет:

Отправка комментария