UMIhelp

Разработка сайта на UMI.CMS => Настройка системы и модулей => Тема начата: rellai от 13 Мая 2014, 15:54:20

Название: Как применить скидку не авторизованному пользователю
Отправлено: rellai от 13 Мая 2014, 15:54:20
Есть следующая задача.
Клиент например нажимает  кнопку и скидка применяется.
В текущем варианте скидка применяется пользователю авторизованному.
А как применить скидку если пользователь не авторизован?
Если применять скидку гостю то ее получат все не авторизованные пользователи?
Может можно как нить сессию отслеживать?
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: ilyar от 13 Мая 2014, 16:01:20
Есть следующая задача.
Клиент например нажимает  кнопку и скидка применяется.
В текущем варианте скидка применяется пользователю авторизованному.
А как применить скидку если пользователь не авторизован?
Если применять скидку гостю то ее получат все не авторизованные пользователи?
Может можно как нить сессию отслеживать?

В модуле Интернет магазин есть возможность оформлять заказы гостям это реализовано за счет создания объекта "покупатель-гость" соответственно создается сессия, полагаю можно сделать кастом который будет применять скидку к этому пользователю аналогично тому как это у тебя сделано для зарегистрированных.
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: e.ioffe от 13 Мая 2014, 16:26:24
По какому критерию должна даваться скидка гостю?
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 14 Мая 2014, 11:42:19
По какому критерию должна даваться скидка гостю?
ну клиент переходит по ссылке, там обработчик и ему дается скидка на все товары.

В модуле Интернет магазин есть возможность оформлять заказы гостям это реализовано за счет создания объекта "покупатель-гость" соответственно создается сессия, полагаю можно сделать кастом который будет применять скидку к этому пользователю аналогично тому как это у тебя сделано для зарегистрированных.
а вот как узнать как прописать этого временного пользователя?

вот мой обработчик:
public function discount_all() {
 
  function get_user_id(){
    $permissions = permissionsCollection::getInstance();
    $currentUserId = $permissions->getUserId();
    return $currentUserId;
  }

$object_id = (int) getRequest('param0');
  $objects = umiObjectsCollection::getInstance();
  $objectTypes = umiObjectTypesCollection::getInstance();
  // object_id пользователя
  $user_id = get_user_id();

  $newDiscountObject = $objects->getObject(1280);
  if($newDiscountObject instanceof umiObject) {
   
    $rules_discoun_object = $objects->getObject(1283);
    $users=array();
    $object_user = $objects->getObject($user_id);
    $users = $rules_discoun_object->getValue('users');
    $users[] = $object_user;
    $users = array_unique($users);
    $rules_discoun_object->setValue('users', $users);
    $rules_discoun_object->commit();
    $newDiscountObject->commit();   
  }
  $this->redirect($this->pre_lang . "/emarket/cart/");
     
}
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: e.ioffe от 14 Мая 2014, 11:46:36
Цитировать
а вот как узнать как прописать этого временного пользователя?

В обработчике можно установить флаг для сессии этого пользователя, а в скидке проверять, установлен флаг или нет. Я бы делал так.
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 14 Мая 2014, 11:51:56
А как это сделать не догоняю.
В текущем виде если пользователь не  авторизован, то перекидывает на форму авторизации
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: admin от 14 Мая 2014, 12:14:10
А как это сделать не догоняю.
В текущем виде если пользователь не  авторизован, то перекидывает на форму авторизации

перекидывает при?
ну клиент переходит по ссылке, там обработчик и ему дается скидка на все товары.

Если да, то скорее всего не хватает прав у гостя на доступ к функции на которую вы его перекидываете, поэтому система просит его авторизоваться (правьте файл permissions.php)

Насчет варианта добавить скидку гостю. В любом случае вам надо как-то различать тех кто гость еще не нажавший на вашу ссылку и тех кто гость и уже должен видеть скидку. Я пока не очень понимаю смысл вашей скидки по ссылке (возможно вы собираете данные с посетителей гостей за скидку) и от ответа на этот вопрос будет видно, что вам больше подходит.

А так, смотрите  предложенного выше вариант: "создавать для гостя объект "покупатель" и уже к нему привязывать факт того, что пользователю дали скидку (опять же скидка должна учитывать данный маркер у объекта "покупатель", то есть создаем новый тип скидки)
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 14 Мая 2014, 13:01:20
Цитировать
Если да, то скорее всего не хватает прав у гостя на доступ к функции на которую вы его перекидываете, поэтому система просит его авторизоваться
Поправил, спасибо заработало.

Я пока не очень понимаю смысл вашей скидки по ссылке
Ссылка просто это обработчик  discount_all() она грубо говоря вызывается при определенном действии пользователя. например он нажимает кнопку получить скидку. Скрипт дергает ссылку и пользователь получает скидку.

Цитировать
еще не нажавший на вашу ссылку и тех кто гость и уже должен видеть скидку
Да, да именно в этом и загвоздка

Цитировать
А так, смотрите  предложенного выше вариант: "создавать для гостя объект "покупатель" и уже к нему привязывать факт того, что пользователю дали скидку
Вот самое главное как это сделать?... :(
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: e.ioffe от 14 Мая 2014, 13:07:37
Объект создается сам при добавлении товара в корзину.
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: admin от 14 Мая 2014, 13:39:59
Вот самое главное как это сделать?... :(

Объект создается сам при добавлении товара в корзину.

как видите половины работы почти уже сделано за вас системой (хотя надо еще проверить, а то пользователь мог еще ничего и не купить и тогда надо насильно создать этот объект "покупатель-гость")

Не знаю ваш уровень работы с umi, попробую привести общие api моменты.
1. получение объекта покупателя  (если его нет система его тут же создаст)
$customer = customer::get();

2. добавить метку что покупатель нажал на ссылку позволяющую ему видеть скидку. Если мы говорим о покупателе госте, то объект "покупатель-гость" будет работать с типом данных "Незарегистрированный покупатель" (ищите его в списке справочников, в модуле "типы данных"). В этом типе данных добавляем ему кнопку галочку "скидка доступна" которая будет проставлять при переходе пользователем по вашей ссылке.
3. пишем новое правило скидки, которое применяет скидку если у покупателя есть галочка в поле "скидка доступна" (см. статьи по поводу создания своих скидок "Скидка на товар в зависимости от количества этого товара в корзине" (http://wiki.umisoft.ru/%D0%A1%D0%BA%D0%B8%D0%B4%D0%BA%D0%B0_%D0%BD%D0%B0_%D1%82%D0%BE%D0%B2%D0%B0%D1%80_%D0%B2_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D1%82_%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D1%8D%D1%82%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B2_%D0%BA%D0%BE%D1%80%D0%B7%D0%B8%D0%BD%D0%B5), Скидка по карте (http://wiki.umisoft.ru/%D0%A1%D0%BA%D0%B8%D0%B4%D0%BA%D0%B0_%D0%BF%D0%BE_%D0%BA%D0%B0%D1%80%D1%82%D0%B5), Добавление нового правила скидки (http://wiki.umisoft.ru/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D1%81%D0%BA%D0%B8%D0%B4%D0%BA%D0%B8))
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 17 Мая 2014, 02:40:49
Спасибо буду разбираться....
Как я представляю работу со скидкой у не авторизованного пользователя:
Пользователь нажимает на кнопку выполняется скрипт и как вариант в куки добавляется признак - то что скидка есть.
А дальше обработчик смотрит в куки...

Правильно думаю?
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: admin от 17 Мая 2014, 07:42:10
можно и так, но куки имеют свои тех. ограничения, возможно разумнее сразу работать с объектом покупатель (customer)
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 28 Мая 2014, 15:37:07
<?php
class countsDiscountRule extends discountRule implements orderDiscountRule {
 
  public function validateOrder(order $order) {
    $customer = customer::get();
  $personal_discount = $customer->getValue("personal_discount");
if($personal_discount=='1'){
return true;
} else {
return false;
}
  }
};
?>

вот в таком виде скидка должна быть?
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: e.ioffe от 28 Мая 2014, 15:40:29
Если поле "personal_discount" имеет тип "Флажок", то можно просто проверить if($personal_discount).

Теоретически - должно работать
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 28 Мая 2014, 16:02:47
Вот объявил эту скидку и сделал активной.
Поле параметров скидки пустое. я никаких доп полей не заводил, так как фактически она лезет в кустомер и сравнивает с 1 правильно?

Тип скидки - на заказ
Модификатор - процент от суммы
Правила валидации указал только свое.
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 28 Мая 2014, 16:12:59
Все проверил! Работает!!! ура :)))
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: admin от 28 Мая 2014, 16:17:50
отлично)
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 28 Мая 2014, 16:39:38
Доработал, чтобы человек вводил номер купона, и если он совпадает с тем что прописан в скидке человек получал ее...


Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 31 Мая 2014, 00:41:14
Еще вопрос, потребовалось модифицировать скидку: вместо скидки на корзину делать скидку на конкретные товары. код моего правила:
<?php
class countsDiscountRule extends discountRule implements orderDiscountRule {
 
  public function validateOrder(order $order) {
    $customer = customer::get();
  $personal_discount = $customer->getValue("personal_discount");
if($personal_discount=='1'){
return true;
} else {
return false;
}
  }
};
?>

но она почему то на товары каталога не распостраняется......
во первых какие бы товары каталога я не выбрал, скидка всегда применяется

во вторых скидка работает и без 1 у пользователя в соответствующей настройке
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: admin от 31 Мая 2014, 09:58:06
ваша скидка только на заказ. Обратите внимание на
implements orderDiscountRule

и public function validateOrder(order $order) {

у скидок на товары другие данные, например вот такие
<?php
/**
* Скидка для определенных товаров.
* Иногда может быть предпочтительнее, чем скидка на раздел, так как может работать немного быстрее.
*/
class itemsDiscountRule extends discountRule implements itemDiscountRule {
public function validateItem(iUmiHierarchyElement $orderItem) {
if(!is_array($this->catalog_items)) {
return false;
}

foreach($this->catalog_items as $catalogItem) {
if($catalogItem->id == $orderItem->id) {
return true;
}
}

$parentId = $orderItem->getParentId();
if($parentId) {
$hierarchy = umiHierarchy::getInstance();
$parents = $hierarchy->getAllParents($parentId, true);
if(isset($parents[0])) unset($parents[0]);
foreach($this->catalog_items as $catalogItem) {
if(in_array($catalogItem->id, $parents)) {
return true;
}
}
}

return false;
}
};
?>

Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 02 Июня 2014, 09:36:00
о спасибо! попробую к себе применить
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: rellai от 04 Июня 2014, 13:20:27
Спасибо заработало )
Название: Re:Как применить скидку не авторизованному пользователю
Отправлено: admin от 04 Июня 2014, 14:34:26
Прекрасно  ;)