SEO-TOOLS проект сайта SEO инструментов > FAQ, вопросы и ответы
Мануал создания платных веб-форм
(1/1)
schoolseo:
Интересует вопрос создания платных web-форм с оплатой при помощи отдельных страниц. Можно пример расписать? Заранее спасибо!
forwebm:
В качестве примера приведу код `сторонней направленности`. Не покупка или открытие доступа, а обычное управление СВОИМ балансом (для админов разумеется).
!! Для обращения как к ядру проекта, так и к ядру сео инструментов обязательным критерием является:
* Опыт программирования на php
* Хорошо ознакомиться с шаблонизатором smarty
* Хорошие знания разметки html
Прежде всего закроем содержимое страницы от всех, кто не является администратором. Для этого весь код поместим в блок:
--- Код: ---{if !$page_object->control->isadminstatus}
<div style="color: red"><strong>Только админ может зайти на эту страницу!!</strong></div>
{else}
{* здесь будет код страницы *}
{/if}
--- Конец кода ---
Добавим форму, которая будет посылать POST запрос на обработку.
--- Код: ---<form method="post" onsubmit="return PrepereToFormSend(this)">
<div class="typelabel">Сумма (в USD, формат: 0.00)</div>
<div class="typelabel">
<input type="text" class="inpt" style="width: 300px" name="pricefield" maxlength="10" value="{$CONTROL_OBJ->GetPostElement('pricefield', 'makemyform', 'do', '0.00')}">
</div>
<div class="typelabel">Сумма (формат: 0.00)</div>
<div class="typelabel">
<select size="1" name="pricetype" style="width: 300px">
<option value="add"{if $smarty.post.pricetype == 'add'} selected="selected"{/if}>Добавить сумму</option>
<option value="sub"{if $smarty.post.pricetype == 'sub'} selected="selected"{/if}>Вычесть сумму</option>
<option value="set"{if $smarty.post.pricetype == 'set'} selected="selected"{/if}>Установить сумму</option>
</select>
</div>
<div class="typelabel">Описание платежа для истории финансовых операций</div>
<div class="typelabel">
<input type="text" class="inpt" style="width: 300px" name="pricedescr" maxlength="250" value="{$CONTROL_OBJ->GetPostElement('pricedescr', 'makemyform', 'do', 'Операция с балансом моего аккаунта `тест`')}">
</div>
<div class="typelabel" style="margin-top: 8px"><input type="checkbox" style="cursor: pointer" name="pricenomessage" id="pricenomessage"{if $page_object->CheckPostValue('pricenomessage')} checked="checked"{/if} /><label for="pricenomessage" style="cursor: pointer"> Не отправлять уведомления на почту о действии с балансом</label>
</div>
<div class="typelabel" style="margin-top: 10px">
<input type="submit" value=" Применить " class="button" name="rb" id="rb">
</div>
<input type="hidden" value="do" name="makemyform" />
</form>
--- Конец кода ---
В данной форме определены стандартные поля для подачи соответствующего типа запроса.
Обработчик формы сделаем на php (можно и через шаблонизатор, но использование php в данном случае более эффективно..)
--- Код: ---{php}
global $CONTROL_OBJ;
$error = '';
//check price
if (!@is_numeric($_POST['pricefield']) || $_POST['pricefield'] < 0)
$error = 'Необходимо указать числовое значение суммы!';
//check price, step 2
if (!$error) {
switch ($_POST['pricetype']) {
case 'add':
case 'sub':
if ($_POST['pricefield'] <= 0)
$error = 'Для добавления/вычетания суммы необходимо указать значение суммы больше 0!';
break;
case 'set': break;
default: $error = 'Неизвестный тип операции!'; break;
}
}
if (!$error) {
//correct ather values
if (!$_POST['pricedescr'])
$_POST['pricedescr'] = 'Неизвестная операция!';
//processed
$error = $CONTROL_OBJ->MoneyProcess(
$CONTROL_OBJ->userdata, $CONTROL_OBJ->CorrectSymplyString($_POST['pricedescr']),
($CONTROL_OBJ->userdata['iduser'] + 9897), $_POST['pricefield'], false, $_POST['pricetype'],
!$CONTROL_OBJ->CheckPostValue('pricenomessage')
);
}
$CONTROL_OBJ->smarty->assign('error_operation', $error);
{/php}
--- Конец кода ---
Данный код будет обрабатывать форму и возвращать либо ошибку запроса либо успешный результат. Результат (или ошибка) будет устанавливаться в smarty переменную $error_operation
После чего вновь средствами smarty выведем результат запроса.
p.s Также к странице (в конец страницы) добавим блок вывода вложений (если они имеются) и подключим возможность оставлять комментарии (для теста разумеется)..
--- Код: ---{$page_object->GetDefaultAttachmentsBlock()}
{$page_object->GetCommentsBlock()}
--- Конец кода ---
Полный пример кода данной страницы: (можно протестировать `как есть`)
--- Код: ---{if !$page_object->control->isadminstatus}
<div style="color: red"><strong>Только админ может зайти на эту страницу!!</strong></div>
{else}
{literal}
<script type="text/javascript">
function PrepereToFormSend(th) {
th.rb.disabled = true;
return true;
}//PrepereFormSend
</script>
{/literal}
<hr />
<form method="post" onsubmit="return PrepereToFormSend(this)">
<div class="typelabel">Сумма (в USD, формат: 0.00)</div>
<div class="typelabel">
<input type="text" class="inpt" style="width: 300px" name="pricefield" maxlength="10" value="{$CONTROL_OBJ->GetPostElement('pricefield', 'makemyform', 'do', '0.00')}">
</div>
<div class="typelabel">Тип операции</div>
<div class="typelabel">
<select size="1" name="pricetype" style="width: 300px">
<option value="add"{if $smarty.post.pricetype == 'add'} selected="selected"{/if}>Добавить сумму</option>
<option value="sub"{if $smarty.post.pricetype == 'sub'} selected="selected"{/if}>Вычесть сумму</option>
<option value="set"{if $smarty.post.pricetype == 'set'} selected="selected"{/if}>Установить сумму</option>
</select>
</div>
<div class="typelabel">Описание платежа для истории финансовых операций</div>
<div class="typelabel">
<input type="text" class="inpt" style="width: 300px" name="pricedescr" maxlength="250" value="{$CONTROL_OBJ->GetPostElement('pricedescr', 'makemyform', 'do', 'Операция с балансом моего аккаунта `тест`')}">
</div>
<div class="typelabel" style="margin-top: 8px"><input type="checkbox" style="cursor: pointer" name="pricenomessage" id="pricenomessage"{if $page_object->CheckPostValue('pricenomessage')} checked="checked"{/if} /><label for="pricenomessage" style="cursor: pointer"> Не отправлять уведомления на почту о действии с балансом</label>
</div>
<div class="typelabel" style="margin-top: 10px">
<input type="submit" value=" Применить " class="button" name="rb" id="rb">
</div>
<input type="hidden" value="do" name="makemyform" />
</form>
{* статус обработки *}
{if $smarty.post.makemyform == 'do'}
<div style="margin-top: 14px">
{php}
global $CONTROL_OBJ;
$error = '';
//check price
if (!@is_numeric($_POST['pricefield']) || $_POST['pricefield'] < 0)
$error = 'Необходимо указать числовое значение суммы!';
//check price, step 2
if (!$error) {
switch ($_POST['pricetype']) {
case 'add':
case 'sub':
if ($_POST['pricefield'] <= 0)
$error = 'Для добавления/вычетания суммы необходимо указать значение суммы больше 0!';
break;
case 'set': break;
default: $error = 'Неизвестный тип операции!'; break;
}
}
if (!$error) {
//correct ather values
if (!$_POST['pricedescr'])
$_POST['pricedescr'] = 'Неизвестная операция!';
//processed
$error = $CONTROL_OBJ->MoneyProcess(
$CONTROL_OBJ->userdata, $CONTROL_OBJ->CorrectSymplyString($_POST['pricedescr']),
($CONTROL_OBJ->userdata['iduser'] + 9897), $_POST['pricefield'], false, $_POST['pricetype'],
!$CONTROL_OBJ->CheckPostValue('pricenomessage')
);
}
$CONTROL_OBJ->smarty->assign('error_operation', $error);
{/php}
{if $error_operation}
<strong style="color: red">{$error_operation}</strong>
{elseif $smarty.post.pricetype == 'add'}
<strong style="color: #008000">Баланс успешно пополнен на сумму <ins>{$smarty.post.pricefield} USD</ins></strong>
{elseif $smarty.post.pricetype == 'sub'}
<strong style="color: #008000">Баланс успешно уменьшен на сумму <ins>{$smarty.post.pricefield} USD</ins></strong>
{else}
<strong style="color: #008000">Баланс успешно установлен в значение суммы <ins>{$smarty.post.pricefield} USD</ins></strong>
{/if}
</div>
{/if}
<hr style="margin-top: 8px"/>
{$page_object->GetDefaultAttachmentsBlock()}
{$page_object->GetCommentsBlock()}
{/if}
--- Конец кода ---
При наличии навыка работы с php, smarty, html - данный пример даст исчерпывающую информацию по примеру использования `баланса` на `отдельных страницах` проекта.
С уважением, Евгений!
Навигация
Перейти к полной версии