Автор Тема: Мануал создания платных веб-форм  (Прочитано 9828 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн schoolseo

  • Новичок
  • *
  • Карма: +1/-0
  • Пол: Мужской
  • SchoolSeo.ru - Школа Seo от А до Я
    • Просмотр профиля
Мануал создания платных веб-форм
« : 27 Ноябрь 2011, 20:54:07 »
Интересует вопрос создания платных web-форм с оплатой при помощи отдельных страниц. Можно пример расписать? Заранее спасибо!

Оффлайн forwebm

  • Администратор
  • Постоялец
  • *****
  • Карма: +9/-0
    • Просмотр профиля
Re: Мануал создания платных веб-форм
« Ответ #1 : 28 Ноябрь 2011, 19:05:52 »
В качестве примера приведу код `сторонней направленности`. Не покупка или открытие доступа, а обычное управление СВОИМ балансом (для админов разумеется).

!! Для обращения как к ядру проекта, так и к ядру сео инструментов обязательным критерием является:
  • Опыт программирования на 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="&nbsp;Применить&nbsp;" 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="&nbsp;Применить&nbsp;" 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 - данный пример даст исчерпывающую информацию по примеру использования `баланса` на `отдельных страницах` проекта.

С уважением, Евгений!
« Последнее редактирование: 28 Ноябрь 2011, 19:10:22 от forwebm »