Просмотров: 5309 (Статистика ведётся с 06.02.2017)
Роберт Басыров
Сложность урока:
4 уровень - сложно, требуется сосредоточится, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в редакциях:
Старт

Настраиваем вывод данных

Интерфейс главной страницы раздела со списком вопросов создается с помощью компонента Список результатов. Но разместить и настроить компонент - этого мало, вам предстоит ещё настроить вывод данных, то есть изменить шаблон компонента.


Размещение компонента

Откройте страницу Вопрос - ответ на редактирование и в теле страницы разместите компонент Нужный компонент переносится на страницу в визуальном редакторе.


Подробнее...
Список результатов:

Настройте параметры компонента:

  • В поле ID веб-формы укажите форму Вопрос-ответ.
  • Поле Страница просмотра результата оставьте пустым, оно использоваться не будет.
  • В поле Страница редактирования результата вводите название страницы составления ответа - answer.php.
  • В поле Страница добавления результата указывате название страницы заполнения формы - ask_question.php.
  • Опцию Показать дополнительные поля веб-формы отметьте, чтобы на странице отображались ответы на вопросы.
  • Опцию Показать текущий статус результата снимите, т.к. эта информация использоваться не будет.

Результат:

Штатный внешний вид врядли подойдёт под дизайн вашего сайта. Отредактируйте шаблон компонента, чтобы изменить внешний вид выводимой информации.


Редактирование шаблона компонента

Скопируйте шаблон Самый простой способ - с помощью команды Копировать шаблон компонента (при включённом режиме Правка)



После копирования шаблон можно изменять и, после изменения, применить его к компоненту в настройках компонента.
компонента Список результатов (bitrix:form.result.list). Откроется форма копирования шаблона компонента. Укажите название нового шаблона и шаблон сайта, в который копировать шаблон компонента. Отметьте опции Применить новый шаблон компонента и Перейти к редактированию шаблона, чтобы сразу новый шаблон использовался в компоненте и открылась форма редактирования шаблона.

После сохранения откроется окно для редактирования шаблона компонента.

Сначала отредактируем ту часть, которая отвечает за вывод формы фильтра. В фильтре оставим только следующие поля:

  • дату создания вопроса (хранится в переменной FORM_F_DATE_CREATE);
  • вопросы формы Фамилия, имя, отчество и Вопрос, а также поле Ответ, которые хранятся в arrFORM_FILTER (при создании этих вопросов и поля были выполнены соответствующие настройки на закладке Фильтр).

Заменяем код таблицы формы фильтра на следующий:

<table class="form-filter-table data-table">
	<thead>
		<tr>
			<th colspan="2"> </th>
		</tr>
	</thead>
	<tbody>
		<?
		if (strlen($arResult["str_error"]) > 0)
		{
		?>
		<tr>
			<td class="errortext" colspan="2"><?=$arResult["str_error"]?></td>
		</tr>
		<?
		} // endif (strlen($str_error) > 0)
		?>
		<tr>
			<td><?=GetMessage("FORM_F_DATE_CREATE")." (".CSite::GetDateFormat("SHORT")."):"?></td>
			<td><?=CForm::GetDateFilter("date_create", "form1", "Y", "", "")?></td>
		</tr>

		<?
		if (is_array($arResult["arrFORM_FILTER"]) && count($arResult["arrFORM_FILTER"])>0)
		{
			foreach ($arResult["arrFORM_FILTER"] as $arrFILTER)
			{
				$prev_fname = "";

				foreach ($arrFILTER as $arrF)
				{
					if ($arParams["SHOW_ADDITIONAL"] == "Y" || $arrF["ADDITIONAL"] != "Y")
					{
						$i++;
						if ($arrF["SID"]!=$prev_fname)
						{
							if ($i>1)
							{
							?>
							</td>
							</tr>
							<?
							} //endif($i>1);
							?>
		<tr>
			<td>
				<?=$arrF["FILTER_TITLE"] ? $arrF['FILTER_TITLE'] : $arrF['TITLE']?>
				<?=($arrF["FILTER_TYPE"]=="date" ? " (".CSite::GetDateFormat("SHORT").")" : "")?>
			</td>
			<td>
			<?
						} //endif ($fname!=$prev_fname) ;
						?>
						<?
						switch($arrF["FILTER_TYPE"]){
							case "text":
								echo CForm::GetTextFilter($arrF["FID"]);
								break;
							case "date":
								echo CForm::GetDateFilter($arrF["FID"]);
								break;
							case "integer":
								echo CForm::GetNumberFilter($arrF["FID"]);
								break;
							case "dropdown":
								echo CForm::GetDropDownFilter($arrF["ID"], $arrF["PARAMETER_NAME"], $arrF["FID"]);
								break;
							case "exist":
							?>
								<?=CForm::GetExistFlagFilter($arrF["FID"])?>
								<?=GetMessage("FORM_F_EXISTS")?>
							<?
								break;
						} // endswitch
						?>
						<?
						if ($arrF["PARAMETER_NAME"]=="ANSWER_TEXT")
						{
						?>
				 [<span class='form-anstext'>...</span>]
						<?
						}
						elseif ($arrF["PARAMETER_NAME"]=="ANSWER_VALUE")
						{
						?>
				 (<span class='form-ansvalue'>...</span>)
						<?
						}
						?>
				<br />
						<?
						$prev_fname = $arrF["SID"];
					} //endif (($arrF["ADDITIONAL"]=="Y" && $SHOW_ADDITIONAL=="Y") || $arrF["ADDITIONAL"]!="Y");

				} // endwhile (list($key, $arrF) = each($arrFILTER));

			} // endwhile (list($key, $arrFILTER) = each($arrFORM_FILTER));
		} // endif(is_array($arrFORM_FILTER) && count($arrFORM_FILTER)>0);
		?></td>
		</tr>
	</tbody>
	<tfoot>
		<tr>
			<th colspan="2">
				<input type="submit" name="set_filter" value="<?=GetMessage("FORM_F_SET_FILTER")?>" /><input type="hidden" name="set_filter" value="Y" />  <input type="submit" name="del_filter" value="<?=GetMessage("FORM_F_DEL_FILTER")?>" />
			</th>
		</tr>
	</tfoot>
</table>

Отредактируем ссылку Заполнить форму >>. Для этого в строке:

<p>
<b><a href="<?=$arParams["NEW_URL"]?><?=$arParams["SEF_MODE"] != "Y" ? (strpos($arParams["NEW_URL"], "?") === false ? "?" : "&")."WEB_FORM_ID=".$arParams["WEB_FORM_ID"] : ""?>"><?=GetMessage("FORM_ADD")?>  >></a></b>
</p>

параметр FORM_ADD заменяем на FORM_NEW_QUESTION. После чего в языковом файле /bitrix/templates/.default/components/bitrix/form.result.list/qa_template/lang/ru/template.php добавляем следующее сообщение:

$MESS ['FORM_NEW_QUESTION'] = "Задать свой вопрос";

Функции OnSelectAll_ и OnDelete_ можно удалить, поскольку в коде для нашей формы списка вопросов и ответов они использоваться не будут.

Теперь можно приступать к редактированию формы списка вопросов и ответов.

Для списка вопросов добавим механизм постраничной навигации, чтобы страница не была очень большой. В связи с этим нам потребуется параметр постраничной навигации, определяющий количество вопросов на одной странице. Также нам еще необходимо знать идентификатор статуса Ответ. Мы не будем усложнять задачу и зададим эти параметры явно в шаблоне компонента:

$status = "4";   //в нашем пример идентификатор статуса Ответ равен 4;
$ques_count = "10";  //параметр постраничной навигации;

Примечание: вы можете определить настройку этих параметров через параметры компонента.

Форма вопросов и ответов будет представлять из себя таблицу, в которой будут отображаться:

  • вопрос;
  • ответ;
  • дата создания вопроса;
  • фамилия, имя, отчество пользователя, создавшего вопрос;
  • ссылки Ответить на вопрос и Удалить вопрос с учетом прав доступа пользователей к системе Вопрос-ответ.

Поэтому код формы делаем следующим:

<form name="rform_<?=$arResult["filter_id"]?>" method="post" action="<?=POST_FORM_ACTION_URI?>#nav_start">
	<input type="hidden" name="WEB_FORM_ID" value="<?=$arParams["WEB_FORM_ID"]?>" />
	<?=bitrix_sessid_post()?>

	<?
	if ($arResult["res_counter"] > 0 && $arParams["SHOW_STATUS"] == "Y" && $arParams["F_RIGHT"] >= 15)
	{
	?>
	<p><input type="submit" name="save" value="<?=GetMessage("FORM_SAVE")?>" /><input type="hidden" name="save" value="Y" /> <input type="reset" value="<?=GetMessage("FORM_RESET")?>" /></p>
	<?
	} //endif(intval($res_counter)>0 && $SHOW_STATUS=="Y" && $F_RIGHT>=15);
	?>
	<p>
	<?=$arResult["pager"]?>
	</p>

<?

if(count($arResult["arrResults"]) > 0)
{
	$arPerm = CFormStatus::GetPermissions($status);
	$rsContent = new CDBResult;
	$rsContent -> InitFromArray($arResult["arrResults"]);
	$rsContent -> NavStart($ques_count);
	$j=0;
	?>
	<table class="data-table form-table">
	<?
	while ($arRes=$rsContent->Fetch())
	{
		$j++;
		$user_date = $arRes["DATE_CREATE"];
		$res_id=$arRes["ID"];
		$arAns = CFormResult::GetDataByID($res_id, array());
		if ($j>1)
			{
			?>
				<tr><td colspan="3" class="form-results-delimiter"> </td></tr>
			<?
			} 
			?>
		<tr>
		<td><b><?=$arAns["text"][0]["TITLE"]?></b></td><td><?=$arAns["text"][0]["USER_TEXT"]?></td>
		<td rowspan="2"><b><?=substr($user_date,0,10)."";?></b><br/><b><?=$arAns["name"][0]["USER_TEXT"]?></b>
			<br/>
			<?
			if ($arRes["STATUS_ID"]!=$status && in_array("MOVE", $arPerm) || $USER->IsAdmin())
				{
				$href = $arParams["SEF_MODE"] == "Y" ? str_replace("#RESULT_ID#", $arRes["ID"], $arParams["EDIT_URL"]) : $arParams["EDIT_URL"].(strpos($arParams["EDIT_URL"], "?") === false ? "?" : "&")."RESULT_ID=".$arRes["ID"]."&WEB_FORM_ID=".$arParams["WEB_FORM_ID"];
				?>
				[ <a title="<?=GetMessage("FORM_EDIT_ALT")?>" href="<?=$href?>"><?=GetMessage("FORM_EDIT")?></a> ]
				<?
				}
				?>
			<br/>
			<?
			if ($USER->IsAdmin())
				{
				$href = $arParams["LIST_URL"].(strpos($arParams["LIST_URL"], "?") === false ? "?" : "&").($arParams["SEF_MODE"] == "Y" ? "" : "WEB_FORM_ID=".$arParams["WEB_FORM_ID"]."&")."del_id=".$arRes["ID"]."&".bitrix_sessid_get()."#nav_start";
				?>[ <a title="<?=GetMessage("FORM_DELETE_ALT")?>" href="javascript:if(confirm('<?=GetMessage("FORM_CONFIRM_DELETE")?>')) window.location='<?=$href?>'"><?=GetMessage("FORM_DELETE")?></a> ]
				<?
				}
				?>
		</td>
		</tr>
		<tr>
			<?
		if ($arRes["STATUS_ID"]!=$status)
			{
			?>
		<td colspan="2"><i><?=GetMessage("FORM_NEW_ANSWER")?></i></td>
		<?
			}
		else
			{
		?>
		<td><b><?=$arAns["our_answer"][0]["TITLE"]?></b></td>
		<td><?=$arAns["our_answer"][0]["USER_TEXT"]?></td>
		<?
			}
		?>
		</tr>
	<?
	}
	?>
	</table>
<br />
	<?
echo $rsContent->NavPrint('Вопросы');
}
?>
</form>

Важно! Встречающиеся в коде name, text и our_answer - это символьные идентификаторы вопроса Фамилия, имя, отчество, вопроса Вопрос и поля Ответ.

Для используемого параметра FORM_NEW_ANSWER необходимо в языковом файле /bitrix/templates/.default/components/bitrix/form.result.list/qa_template/lang/ru/template.php добавить следующее сообщение:

$MESS ['FORM_NEW_ANSWER'] = "Вопрос ожидает ответа";

А для параметров FORM_EDIT, FORM_EDIT_ALT, FORM_DELETE_ALT и FORM_DELETE отредактировать их языковые сообщения:

$MESS ['FORM_EDIT_ALT'] = "Дать ответ на вопрос";
$MESS ['FORM_EDIT'] = "Ответить на вопрос";
$MESS ['FORM_DELETE_ALT'] = "Удалить вопрос";
$MESS ['FORM_DELETE'] = "Удалить вопрос";

В результате после сохранения шаблона и добавления нескольких вопросов главная страница системы Вопрос-ответ будет представлена в следующем виде для обычных пользователей:

Причем для авторизованных создателей вопросов будут отображаться и те вопросы, которые еще ожидают ответа.

Пользователям группы Модератор системы "Вопрос-ответ" дополнительно в списке будут отображаться все неотвеченные вопросы со ссылкой Ответить на вопрос.

Администратору сайта всегда доступны все вопросы. По ссылке Ответить на вопрос он может дать ответ на новый вопрос или изменить уже существующий ответ, а по ссылке Удалить вопрос - удалить любой вопрос.


3


Курсы разработаны в компании «1С-Битрикс»