Bitrix feedback. Как добавить дополнительные поля на форму обратной связи

18.03.2020

Как не странно, но в компоненте для создания форм (main.feedback) в Bitrix, нет настроек позволяющих добавить дополнительные поля.

В данной статье я опишу минимально необходимые действия для добавление новых полей.

  • Сначала нам нужно сделать копию компонента, для этого копируем папку компонента /bitrix/components/bitrix/main.feedback/, например, в /components/so/main.feedback/ (so произвольное название.)

  • Далее в файле component.php, для каждого поля нужно добавить проверку на заполнение (если поле обязательное), передать поле в почтовый шаблон, и т.д.

    По сути весь файл для этих проверок и служит, поэтому описывать все не буду, проще самим посмотреть, на примере поля user_phone

    component.php (Download)

     <?php
    if(!defined("B_PROLOG_INCLUDED")||B_PROLOG_INCLUDED!==true)die();
    
    /**
     * Bitrix vars
     *
     * @var array $arParams
     * @var array $arResult
     * @var CBitrixComponent $this
     * @global CMain $APPLICATION
     * @global CUser $USER
     */
    
    $arResult["PARAMS_HASH"] = md5(serialize($arParams).$this->GetTemplateName());
    
    $arParams["USE_CAPTCHA"] = (($arParams["USE_CAPTCHA"] != "N" && !$USER->IsAuthorized()) ? "Y" : "N");
    $arParams["EVENT_NAME"] = trim($arParams["EVENT_NAME"]);
    if($arParams["EVENT_NAME"] == '')
    	$arParams["EVENT_NAME"] = "FEEDBACK_FORM";
    $arParams["EMAIL_TO"] = trim($arParams["EMAIL_TO"]);
    if($arParams["EMAIL_TO"] == '')
    	$arParams["EMAIL_TO"] = COption::GetOptionString("main", "email_from");
    $arParams["OK_TEXT"] = trim($arParams["OK_TEXT"]);
    if($arParams["OK_TEXT"] == '')
    	$arParams["OK_TEXT"] = GetMessage("MF_OK_MESSAGE");
    
    if($_SERVER["REQUEST_METHOD"] == "POST" && $_POST["submit"] <> '' && (!isset($_POST["PARAMS_HASH"]) || $arResult["PARAMS_HASH"] === $_POST["PARAMS_HASH"]))
    {
    	$arResult["ERROR_MESSAGE"] = array();
    	if(check_bitrix_sessid())
    	{
    		if(empty($arParams["REQUIRED_FIELDS"]) || !in_array("NONE", $arParams["REQUIRED_FIELDS"]))
    		{
    			if((empty($arParams["REQUIRED_FIELDS"]) || in_array("NAME", $arParams["REQUIRED_FIELDS"])) && strlen($_POST["user_name"]) <= 1)
    				$arResult["ERROR_MESSAGE"][] = GetMessage("MF_REQ_NAME");		
    			if((empty($arParams["REQUIRED_FIELDS"]) || in_array("EMAIL", $arParams["REQUIRED_FIELDS"])) && strlen($_POST["user_email"]) <= 1)
    				$arResult["ERROR_MESSAGE"][] = GetMessage("MF_REQ_EMAIL");
    			if((empty($arParams["REQUIRED_FIELDS"]) || in_array("MESSAGE", $arParams["REQUIRED_FIELDS"])) && strlen($_POST["MESSAGE"]) <= 3)
    				$arResult["ERROR_MESSAGE"][] = GetMessage("MF_REQ_MESSAGE");
                    
    			if((empty($arParams["REQUIRED_FIELDS"]) || in_array("user_phone", $arParams["REQUIRED_FIELDS"])) && strlen($_POST["user_phone"]) <= 3)
    				$arResult["ERROR_MESSAGE"][] = 'Вы не заполнили телефон';
    
    			if((empty($arParams["REQUIRED_FIELDS"]) || in_array("user_street", $arParams["REQUIRED_FIELDS"])) && strlen($_POST["user_street"]) <= 10)
    				$arResult["ERROR_MESSAGE"][] = 'Вы не заполнили улицу';
    
    			if((empty($arParams["REQUIRED_FIELDS"]) || in_array("user_house", $arParams["REQUIRED_FIELDS"])) && strlen($_POST["user_email"]) <= 1)
    				$arResult["ERROR_MESSAGE"][] = 'Вы не заполнили дом';
                    
    			if((empty($arParams["REQUIRED_FIELDS"]) || in_array("user_porch", $arParams["REQUIRED_FIELDS"])) && strlen($_POST["user_email"]) <= 1)
    				$arResult["ERROR_MESSAGE"][] = 'Вы не заполнили подъезд';
                    
    			if((empty($arParams["REQUIRED_FIELDS"]) || in_array("user_apartment", $arParams["REQUIRED_FIELDS"])) && strlen($_POST["user_email"]) <= 1)
    				$arResult["ERROR_MESSAGE"][] = 'Вы не заполнили квартиру';
    
    		}
    		if(strlen($_POST["user_email"]) > 1 && !check_email($_POST["user_email"]))
    			$arResult["ERROR_MESSAGE"][] = GetMessage("MF_EMAIL_NOT_VALID");
    		if($arParams["USE_CAPTCHA"] == "Y")
    		{
    			include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/captcha.php");
    			$captcha_code = $_POST["captcha_sid"];
    			$captcha_word = $_POST["captcha_word"];
    			$cpt = new CCaptcha();
    			$captchaPass = COption::GetOptionString("main", "captcha_password", "");
    			if (strlen($captcha_word) > 0 && strlen($captcha_code) > 0)
    			{
    				if (!$cpt->CheckCodeCrypt($captcha_word, $captcha_code, $captchaPass))
    					$arResult["ERROR_MESSAGE"][] = GetMessage("MF_CAPTCHA_WRONG");
    			}
    			else
    				$arResult["ERROR_MESSAGE"][] = GetMessage("MF_CAPTHCA_EMPTY");
    
    		}			
    		if(empty($arResult["ERROR_MESSAGE"]))
    		{
    			$arFields = Array(
    				"AUTHOR" => $_POST["user_name"],
    				"AUTHOR_EMAIL" => $_POST["user_email"],
    				"user_phone" => $_POST["user_phone"],
    				"user_street" => $_POST["user_street"],
    				"user_house" => $_POST["user_house"],
    				"user_porch" => $_POST["user_porch"],
    				"user_apartment" => $_POST["user_apartment"],
    				"EMAIL_TO" => $arParams["EMAIL_TO"],
    				"TEXT" => $_POST["MESSAGE"],
    			);
    			if(!empty($arParams["EVENT_MESSAGE_ID"]))
    			{
    				foreach($arParams["EVENT_MESSAGE_ID"] as $v)
    					if(IntVal($v) > 0)
    						CEvent::Send($arParams["EVENT_NAME"], SITE_ID, $arFields, "N", IntVal($v));
    			}
    			else
    				CEvent::Send($arParams["EVENT_NAME"], SITE_ID, $arFields);
    
    			$_SESSION["MF_NAME"] = htmlspecialcharsbx($_POST["user_name"]);
    			$_SESSION["MF_EMAIL"] = htmlspecialcharsbx($_POST["user_email"]);
    			$_SESSION["MF_user_phone"] = htmlspecialcharsbx($_POST["user_phone"]);
    			$_SESSION["MF_user_street"] = htmlspecialcharsbx($_POST["user_street"]);
    			$_SESSION["MF_user_house"] = htmlspecialcharsbx($_POST["user_house"]);
    			$_SESSION["MF_user_porch"] = htmlspecialcharsbx($_POST["user_porch"]);
    			$_SESSION["MF_user_apartment"] = htmlspecialcharsbx($_POST["user_apartment"]);
    
    			LocalRedirect($APPLICATION->GetCurPageParam("success=".$arResult["PARAMS_HASH"], Array("success")));
    		}
    		
    		$arResult["MESSAGE"] = htmlspecialcharsbx($_POST["MESSAGE"]);
    		$arResult["AUTHOR_NAME"] = htmlspecialcharsbx($_POST["user_name"]);
    		$arResult["AUTHOR_EMAIL"] = htmlspecialcharsbx($_POST["user_email"]);
    		$arResult["user_phone"] = htmlspecialcharsbx($_POST["user_phone"]);
    		$arResult["user_street"] = htmlspecialcharsbx($_POST["user_street"]);
    		$arResult["user_house"] = htmlspecialcharsbx($_POST["user_house"]);
    		$arResult["user_porch"] = htmlspecialcharsbx($_POST["user_porch"]);
    		$arResult["user_apartment"] = htmlspecialcharsbx($_POST["user_apartment"]);
    	}
    	else
    		$arResult["ERROR_MESSAGE"][] = GetMessage("MF_SESS_EXP");
    }
    elseif($_REQUEST["success"] == $arResult["PARAMS_HASH"])
    {
    	$arResult["OK_MESSAGE"] = $arParams["OK_TEXT"];
    }
    
    if(empty($arResult["ERROR_MESSAGE"]))
    {
    	if($USER->IsAuthorized())
    	{
    		$arResult["AUTHOR_NAME"] = $USER->GetFormattedName(false);
    		$arResult["AUTHOR_EMAIL"] = htmlspecialcharsbx($USER->GetEmail());
    	}
    	else
    	{
    		if(strlen($_SESSION["MF_NAME"]) > 0)
    			$arResult["AUTHOR_NAME"] = htmlspecialcharsbx($_SESSION["MF_NAME"]);
    		if(strlen($_SESSION["MF_EMAIL"]) > 0)
    			$arResult["AUTHOR_EMAIL"] = htmlspecialcharsbx($_SESSION["MF_EMAIL"]);
                
    		if(strlen($_SESSION["MF_user_phone"]) > 0)
    			$arResult["user_phone"] = htmlspecialcharsbx($_SESSION["MF_user_phone"]);
    
    		if(strlen($_SESSION["MF_user_street"]) > 0)
    			$arResult["user_street"] = htmlspecialcharsbx($_SESSION["MF_user_street"]);
    
    		if(strlen($_SESSION["MF_user_house"]) > 0)
    			$arResult["user_house"] = htmlspecialcharsbx($_SESSION["MF_user_house"]);
    
    		if(strlen($_SESSION["MF_user_porch"]) > 0)
    			$arResult["user_porch"] = htmlspecialcharsbx($_SESSION["MF_user_porch"]);
    
    		if(strlen($_SESSION["MF_user_apartment"]) > 0)
    			$arResult["user_apartment"] = htmlspecialcharsbx($_SESSION["MF_user_apartment"]);
     
    	}
    }
    
    if($arParams["USE_CAPTCHA"] == "Y")
    	$arResult["capCode"] =  htmlspecialcharsbx($APPLICATION->CaptchaGetCode());
    
    $this->IncludeComponentTemplate();
    

  • Следующим шагом будет изменение вызова старого (родного) компонента битрикса на наш, с указанием новых необходимых для заполнения полей.

     
    <?$APPLICATION->IncludeComponent(
    	"so:main.feedback", 
    	".default", 
    	array(
    		"USE_CAPTCHA" => "Y",
    		"OK_TEXT" => "Спасибо, ваше сообщение принято.",
    		"EMAIL_TO" => "mbu-geu@mail.ru;penta26@yandex.ru;it-mbu@mail.ru",
    		//"EMAIL_TO" => "test@oddler.ru",
    		"REQUIRED_FIELDS" => array(
    			0 => "NAME",
    			1 => "EMAIL",
    			2 => "MESSAGE",
    			3 => "MESSAGE2",
    			4 => "user_phone",
    			5 => "user_street",
    			6 => "user_house",
    			7 => "user_porch",
    			8 => "user_apartment",
                
    		),
    		"EVENT_MESSAGE_ID" => array(
    		),
    		"COMPONENT_TEMPLATE" => ".default"
    	),
    	false
    );?>
    

  • Теперь поря добавить новые поля на форму, копируем шаблон компонента из /bitrix/templates/.default/components/so/main.feedback/.default/ в /bitrix/templates/ACTIVE_TEMPLATE/components/so/main.feedback/.default/ (где ACTIVE_TEMPLATE - имя нужного шаблона сайта).

    Пример кода с добавленными полями:

    • телефон - user_phone
    • Улица - user_street
    • Номер дома - user_house
    • Подъезд - user_porch
    • Квартира - user_apartment

    template.php (Download)

     <?
    if(!defined("B_PROLOG_INCLUDED")||B_PROLOG_INCLUDED!==true)die();
    /**
     * Bitrix vars
     *
     * @var array $arParams
     * @var array $arResult
     * @var CBitrixComponentTemplate $this
     * @global CMain $APPLICATION
     * @global CUser $USER
     */
    ?>
    <div class="mfeedback">
    <?if(!empty($arResult["ERROR_MESSAGE"]))
    {
    	foreach($arResult["ERROR_MESSAGE"] as $v)
    		ShowError($v);
    }
    if(strlen($arResult["OK_MESSAGE"]) > 0)
    {
    	?><div class="mf-ok-text"><?=$arResult["OK_MESSAGE"]?></div><?
    }
    ?>
    
    
    <form action="<?=POST_FORM_ACTION_URI?>" method="POST">
    <?=bitrix_sessid_post()?>
    	<div class="mf-name">
    		<div class="mf-text">
    			<?=GetMessage("MFT_NAME")?><?if(empty($arParams["REQUIRED_FIELDS"]) || in_array("NAME", $arParams["REQUIRED_FIELDS"])):?><span class="mf-req">*</span><?endif?>
    		</div>
    		<input type="text" name="user_name" value="<?=$arResult["AUTHOR_NAME"]?>">
    	</div>
    	<div class="mf-email">
    		<div class="mf-text">
    			<?=GetMessage("MFT_EMAIL")?><?if(empty($arParams["REQUIRED_FIELDS"]) || in_array("EMAIL", $arParams["REQUIRED_FIELDS"])):?><span class="mf-req">*</span><?endif?>
    		</div>
    		<input type="text" name="user_email" value="<?=$arResult["AUTHOR_EMAIL"]?>">
    	</div>
        
    	<div class="so_mf mf-phone">
    		<div class="mf-text">
    			Ваш телефон<?if(empty($arParams["REQUIRED_FIELDS"]) || in_array("user_phone", $arParams["REQUIRED_FIELDS"])):?><span class="mf-req">*</span><?endif?>
    		</div>
    		<input type="text" name="user_phone" value="<?=$arResult["user_phone"]?>">
    	</div>
        
    	<div class="so_mf mf-street">
    		<div class="mf-text">
    			Улица<?if(empty($arParams["REQUIRED_FIELDS"]) || in_array("user_street", $arParams["REQUIRED_FIELDS"])):?><span class="mf-req">*</span><?endif?>
    		</div>
    		<input type="text" name="user_street" value="<?=$arResult["user_street"]?>">
    	</div>
    <!--    
    телефон - user_phone
    Улица - user_street
    Номер дома - user_house
    Подъезд - user_porch
    Квартира - user_apartment
    -->
    	<div class="so_mf mf-house">
    		<div class="mf-text">
    			Номер дома<?if(empty($arParams["REQUIRED_FIELDS"]) || in_array("user_house", $arParams["REQUIRED_FIELDS"])):?><span class="mf-req">*</span><?endif?>
    		</div>
    		<input type="text" name="user_house" value="<?=$arResult["user_house"]?>">
    	</div>
        
        <div class="so_mf mf-street">
    		<div class="mf-text">
    			Подъезд<?if(empty($arParams["REQUIRED_FIELDS"]) || in_array("user_porch", $arParams["REQUIRED_FIELDS"])):?><span class="mf-req">*</span><?endif?>
    		</div>
    		<input type="text" name="user_porch" value="<?=$arResult["user_porch"]?>">
    	</div>
    
        <div class="so_mf mf-street">
    		<div class="mf-text">
    			Квартира<?if(empty($arParams["REQUIRED_FIELDS"]) || in_array("user_apartment", $arParams["REQUIRED_FIELDS"])):?><span class="mf-req">*</span><?endif?>
    		</div>
    		<input type="text" name="user_apartment" value="<?=$arResult["user_apartment"]?>">
    	</div>
        
        
    	<div class="mf-message">
    		<div class="mf-text">
    			<?=GetMessage("MFT_MESSAGE")?><?if(empty($arParams["REQUIRED_FIELDS"]) || in_array("MESSAGE", $arParams["REQUIRED_FIELDS"])):?><span class="mf-req">*</span><?endif?>
    		</div>
    		<textarea name="MESSAGE" rows="5" cols="40"><?=$arResult["MESSAGE"]?></textarea>
    	</div>
    
    	<?if($arParams["USE_CAPTCHA"] == "Y"):?>
    	<div class="mf-captcha">
    		<div class="mf-text"><?=GetMessage("MFT_CAPTCHA")?></div>
    		<input type="hidden" name="captcha_sid" value="<?=$arResult["capCode"]?>">
    		<img src="/bitrix/tools/captcha.php?captcha_sid=<?=$arResult["capCode"]?>" width="180" height="40" alt="CAPTCHA">
    		<div class="mf-text"><?=GetMessage("MFT_CAPTCHA_CODE")?><span class="mf-req">*</span></div>
    		<input type="text" name="captcha_word" size="30" maxlength="50" value="">
    	</div>
    	<?endif;?>
    	<input type="hidden" name="PARAMS_HASH" value="<?=$arResult["PARAMS_HASH"]?>">
    
    <p>
    	Нажимаю кнопку отправить, Вы соглашаетесь с <a target="_blank" href="http://mbugeu.ru/polzovatelskoe-soglashenie/">пользовательским соглашением</a>
    </p>
    
    	
    	<input type="submit" name="submit" value="<?=GetMessage("MFT_SUBMIT")?>">
        
    <p class="soAttention">
        <b>Внимание:</b> при указании недостоверных данных обращение рассмотрено не будет. 
    </p>
    
    </form>
    </div>

  • Также можно подправить и визуальную составляющую:

    style.css (Download)

     div.mfeedback {}
    div.mf-name, div.mf-email, div.mf-captcha, div.mf-message {width:80%; padding-bottom:0.4em;}
    div.mf-name input, div.mf-email input {width:60%;}
    div.mf-message textarea {width: 60%;}
    span.mf-req {color:red;}
    div.mf-ok-text {color:green; font-weight:bold; padding-bottom: 1em;}
    
    .soAttention {
        font-size: 18px;
    }
    
    .mfeedback .so_mf {
        width: 80%;
    }
    
    .mfeedback input {
        width: 60%;
    }
    
    

  • Финальным шагом будет добавление полей в семо почтовое сообщение. Для этого открываем в администартивном разделе сайта:
    Настройки - Настройки продукта - Почтовые сообшения - Почновые шаблоны
    и в списке нужно найти шаблон у которого Тип почтового события: Отправка сообщения через форму обратной связи [FEEDBACK_FORM

    Поля добавляются в формате:

    Телефон: #user_phone#
    Улица: #user_street#
    Номер дома: #user_house#
    Подъезд: #user_porch#
    Квартира: #user_apartment#
    


Категории: Bitrix CMS
Яндекс.Метрика