Minishop2 и CityFields - коэффициент переоценки для всего города
Добрый день!
В общем, есть магазин на Minishop2 и есть дополнение CityFields. И есть необходимость сделать опцию в cityFields с коэффициентом переоценки (к примеру — «20» — это "+20% к базовой цене", "-10" — это «базовая цена — 10%»). Тогда просто при выборе нужного города сразу должны показываться нужные, правильные цены.
Я знаю, что в этом дополнении уже есть встроенная функция переоценки в зависимости от выбранного города. Но она нам не подходит, так как городов несколько сотен, а товаров — пока около 5 тысяч и впоследствии на переоценку будет тратиться просто тонна времени.
Понимаю, что скорее всего, вопрос может показаться глупым или именно такая затея переоценки странной, но надо именно так.
Я примерно понимаю, что это должен быть какой-то плагин на событие получения стоимости товара. По аналогии с плагином дополнения написал вот такую конструкцию, но цена не меняется(
В общем, заранее благодарен за любой совет
В общем, есть магазин на Minishop2 и есть дополнение CityFields. И есть необходимость сделать опцию в cityFields с коэффициентом переоценки (к примеру — «20» — это "+20% к базовой цене", "-10" — это «базовая цена — 10%»). Тогда просто при выборе нужного города сразу должны показываться нужные, правильные цены.
Я знаю, что в этом дополнении уже есть встроенная функция переоценки в зависимости от выбранного города. Но она нам не подходит, так как городов несколько сотен, а товаров — пока около 5 тысяч и впоследствии на переоценку будет тратиться просто тонна времени.
Понимаю, что скорее всего, вопрос может показаться глупым или именно такая затея переоценки странной, но надо именно так.
Я примерно понимаю, что это должен быть какой-то плагин на событие получения стоимости товара. По аналогии с плагином дополнения написал вот такую конструкцию, но цена не меняется(
<?php
if (!$modx->getOption('cityfields_active')) return false;
$cityFields = $modx->getService('cityfields','cityFields',$modx->getOption('cityfields.core_path',null,$modx->getOption('core_path').'components/cityfields/').'model/cityfields/',$scriptProperties);
if (!($cityFields instanceof cityFields)) return false;
switch($modx->event->name) {
case 'msOnGetProductPrice':
$field = $modx->getObject('cfField', array(
'city_id' => $cityFields->currentCityId,
'placeholder' => 'price-koeff'
));
if ( $field ) {
$modif = (float) $field->get('value');
$values = & $modx->event->returnedValues;
$values['price'] += $values['price']*$modif / 100;
}
echo $values['price'];
break;
}
Подскажите, пожалуйста, в чем может быть проблема? Или может я совсем в неправильную сторону пошел и есть какое-то более грамотное решение. Ну или может кто-то что-то такое уже реализовывал на своих проектах…В общем, заранее благодарен за любой совет
Комментарии: 7
Вопрос первый: Вы само событие включили (поставить галочку в поле Включен на вкладке Системные события)
Вопрос второй: Удалось получить результат работы этой строки:
И теперь, если событие включено и уже зная как дебажить, то можем приступать к дебагу.
В коде есть 3 условия из-за которых результат может быть не удовлетворительным, соответственно и проверяем эти условия.
Вопрос второй: Удалось получить результат работы этой строки:
echo $values['price'];
. Для отладки нужно использовать: $modx->log(modX::LOG_LEVEL_ERROR, print_r($value['price'], 1))
. Результат будет в журнале ошибок.И теперь, если событие включено и уже зная как дебажить, то можем приступать к дебагу.
В коде есть 3 условия из-за которых результат может быть не удовлетворительным, соответственно и проверяем эти условия.
Благодарю за ответ!!! И за подсказку про отладку, для новичка очень полезная функция!
Да, событие включил — «msOnGetProductPrice». Это было первое, на чем споткнулся, но сообразил))
По второму вопросу — нет, не выводит. При этом, значение коэффициента для города поймал, вывел. Получается, неверно получаю базовую цену товара. Сейчас копаю в этой стороне.
Да, событие включил — «msOnGetProductPrice». Это было первое, на чем споткнулся, но сообразил))
По второму вопросу — нет, не выводит. При этом, значение коэффициента для города поймал, вывел. Получается, неверно получаю базовую цену товара. Сейчас копаю в этой стороне.
Вообще, насколько я понимаю, то
$modx->event->returnedValues
используется только для вывода, а для того, а цена будет в переменной $price
на основании данного кода:$params = array(
'product' => $this,
'data' => $data,
'price' => $price,
);
$response = $miniShop2->invokeEvent('msOnGetProductPrice', $params);
Поэтому вот эту строчку $values['price'] += $values['price']*$modif / 100;
нужно переписать на $values['price'] = $price * $modif / 100;
Действительно, цена лежит в $price. Теперь цену поймал, при смене города корректно выводит в журнал верные значения.
а это будет совсем наглостью спросить, как после этого всего заставить отображать на сайте модифицированную цену?
Что-то наподобие такого?
а это будет совсем наглостью спросить, как после этого всего заставить отображать на сайте модифицированную цену?
Что-то наподобие такого?
$product->set('price', $values['price']);
Также и по аналогии с этим вполне рабочим примером (пробовал на тестовом сайте modhost), конструкция
Пока из мыслей только, что родной плагин cityfiled может отлавливать это же событие и не давать менять.
$values['price'] = ($price * $modif / 100) + $price;
сама по себе работает, в журнале выводит, а на этом сайте не хочет. Пока из мыслей только, что родной плагин cityfiled может отлавливать это же событие и не давать менять.
Должно отработать так:
$values = & $modx->event->returnedValues;
$values['price'] = ($price * $modif / 100) + $price;
Вот описание
Ну по логике — да, вроде должно. Но почему-то не идет.
Для чистоты эксперимента еще раз собрал на тестовом сайте, чтобы исключить влияние каких-то других событий, плагинов и дополнений.
В итоге на тестовом все заработало после устновки приоритета плагина на значение «1».
Значит, Ваше решение верное (За что Вам огромное спасибо!!!), надо просто поймать, что мешает работе.
А если кому-то тоже понадобится — вот рабочее решение:
Для чистоты эксперимента еще раз собрал на тестовом сайте, чтобы исключить влияние каких-то других событий, плагинов и дополнений.
В итоге на тестовом все заработало после устновки приоритета плагина на значение «1».
Значит, Ваше решение верное (За что Вам огромное спасибо!!!), надо просто поймать, что мешает работе.
А если кому-то тоже понадобится — вот рабочее решение:
<?php
if (!$modx->getOption('cityfields_active')) return false;
$cityFields = $modx->getService('cityfields','cityFields',$modx->getOption('cityfields.core_path',null,$modx->getOption('core_path').'components/cityfields/').'model/cityfields/',$scriptProperties);
if (!($cityFields instanceof cityFields)) return false;
switch($modx->event->name) {
case 'msOnGetProductPrice':
$field = $modx->getObject('cfField', array(
'city_id' => $cityFields->currentCityId,
'placeholder' => 'price-koeff'
));
if ( $field ) {
$modif = (float) $field->get('value');
$values = & $modx->event->returnedValues;
$values['price'] = ($price * $modif / 100) + $price;
}
break;
};
$modx->log(modX::LOG_LEVEL_ERROR, print_r($values['price'], 1));
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.