Skip to content

Instantly share code, notes, and snippets.

@morozVA
Last active February 27, 2018 12:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save morozVA/33eeb23f95127e4c9d8a85eda18dc868 to your computer and use it in GitHub Desktop.
Save morozVA/33eeb23f95127e4c9d8a85eda18dc868 to your computer and use it in GitHub Desktop.
evo регистрация, авторизация, профиль, скидки
Регистрация 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