Last active
February 27, 2018 12:45
-
-
Save morozVA/33eeb23f95127e4c9d8a85eda18dc868 to your computer and use it in GitHub Desktop.
evo регистрация, авторизация, профиль, скидки
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Регистрация FormLister | |
[!FormLister? | |
&controller=`Reminder` | |
&formid=`remind` | |
&protectSubmit=`0` | |
&submitLimit=`0` | |
&rules=`{ | |
"email":{ | |
"required":"Обязательно введите email", | |
"email":"Введите email правильно" | |
} | |
}` | |
&formTpl=`@CODE: | |
<div class="row"> | |
<div class="col-md-6 col-md-offset-3"> | |
<div class="well"> | |
<form method="post"> | |
<input type="hidden" name="formid" value="remind"> | |
<div class="form-group[+email.errorClass+][+email.requiredClass+]"> | |
<label for="remind_email">* Email</label> | |
<input type="text" class="form-control" id="remind_email" placeholder="Email" name="email" value="[+email.value+]"> | |
[+email.error+] | |
</div> | |
[+form.messages+] | |
<div class="form-group"> | |
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok-sign"></i> Далее</button> | |
</div> | |
</form> | |
</div> | |
</div> | |
</div>` | |
&messagesOuterTpl=`@CODE:<div class="alert alert-danger" role="alert">[+messages+]</div>` | |
&successTpl=`@CODE:<div class="text-center">На указанный вами при регистрации email отправлено письмо с дальнейшими инструкциями!</div>` | |
&subject=`Восстановление пароля` | |
&resetTo=`1` | |
&reportTpl=`@CODE:<p>Для восстановления пароля перейдите по ссылке <a href="[+reset.url+]">[+reset.url+]</a></p>` | |
&resetReportTpl=`@CODE:<p>Здравствуйте, [+fullname.value+]!</p><p>Ваш новый пароль: [+newpassword+]</p>` | |
&resetSuccessTpl=`@CODE:<div class="text-center">На указанный вами при регистрации email отправлено письмо с новым паролем!</div>` | |
&errorTpl=`@CODE:<span class="help-block">[+message+]</span>` | |
&errorClass=` has-error` | |
&requiredClass=` has-warning` | |
!] | |
Авторизация FormLister | |
[!FormLister? | |
&formid=`login` | |
&controller=`Login` | |
&redirectTo=`4` | |
&loginField=`email` | |
&rules=`{ | |
"email":{ | |
"required":"Обязательно введите email", | |
"email":"Введите email правильно" | |
}, | |
"password":{ | |
"required":"Обязательно введите пароль" | |
} | |
}` | |
&formTpl=`@CODE: | |
<div class="row"> | |
<div class="col-md-6 col-md-offset-3"> | |
<div class="well"> | |
<form method="post"> | |
<input type="hidden" name="formid" value="login"> | |
<div class="form-group[+email.errorClass+][+email.requiredClass+]"> | |
<label for="auth_email">* Email</label> | |
<input type="text" class="form-control" id="auth_email" placeholder="Email" name="email" value="[+email.value+]"> | |
[+email.error+] | |
</div> | |
<div class="form-group[+password.errorClass+][+password.requiredClass+]"> | |
<label for="auth_password">* Пароль</label> | |
<input type="password" class="form-control" id="auth_password" placeholder="Пароль" name="password" value=""> | |
[+password.error+] | |
</div> | |
[+form.messages+] | |
<div class="form-group"> | |
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-log-in"></i> Войти</button> | |
</div> | |
<div class="text-center"><a href="[~6~]">Зарегистрироваться</a> | <a href="[~7~]">Забыли пароль</a></div> | |
</form> | |
</div> | |
</div> | |
</div>` | |
&messagesOuterTpl=`@CODE:<div class="alert alert-danger" role="alert">[+messages+]</div>` | |
&skipTpl=`@CODE:<div class="text-center">Вы уже авторизованы.</div>` | |
&successTpl=`@CODE:<div class="text-center">Привет, [+fullname+]!</div>` | |
&errorTpl=`@CODE:<span class="help-block">[+message+]</span>` | |
&errorClass=` has-error` | |
&requiredClass=` has-warning` | |
!] | |
Восстановление пароля | |
[!FormLister? | |
&controller=`Reminder` | |
&formid=`remind` | |
&protectSubmit=`0` | |
&submitLimit=`0` | |
&rules=`{ | |
"email":{ | |
"required":"Обязательно введите email", | |
"email":"Введите email правильно" | |
} | |
}` | |
&formTpl=`@CODE: | |
<div class="row"> | |
<div class="col-md-6 col-md-offset-3"> | |
<div class="well"> | |
<form method="post"> | |
<input type="hidden" name="formid" value="remind"> | |
<div class="form-group[+email.errorClass+][+email.requiredClass+]"> | |
<label for="remind_email">* Email</label> | |
<input type="text" class="form-control" id="remind_email" placeholder="Email" name="email" value="[+email.value+]"> | |
[+email.error+] | |
</div> | |
[+form.messages+] | |
<div class="form-group"> | |
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-ok-sign"></i> Далее</button> | |
</div> | |
</form> | |
</div> | |
</div> | |
</div>` | |
&messagesOuterTpl=`@CODE:<div class="alert alert-danger" role="alert">[+messages+]</div>` | |
&successTpl=`@CODE:<div class="text-center">На указанный вами при регистрации email отправлено письмо с дальнейшими инструкциями!</div>` | |
&subject=`Восстановление пароля` | |
&resetTo=`1` | |
&reportTpl=`@CODE:<p>Для восстановления пароля перейдите по ссылке <a href="[+reset.url+]">[+reset.url+]</a></p>` | |
&resetReportTpl=`@CODE:<p>Здравствуйте, [+fullname.value+]!</p><p>Ваш новый пароль: [+newpassword+]</p>` | |
&resetSuccessTpl=`@CODE:<div class="text-center">На указанный вами при регистрации email отправлено письмо с новым паролем!</div>` | |
&errorTpl=`@CODE:<span class="help-block">[+message+]</span>` | |
&errorClass=` has-error` | |
&requiredClass=` has-warning` | |
!] | |
Личный кабинет FormLister | |
<a href="[~1~]?logout">Выйти</a> | |
[!FormLister? | |
&formid=`profile` | |
&controller=`Profile` | |
&rules=`{ | |
"email":{ | |
"required":"Введите email", | |
"email":"Неверный email", | |
"custom":{ | |
"function":"\\FormLister\\Profile::uniqueEmail", | |
"message":"Этот email уже использует другой пользователь" | |
} | |
}, | |
"fullname":{ | |
"required":"Введите имя пользователя", | |
"alphaNumeric":"Только буквы и цифры", | |
} | |
}` | |
&formTpl=`@CODE: | |
<div class="row"> | |
<div class="col-md-6 col-md-offset-3"> | |
<div class="well"> | |
<form method="post"> | |
<input type="hidden" name="formid" value="profile"> | |
<div class="form-group[+email.errorClass+][+email.requiredClass+]"> | |
<label for="email">* Email</label> | |
<input type="text" class="form-control" id="email" placeholder="Email" name="email" value="[+email.value+]"> | |
[+email.error+] | |
</div> | |
<div class="form-group[+fullname.errorClass+][+fullname.requiredClass+]"> | |
<label for="reg_fullname"><i class="icon-fullname">Имя</i></label> | |
<input type="text" class="form-control" id="reg_fullname" placeholder="Имя" name="fullname" value="[+fullname.value+]"> | |
[+fullname.error+] | |
</div> | |
<div class="form-group[+phone.errorClass+][+phone.requiredClass+]"> | |
<label for="reg_phone"><i class="icon-phone">Телефон</i></label> | |
<input type="text" class="form-control" id="reg_phone" placeholder="Телефон" name="phone" value="[+phone.value+]"> | |
[+phone.error+] | |
</div> | |
<div class="form-group[+comment.errorClass+][+comment.requiredClass+]"> | |
<label for="reg_phone"><i class="icon-phone">Комментарий</i></label> | |
<textarea type="text" class="form-control" id="comment" placeholder="Комментарий" name="comment">[+comment.value+]</textarea> | |
[+comment.error+] | |
</div> | |
[+form.messages+] | |
<div class="form-group"> | |
<button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-log-in"></i> Обновить</button> | |
</div> | |
</form> | |
</div> | |
</div> | |
</div>` | |
&messagesOuterTpl=`@CODE:<div class="alert alert-danger" role="alert">[+messages+]</div>` | |
&successTpl=`@CODE:<div class="text-center">Информация обновлена!</div>` | |
&errorTpl=`@CODE:<span class="help-block">[+message+]</span>` | |
!] | |
Персональные скидки | |
Реализация персональных скидок зависит от нужного функционала. | |
Возможен расчет скидки на основе суммы ранее совершенных покупок. В таком случае градация процента скидки, как вариант, реализуется созданием ресурсов. Pagetitle ресурса содержит процент скидки, TV поля ОТ и ДО содержат диапазон суммы совершенных ранее покупок, к которому применяется скидка. Расчет совершается js-ом. | |
Пример сниппета подсчета суммы ранее совершенных покупок get_user_amount_of_purchase: | |
<?php | |
if($modx->getLoginUserID()){ | |
$id = $modx->getLoginUserID(); | |
$txt = $modx->getWebUserInfo($id); | |
if($txt['dealer'] == 0){ | |
$user_id = $txt['id']; | |
$amount_of_purchase = 0; | |
$sql = 'SELECT SUM(price) as amount_of_purchase FROM `modx_manager_shopkeeper` WHERE userid = "'.$user_id.'" AND status NOT IN (5)'; | |
$result = $modx->db->query($sql); | |
while( $row = $modx->db->getRow( $result ) ) { | |
$amount_of_purchase = $row['amount_of_purchase']; | |
} | |
echo $amount_of_purchase; | |
} | |
else{ | |
echo 0; | |
} | |
} | |
Пример js-скрипта рассчета скидки на основании суммы покупок | |
//Расчет скидки в процентах и остаток до следующей цифры | |
function calc_proc_discount_and_difference(){ | |
var user_amount_of_purchase = $('.user_amount_of_purchase').text(); | |
if($('#cartInner .total .amount').text() != ''){ | |
var amount_in_cart = parseFloat($('#cartInner .total .amount').text()); | |
} | |
else{ | |
var amount_in_cart = 0; | |
} | |
if((user_amount_of_purchase == 0) && ($('#cartInner .total .amount').length == 0)){ | |
$('.total_discount_in_proc').text('0'); | |
$('.difference_wrap').parents('tr').html('<td><div class="h4">Необходимо совершить первую покупку чтоб получить скидку</div></td><td></td>'); | |
return true; | |
} | |
user_amount_of_purchase = parseFloat(user_amount_of_purchase) + parseFloat(amount_in_cart); | |
var length = $('.variants_discount.hidden > div').length; | |
$('.variants_discount.hidden > div').each(function(){ | |
if(($(this).data('from') <= user_amount_of_purchase*1) && ($(this).data('to') >= user_amount_of_purchase*1)){ | |
var el_index = $(this).index()+1; | |
var proc = parseInt($(this).text()); | |
var difference = parseFloat($(this).data('to') - user_amount_of_purchase, 2); | |
//console.log(proc); | |
var next_discount = $(this).next().text(); | |
//console.log(next_discount); | |
$('.total_discount_in_proc').text(proc); | |
if(length == el_index){ | |
$('.difference_wrap').parents('tr').html('<td><div class="h4">На данный момент вы пользуетесь максимальной скидкой</div></td><td></td>'); | |
} | |
else{ | |
$('.next_discount').text(next_discount); | |
$('.difference').text(number_format(difference, 2, '.', ' ')); | |
} | |
} | |
}); | |
} | |
calc_proc_discount_and_difference(); | |
Также возможен вариант создания модуля в админке, в котором админ может самостоятельно указывать скидку для пользователя. В таком случае создается новая таблица в БД с полями user_id и discount. | |
Чек-лист: | |
Проверить вывод скидки пользователя. | |
Верность расчета скидки | |
Изменение скидки при совершении дальнейших покупок/удалении старых покупок | |
История заказов | |
Пример сниппета истории заказов history_order: | |
<?php | |
if($modx->getLoginUserID()){ | |
$id = $modx->getLoginUserID(); | |
$txt = $modx->getWebUserInfo($id); | |
$user_email = $txt['email']; | |
$sql = 'SELECT * FROM `modx_manager_shopkeeper` WHERE email = "'.$user_email.'" AND status NOT IN (5) ORDER BY date DESC'; | |
$result = $modx->db->query($sql); | |
while( $row = $modx->db->getRow( $result ) ) { ?> | |
<?php $content = unserialize($row['content']); ?> | |
<?$products = ''; | |
foreach($content as $item){ | |
$isDoc = $modx->getDocument($item[0]); | |
$params['docid'] = $item[0]; | |
$params['field'] = 'parent'; | |
$parent_id = $modx->runSnippet('GetField', $params); | |
$params['docid'] = $parent_id; | |
$params['field'] = 'pagetitle'; | |
$parent_name = $modx->runSnippet('GetField', $params); | |
if($_COOKIE['person']=='fiz'){ | |
$params['docid'] = $item[0]; | |
$params['field'] = 'nds'; | |
$nds = $modx->runSnippet('GetField', $params); | |
$price_with_nds = number_format($item[2] + ($item[2] * $nds / 100), 2, ".", " "); | |
$item[2] = $price_with_nds; | |
} | |
//echo '<pre>'; | |
//var_dump($item); | |
//echo '</pre>'; | |
if($isDoc){ | |
$products .= ' | |
<tr class="cart-order"> | |
<td class="c-img"> | |
<a href="[~'.$item[0].'~]"><img src="[[phpthumb? &input=`'.$item['tv']['image'].'` &options=`w=100,h=100,far=C,bg=fff`]]" alt=""></a> | |
</td> | |
<td class="c-name teh-product-desc"> | |
<a href="[~'.$item[0].'~]">'.$item[3].'</a> | |
<span><span>Артикул:</span> '.$item['tv']['articul'].'</span> | |
<span><span>Категория:</span> <a href="[~'.$parent_id.'~]" title="">'.$parent_name.'</a></span> | |
</td> | |
<td class="c-price shk-price"><span>'.$item[2].'</span> руб.</td> | |
<td class="c-qty" nowrap="nowrap">'.$item[1].' шт.</td> | |
</tr> | |
'; | |
} | |
else{ | |
$products .= ' | |
<tr class="cart-order"> | |
<td class="c-img"> | |
</td> | |
<td class="c-name teh-product-desc"> | |
<a href="[~'.$item[0].'~]">'.$item[3].'</a> | |
<div class="h3">Данного товара больше нет в продаже</div> | |
</td> | |
<td class="c-price shk-price"><span>'.$item[2].'</span> руб.</td> | |
<td class="c-qty" nowrap="nowrap">'.$item[1].' шт.</td> | |
</tr> | |
'; | |
} | |
} | |
echo ' | |
<div class="panel panel-default"> | |
<div class="panel-heading" role="tab"> | |
<div class="panel-title h4"> | |
<a role="button" data-toggle="collapse" class="collapsed" data-parent="#history" href="#zakaz'.$row['id'].'" aria-expanded="true"><strong>Заказ №'.$row['id'].'</strong> <span class="date">'. | |
date("d.m.Y", strtotime($row['date'])) | |
.'</span></a> | |
</div> | |
</div> | |
<div id="zakaz'.$row['id'].'" class="panel-collapse collapse" role="tabpanel"> | |
<div class="panel-body"> | |
<div class="table-responsive"> | |
<table class="table table-bordered text-center"> | |
<tbody>'.$products.'</tbody> | |
</table> | |
</div> | |
</div> | |
</div> | |
</div> | |
'; ?> | |
<? } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment