Добавить комментарии к статьям с помощью компонента iblock.element.add.form

С помощью компонента bitrix:iblock.element.add.form можно вывести форму добавления комментария в статье/новости/товаре с привязкой комментария к текущему элементу по id в свойстве.

Для начала создадим инфоблок "Комментарии" и добавим ему свойство "Связанная статья" с типом "Строка" и символьным кодом "ATT_ARTICLE".

В detail.php компонента статей в нужном месте выведем компонент:

<?
$ElementName = "";
$res = CIBlockElement::GetByID($ElementID);
if($ar_res = $res->GetNext())
$ElementName = $ar_res['NAME'];
$APPLICATION->IncludeComponent(
"bitrix:iblock.element.add.form",
"comments",
array(
"CUSTOM_TITLE_DATE_ACTIVE_FROM" => "",
"CUSTOM_TITLE_DATE_ACTIVE_TO" => "",
"CUSTOM_TITLE_DETAIL_PICTURE" => "",
"CUSTOM_TITLE_DETAIL_TEXT" => "",
"CUSTOM_TITLE_IBLOCK_SECTION" => "",
"CUSTOM_TITLE_NAME" => "",
"CUSTOM_TITLE_PREVIEW_PICTURE" => "",
"CUSTOM_TITLE_PREVIEW_TEXT" => "Ваш комментарий",
"CUSTOM_TITLE_TAGS" => "",
"DEFAULT_INPUT_SIZE" => "30",
"DETAIL_TEXT_USE_HTML_EDITOR" => "N",
"ELEMENT_ASSOC" => "CREATED_BY",
"ELEMENT_ASSOC_PROPERTY" => "1",
"GROUPS" => array(
0 => "2",
),
"IBLOCK_ID" => "6",
"IBLOCK_TYPE" => "simple",
"LEVEL_LAST" => "Y",
"LIST_URL" => "",
"MAX_FILE_SIZE" => "0",
"MAX_LEVELS" => "100000",
"MAX_USER_ENTRIES" => "100000",
"PREVIEW_TEXT_USE_HTML_EDITOR" => "N",
"PROPERTY_CODES" => array(
0 => "1",
1 => "PREVIEW_TEXT",
2 => "NAME",
),
"PROPERTY_CODES_REQUIRED" => array(
0 => "1",
1 => "PREVIEW_TEXT",
),
"RESIZE_IMAGES" => "N",
"SEF_MODE" => "N",
"STATUS" => "ANY",
"STATUS_NEW" => "NEW",
"USER_MESSAGE_ADD" => "",
"USER_MESSAGE_EDIT" => "",
"USE_CAPTCHA" => "N",
"BLOG_ELEMENT" => $ElementID,
"NAME" => $ElementName,
"COMPONENT_TEMPLATE" => "comments"
),
false
);?>

Где $ElementID - id текущего элемента, а $ElementName - его наименование.

Шаблон template.php comments комментариев:

<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */
$this->setFrameMode(false);

if (!empty($arResult["ERRORS"])):?>
<?ShowError(implode("<br />", $arResult["ERRORS"]))?>
<?endif;
if ($arResult["MESSAGE"] <> ''):?>
<?ShowNote($arResult["MESSAGE"])?>
<?endif?>
<form name="iblock_add" class="comment" action="<?=POST_FORM_ACTION_URI?>" method="post" enctype="multipart/form-data">
<?=bitrix_sessid_post()?>
<?if ($arParams["MAX_FILE_SIZE"] > 0):?><input type="hidden" name="MAX_FILE_SIZE" value="<?=$arParams["MAX_FILE_SIZE"]?>" /><?endif?>


<?if (is_array($arResult["PROPERTY_LIST"]) && !empty($arResult["PROPERTY_LIST"])):?>

<?foreach ($arResult["PROPERTY_LIST"] as $propertyID):?>
<div<?if($propertyID == 1):?> style="display: none;"<?endif;?>>
<?if($propertyID != "NAME"):?><p><?if (intval($propertyID) > 0):?><?=$arResult["PROPERTY_LIST_FULL"][$propertyID]["NAME"]?><?else:?><?=!empty($arParams["CUSTOM_TITLE_".$propertyID]) ? $arParams["CUSTOM_TITLE_".$propertyID] : GetMessage("IBLOCK_FIELD_".$propertyID)?><?endif?><?if(in_array($propertyID, $arResult["PROPERTY_REQUIRED"])):?><span class="starrequired">*</span><?endif?></p><?endif;?>

<?
if (intval($propertyID) > 0)
{
if (
$arResult["PROPERTY_LIST_FULL"][$propertyID]["PROPERTY_TYPE"] == "T"
&&
$arResult["PROPERTY_LIST_FULL"][$propertyID]["ROW_COUNT"] == "1"
)
$arResult["PROPERTY_LIST_FULL"][$propertyID]["PROPERTY_TYPE"] = "S";
elseif (
(
$arResult["PROPERTY_LIST_FULL"][$propertyID]["PROPERTY_TYPE"] == "S"
||
$arResult["PROPERTY_LIST_FULL"][$propertyID]["PROPERTY_TYPE"] == "N"
)
&&
$arResult["PROPERTY_LIST_FULL"][$propertyID]["ROW_COUNT"] > "1"
)
$arResult["PROPERTY_LIST_FULL"][$propertyID]["PROPERTY_TYPE"] = "T";
}
elseif (($propertyID == "TAGS") && CModule::IncludeModule('search'))
$arResult["PROPERTY_LIST_FULL"][$propertyID]["PROPERTY_TYPE"] = "TAGS";

if ($arResult["PROPERTY_LIST_FULL"][$propertyID]["MULTIPLE"] == "Y")
{
$inputNum = ($arParams["ID"] > 0 || count($arResult["ERRORS"]) > 0) ? count($arResult["ELEMENT_PROPERTIES"][$propertyID]) : 0;
$inputNum += $arResult["PROPERTY_LIST_FULL"][$propertyID]["MULTIPLE_CNT"];
}
else
{
$inputNum = 1;
}

if($arResult["PROPERTY_LIST_FULL"][$propertyID]["GetPublicEditHTML"])
$INPUT_TYPE = "USER_TYPE";
else
$INPUT_TYPE = $arResult["PROPERTY_LIST_FULL"][$propertyID]["PROPERTY_TYPE"];

switch ($INPUT_TYPE):
case "T":
for ($i = 0; $i<$inputNum; $i++)
{

if ($arParams["ID"] > 0 || count($arResult["ERRORS"]) > 0)
{
$value = intval($propertyID) > 0 ? $arResult["ELEMENT_PROPERTIES"][$propertyID][$i]["VALUE"] : $arResult["ELEMENT"][$propertyID];
}
elseif ($i == 0)
{
$value = intval($propertyID) > 0 ? "" : $arResult["PROPERTY_LIST_FULL"][$propertyID]["DEFAULT_VALUE"];
}
else
{
$value = "";
}
?>
<textarea class="field comment-field" cols="<?=$arResult["PROPERTY_LIST_FULL"][$propertyID]["COL_COUNT"]?>" rows="8" name="PROPERTY[<?=$propertyID?>][<?=$i?>]"><?=$value?></textarea>
<?
}
break;

case "S":
case "N":
for ($i = 0; $i<$inputNum; $i++)
{
if ($arParams["ID"] > 0 || count($arResult["ERRORS"]) > 0)
{
$value = intval($propertyID) > 0 ? $arResult["ELEMENT_PROPERTIES"][$propertyID][$i]["VALUE"] : $arResult["ELEMENT"][$propertyID];
}
elseif ($i == 0)
{
$value = intval($propertyID) <= 0 ? "" : $arResult["PROPERTY_LIST_FULL"][$propertyID]["DEFAULT_VALUE"];

}
else
{
$value = "";
}
?>

<input type="<?if($propertyID == 1 || $propertyID == "NAME"):?>hidden<?else:?>text<?endif;?>" class="field" name="PROPERTY[<?=$propertyID?>][<?=$i?>]" size="<?=$arResult["PROPERTY_LIST_FULL"][$propertyID]["COL_COUNT"]; ?>" value="<?if($propertyID == 1):?><?=$arParams["BLOG_ELEMENT"]?><?elseif($propertyID == "NAME"):?><?=$arParams["NAME"]?> Комментарий <?=time();?> <?else:?><?=$value?><?endif;?>" /><?
if($arResult["PROPERTY_LIST_FULL"][$propertyID]["USER_TYPE"] == "DateTime"):?><?
$APPLICATION->IncludeComponent(
'bitrix:main.calendar',
'',
array(
'FORM_NAME' => 'iblock_add',
'INPUT_NAME' => "PROPERTY[".$propertyID."][".$i."]",
'INPUT_VALUE' => $value,
),
null,
array('HIDE_ICONS' => 'Y')
);
?><br /><small><?=GetMessage("IBLOCK_FORM_DATE_FORMAT")?><?=FORMAT_DATETIME?></small><?
endif
?><?
}
break;



endswitch;?>

</div>
<?endforeach;?>
<?if($arParams["USE_CAPTCHA"] == "Y" && $arParams["ID"] <= 0):?>

<?=GetMessage("IBLOCK_FORM_CAPTCHA_TITLE")?>

<input type="hidden" name="captcha_sid" value="<?=$arResult["CAPTCHA_CODE"]?>" />
<img src="/bitrix/tools/captcha.php?captcha_sid=<?=$arResult["CAPTCHA_CODE"]?>" width="180" height="40" alt="CAPTCHA" />



<?=GetMessage("IBLOCK_FORM_CAPTCHA_PROMPT")?><span class="starrequired">*</span>:
<input type="text" name="captcha_word" maxlength="50" value="">

<?endif?>
<?endif?>
<input type="submit" class="btn" name="iblock_submit" value="<?=GetMessage("IBLOCK_FORM_SUBMIT")?>" />
<?if ($arParams["LIST_URL"] <> ''):?>
<input type="submit" class="btn" name="iblock_apply" value="<?=GetMessage("IBLOCK_FORM_APPLY")?>" />
<input
type="button"
name="iblock_cancel"
value="<? echo GetMessage('IBLOCK_FORM_CANCEL'); ?>"
onclick="location.href='<? echo CUtil::JSEscape($arParams["LIST_URL"])?>';"
>
<?endif?>
</form>
где $propertyID == 1 - это id свойства ATT_ARTICLE выводимого на редактирование и обязательного для заполнения, а NAME - название будущего комментария (элемента). Соответственно, поле ATT_ARTICLE автоматически заполняется из значения $arParams["BLOG_ELEMENT"], а NAME - из $arParams["NAME"] и текущего времени с помощью функции time(). 
Таким образом, при заполнении поля:

comment.jpg

формируется неактивный элемент-комментарий:

comment_potato.jpg



Copyright ©2022