Создаём в Bitrix пользовательский тип свойства "привязка к элементам с описание"

  • 2019-11-27
  • Дмитрий М.
  • 958

Создаём в Bitrix пользовательский тип свойства "привязка к элементам с описание"

<p> Иногда при разработке приходиться сталкиваться с задачей, когда у товара например есть "опции" цену которой необходимо указать <b>в описании товара</b> или "составные части" количество которых необходимо отразить. Как правило зависимости учитываются при помощи свойства "<b>Привязка к элементам</b>" и в таких случаях хорошо использовать описание для значения свойства, как у строковых свойств. </p> <p> Решить задачу можно созданием пользовательского типа свойств - <b>Привязка к элементам с описанием</b>. </p> <p> Для этого создадим файл в папке <b>/bitrix/php_interface/</b> ( или <b>/local/php_interface/</b>) <b><i>elementwithdescription.php</i></b> </p> <pre class="line-numbers"><code class="language-php">class ElementWithDescription { function GetIBlockPropertyDescription() { return array( "PROPERTY_TYPE" =&gt; "E", // Прототип типа свойства - привязка к элементам "USER_TYPE" =&gt; "ElementWithDescription", "DESCRIPTION" =&gt; "Привязка к элементам с описанием", //Название нового типа свойства 'GetPropertyFieldHtml' =&gt; array(__CLASS__, 'GetPropertyFieldHtml'), "ConvertToDB" =&gt; array(__CLASS__,"ConvertToDB"), "ConvertFromDB" =&gt; array(__CLASS__,"ConvertFromDB"), ); } function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName) { $value["DESCRIPTION"] = unserialize($value["DESCRIPTION"]); $arItem = Array( "ID" =&gt; 0, "IBLOCK_ID" =&gt; 0, "NAME" =&gt; "" ); if(intval($value["VALUE"]) &gt; 0) { $arFilter = Array( "ID" =&gt; intval($value["VALUE"]), "IBLOCK_ID" =&gt; $arProperty["LINK_IBLOCK_ID"], ); $arItem = \CIBlockElement::GetList(Array(), $arFilter, false, false, Array("ID", "IBLOCK_ID", "NAME"))-&gt;Fetch(); } $html = '&lt;input name="'.$strHTMLControlName["VALUE"].'" id="'.$strHTMLControlName["VALUE"].'" value="'.htmlspecialcharsex($value["VALUE"]).'" size="5" type="text"&gt;'; $html .= ' &lt;span id="sp_'.md5($strHTMLControlName["VALUE"]).'_'.$key.'"&gt;'.$arItem["NAME"].'&lt;/span&gt;'; $html .= '&lt;input type="button" value="Выбрать" onclick="jsUtils.OpenWindow(\'/bitrix/admin/iblock_element_search.php?lang='.LANG.'&amp;IBLOCK_ID='.$arProperty["LINK_IBLOCK_ID"].'&amp;n='.$strHTMLControlName["VALUE"].'\', 600, 500);"&gt;'; $html .= ' Количество:&lt;input type="text" id="quan" name="'.$strHTMLControlName["DESCRIPTION"].'" value="'.htmlspecialcharsex($value["DESCRIPTION"]).'"&gt;'; return $html; } function GetAdminListViewHTML($arProperty, $value, $strHTMLControlName) { return; } function ConvertToDB($arProperty, $value) { $return = false; if( is_array($value) &amp;&amp; array_key_exists("VALUE", $value) &amp;&amp; ($value['VALUE'] &gt; 0)) { $return = array( "VALUE" =&gt; serialize($value["VALUE"]), "DESCRIPTION" =&gt; serialize($value["DESCRIPTION"]), ); } return $return; } function ConvertFromDB($arProperty, $value) { $return = false; if(!is_array($value["VALUE"])) { $return = array( "VALUE" =&gt; unserialize($value["VALUE"]), ); } if(!is_array($value["DESCRIPTION"])) { $return["DESCRIPTION"] = unserialize($value["DESCRIPTION"]); } if ($return['VALUE'] &gt; 0): return $return; endif; } } </code> </pre> <p> Подключим созданный нами класс в файле <b>/bitrix/php_interface/init.php</b> ( или <b>/local/php_interface/init.php</b>) для этого добавим следующие строки: </p> <pre class="line-numbers"><code class="language-php"> include_once(__DIR__.'/elementwithdescription.php'); // Добавим обработчик события и добавим наш пользовательский класс AddEventHandler('iblock', 'OnIBlockPropertyBuildList', ['ElementWithDescription', 'GetIBlockPropertyDescription']); </code> </pre> <p> Теперь при выборе типов свойств при создании свойства нам доступен созданный нами новый тип свойства: </p> <div class="picture"> <img width="100%" alt="Пользовательский тип свойства с описанием" src="/upload/medialibrary/84d/84d059d13e637ef9f59b82108f931476.png" height="auto" title="Пользовательский тип свойства с описанием"> </div>

10.12.2019 14:07:28

Тип свойст.png

Тип свойст.png

Создаём в Bitrix пользовательский тип свойства &amp;quot;привязка к элементам с описание&amp;quot;

Иногда при разработке приходиться сталкиваться с задачей, когда у товара например есть "опции" цену которой необходимо указать в описании товара или "составные части" количество которых необходимо отразить. Как правило зависимости учитываются при помощи свойства "Привязка к элементам" и в таких случаях хорошо использовать описание для значения свойства, как у строковых свойств. 

Решить задачу можно созданием пользовательского типа свойств - Привязка к элементам с описанием.

Иногда при разработке приходиться сталкиваться с задачей, когда у товара например есть "опции" цену которой необходимо указать в описании товара или "составные части" количество которых необходимо отразить. Как правило зависимости учитываются при помощи свойства "Привязка к элементам" и в таких случаях хорошо использовать описание для значения свойства, как у строковых свойств.

Решить задачу можно созданием пользовательского типа свойств - Привязка к элементам с описанием.

Для этого создадим файл в папке /bitrix/php_interface/ ( или /local/php_interface/) elementwithdescription.php

class ElementWithDescription
{
    function GetIBlockPropertyDescription()
    {
        return array(
            "PROPERTY_TYPE" => "E", // Прототип типа свойства - привязка к элементам
            "USER_TYPE" => "ElementWithDescription",
            "DESCRIPTION" => "Привязка к элементам с описанием", //Название нового типа свойства
            'GetPropertyFieldHtml' => array(__CLASS__, 'GetPropertyFieldHtml'),
            "ConvertToDB" => array(__CLASS__,"ConvertToDB"),
            "ConvertFromDB" => array(__CLASS__,"ConvertFromDB"),
        );
    }

    function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
    {
        $value["DESCRIPTION"] = unserialize($value["DESCRIPTION"]);

        $arItem = Array(
            "ID" => 0,
            "IBLOCK_ID" => 0,
            "NAME" => ""
        );

        if(intval($value["VALUE"]) > 0)
        {
            $arFilter = Array(
                "ID" => intval($value["VALUE"]),
                "IBLOCK_ID" => $arProperty["LINK_IBLOCK_ID"],
            );
            $arItem = \CIBlockElement::GetList(Array(), $arFilter, false, false, Array("ID", "IBLOCK_ID", "NAME"))->Fetch();
        }

        $html = '<input name="'.$strHTMLControlName["VALUE"].'" id="'.$strHTMLControlName["VALUE"].'" value="'.htmlspecialcharsex($value["VALUE"]).'" size="5" type="text">';
        $html .= ' <span id="sp_'.md5($strHTMLControlName["VALUE"]).'_'.$key.'">'.$arItem["NAME"].'</span>';
        $html .= '<input type="button" value="Выбрать" onclick="jsUtils.OpenWindow(\'/bitrix/admin/iblock_element_search.php?lang='.LANG.'&IBLOCK_ID='.$arProperty["LINK_IBLOCK_ID"].'&n='.$strHTMLControlName["VALUE"].'\', 600, 500);">';
        $html .= ' Количество:<input type="text" id="quan" name="'.$strHTMLControlName["DESCRIPTION"].'" value="'.htmlspecialcharsex($value["DESCRIPTION"]).'">';
        return  $html;
    }

    function GetAdminListViewHTML($arProperty, $value, $strHTMLControlName)
    {
        return;
    }

    function ConvertToDB($arProperty, $value)
    {
        $return = false;
        
        if( is_array($value) && array_key_exists("VALUE", $value) && ($value['VALUE'] > 0))
        {
            $return = array(
                "VALUE" => serialize($value["VALUE"]),
                "DESCRIPTION" => serialize($value["DESCRIPTION"]),
            );
        }    
        
        return $return; 
    }
        
    function ConvertFromDB($arProperty, $value)
    {
        $return = false;

        if(!is_array($value["VALUE"]))
        {
            $return = array(
                "VALUE" => unserialize($value["VALUE"]),
            );
        }
            
        if(!is_array($value["DESCRIPTION"]))
        {
            $return["DESCRIPTION"] = unserialize($value["DESCRIPTION"]);
        }

        if ($return['VALUE'] > 0):
            return $return;
        endif;
    }
}

Подключим созданный нами класс в файле /bitrix/php_interface/init.php ( или /local/php_interface/init.php) для этого добавим следующие строки:


include_once(__DIR__.'/elementwithdescription.php');
// Добавим обработчик события и добавим наш пользовательский класс
AddEventHandler('iblock', 'OnIBlockPropertyBuildList', ['ElementWithDescription', 'GetIBlockPropertyDescription']);

Теперь при выборе типов свойств при создании свойства нам доступен созданный нами новый тип свойства:

Пользовательский тип свойства с описанием


Статья была полезна? Поблагодарите автора.

Возврат к списку

Другие статьи