Гостевая книга на Битриксе на стандартных компонентах

Велосипеды, какими бы они небыли, нуждаются в доработке.

Руководствуясь приведённой выше мыслью я решил сделать гостевую книгу на стандартных компонентах и API.

Необходимо: модуль "Формы", копипаст моего кода, доработка моего кода :)
Пример гостевой: http://nwcinema.ru/guest/

На странице гостевой будет располагаться форма добавления реплики (вопроса, жалобы и т.п.), а также лента вопросов-ответов с постраничной навигацией.

Форма добавления будет стандартной, лента - через API.

  1. Создаём форму:
    1. Сервис -> Веб-формы -> Настройка форм -> Создать
    2. Имя, описание и т.п. - на ваш вкус
    3. Шаблон я использовал свой (необходимо было реализовать возможность "неотображения" вопроса в ленте).
      Вот код:
      1. <?=$FORM->ShowFormDescription("")?> <?=$FORM->ShowFormNote()?><?=$FORM->ShowFormErrors()?>
      2. <br />
      3.  
      4. <table style="padding-bottom: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; border-collapse: collapse; " border="0" cellspacing="0" cellpadding="0" width="100%">
      5. <tbody>
      6. <tr> <td style="padding-bottom: 15px; padding-right: 20px; " valign="top" width="15%" align="right"><?=$FORM->ShowInputCaption("NAME","")?></td> <td><?=$FORM->ShowInput('NAME')?> </td> </tr>
      7.  
      8. <tr> <td style="padding-bottom: 15px; padding-right: 20px; " valign="top" align="right"><?=$FORM->ShowInputCaption("CITY","")?></td> <td><?=$FORM->ShowInput('CITY')?></td> </tr>
      9.  
      10. <tr> <td style="padding-bottom: 15px; padding-right: 20px; " valign="top" align="right"><?=$FORM->ShowInputCaption("EMAIL","")?></td> <td><?=$FORM->ShowInput('EMAIL')?></td> </tr>
      11.  
      12. <tr> <td style="padding-bottom: 15px; padding-right: 20px; " valign="top" align="right"><?=$FORM->ShowInputCaption("MESS","")?></td> <td><?=$FORM->ShowInput('MESS')?> </td> </tr>
      13.  
      14. <tr><td style="padding-bottom: 15px; padding-right: 20px; " valign="top" align="right"><?=$FORM->ShowInput('PRIVATE')?></td><td valign="top"><?=$FORM->ShowInputCaption("PRIVATE","")?> </td></tr>
      15.  
      16. <tr><td style="padding-bottom: 15px; padding-right: 20px; " valign="top" align="right">Введите текст на картинке<?=$FORM->ShowRequired()?></td><td valign="top"><?=$FORM->ShowCaptchaImage()?>
      17. <br />
      18. <?=$FORM->ShowCaptchaField()?></td></tr>
      19. </tbody>
      20. </table>
      21.  
      22. <br />
      23. <?=$FORM->ShowSubmitButton("","")?>
  2. Добавляем вопросы на форму:

    Сообщение - textarea, "Я не хочу..." - checkbox, остальные - text

  3. Добавляем статус формы
  4. Создаём страничку с гостевой (в моём случае - /guest/index.php), вот код:
    1. <?
    2. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
    3. $APPLICATION->SetTitle("Жалобная книга");
    4. ?>
    5. <p>
    6. <?php /* Вставляем нашу формочку через компонент, не забываем поправить "WEB_FORM_ID", поставив свой ID формы */ ?>
    7. <?$APPLICATION->IncludeComponent("bitrix:form.result.new", "comments", Array(
    8. "WEB_FORM_ID" => "1",
    9. "IGNORE_CUSTOM_TEMPLATE" => "N",
    10. "USE_EXTENDED_ERRORS" => "N",
    11. "SEF_MODE" => "N",
    12. "SEF_FOLDER" => "/guest/",
    13. "CACHE_TYPE" => "N",
    14. "CACHE_TIME" => "3600",
    15. "LIST_URL" => "",
    16. "EDIT_URL" => "",
    17. "SUCCESS_URL" => "",
    18. "CHAIN_ITEM_TEXT" => "",
    19. "CHAIN_ITEM_LINK" => "",
    20. "VARIABLE_ALIASES" => array(
    21. "WEB_FORM_ID" => "WEB_FORM_ID",
    22. "RESULT_ID" => "RESULT_ID",
    23. )
    24. )
    25. );?></p>
    26.  
    27. <?php
    28. $f = array( );
    29.  
    30. if ( CModule::IncludeModule("form") ) {
    31.  
    32. /* Получаем ленту сообщений, единичка - ID нашей формы */
    33. CForm::GetResultAnswerArray(
    34. 1,
    35. $f,
    36. $f,
    37. $answers,
    38. array(
    39.  
    40. )
    41. );
    42.  
    43. if ( count( $answers ) ) {
    44. $rez = array( );
    45. foreach ( $answers as $id => $f ) {
    46. $x = CFormResult::GetByID( $id );
    47. if ( $x && ($x = $x->GetNext()) && ($d = date_parse( $x['DATE_CREATE'] )) ) {
    48.  
    49. $x = array( 'DATE_CREATE' => date(
    50. 'd.m.Y H:i:s',
    51. (mktime(
    52. $d['hour'],
    53. $d['minute'],
    54. $d['second'],
    55. $d['month'],
    56. $d['day'],
    57. $d['year']
    58. ) + 7*60*60)
    59. ) );
    60.  
    61. foreach ( $f as $s => $v ) {
    62. $v = $v[0];
    63.  
    64. $x[ $s ] = ( $v['VARNAME'] == 'PRIVATE' ? $v['VALUE'] : $v["USER_TEXT"] );
    65. }
    66.  
    67. if ( ! $x['PRIVATE'] )
    68. $rez[ $id ] = $x;
    69. }
    70. }
    71.  
    72. /* Сортировать будем DESC по ID */
    73. krsort( $rez );
    74.  
    75. $p = $_GET['p'] > 0 ? $_GET['p'] : 1;
    76. $onP = 10; // количество вопросов в ленте на странице
    77. $elz = count ( $rez );
    78.  
    79. if ( $elz > $onP ) {
    80. $rez = array_slice( $rez, ( $p > 1 ? ($p * $onP - $onP) : 0 ), $onP, 1 );
    81. }
    82.  
    83. /* Выводим ленту */
    84. echo '<h2>Лента сообщений</h2>';
    85. foreach ( $rez as $v ) {
    86. echo '<p><b>'.$v["NAME"].'</b>'
    87. . ( $v['CITY'] ? ' (' . $v["CITY"] . ')' : '' ) . '<br />';
    88. echo '<span style="color:#aaa">'.$v["DATE_CREATE"].'</span><br />';
    89. echo
    90. str_replace(
    91. array(
    92. '<r>',
    93. '</r>'
    94. ),
    95. array(
    96. '<p class="reply">',
    97. '</p>'
    98. ),
    99. $v["MESS"]
    100. )
    101. . '<div class="line_1" style="margin: 5px 0px 0px 0px; padding: 1px;"></div></p>';
    102. }
    103.  
    104. /* Выводим постраничную навигацию */
    105. if ( $elz > $onP ) {
    106. $pages = ceil( $elz / $onP );
    107. $rez = array();
    108. foreach ( range( 1, $pages ) as $v ) {
    109. $rez[] = $p == $v
    110. ? "<b>$v</b>"
    111. : "<a href='?p=$v'>$v</a>";
    112. }
    113. echo '<p><font class="text"> ' . ($p * $onP - $onP + 1) . ' - ' . ( $p * $onP > $elz ? $elz : $p * $onP ) . ' из ' . $elz . '<br></font>
    114. <font class="text">
    115. Страницы: ' . join( ' ', $rez ) . '
    116. </font></p>';
    117. }
    118. }
    119.  
    120. }
    121. ?>
    122. <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
    В коде есть комментарии, не забудьте отредактировать под себя.

  5. Ключевой момент - ответы на вопросы
    1. Заходим в результаты формы
    2. Заходим в редактирование вопроса, на который нужно дать ответ. В тегах <r><r> Вводим ответ

  6. Добавляем css-правило и радуемся жизни :)
    1. p.reply {
    2. color: #C2097F;
    3. /* font-family: arial;
    4. font-size: 0.8em; */
    5. margin:10px 0 10px 30px;
    6. }

Комментариев нет:

Отправить комментарий