По какому критерию должна даваться скидка гостю?
ну клиент переходит по ссылке, там обработчик и ему дается скидка на все товары.
В модуле Интернет магазин есть возможность оформлять заказы гостям это реализовано за счет создания объекта "покупатель-гость" соответственно создается сессия, полагаю можно сделать кастом который будет применять скидку к этому пользователю аналогично тому как это у тебя сделано для зарегистрированных.
а вот как узнать как прописать этого временного пользователя?
вот мой обработчик:
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/");
}
Если да, то скорее всего не хватает прав у гостя на доступ к функции на которую вы его перекидываете, поэтому система просит его авторизоваться
Поправил, спасибо заработало.
Я пока не очень понимаю смысл вашей скидки по ссылке
Ссылка просто это обработчик discount_all() она грубо говоря вызывается при определенном действии пользователя. например он нажимает кнопку получить скидку. Скрипт дергает ссылку и пользователь получает скидку.
еще не нажавший на вашу ссылку и тех кто гость и уже должен видеть скидку
Да, да именно в этом и загвоздка
А так, смотрите предложенного выше вариант: "создавать для гостя объект "покупатель" и уже к нему привязывать факт того, что пользователю дали скидку
Вот самое главное как это сделать?... :(
Вот самое главное как это сделать?... :(
Объект создается сам при добавлении товара в корзину.
как видите половины работы почти уже сделано за вас системой (хотя надо еще проверить, а то пользователь мог еще ничего и не купить и тогда надо насильно создать этот объект "покупатель-гость")
Не знаю ваш уровень работы с 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))
<?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;
}
}
};
?>
вот в таком виде скидка должна быть?
Еще вопрос, потребовалось модифицировать скидку: вместо скидки на корзину делать скидку на конкретные товары. код моего правила:
<?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 у пользователя в соответствующей настройке
ваша скидка только на заказ. Обратите внимание на
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;
}
};
?>