Как создать свой компонент комментариев на 1С-Битрикс: старый и новый подходы (component.php vs class.php)

Платформа 1С-Битрикс предоставляет разработчикам возможности для создания различных компонентов, которые расширяют функционал сайта. Ранее для создания компонента использовался файл component.php, однако с появлением нового ядра D7 структура и подходы к разработке компонентов претерпели значительные изменения. Вместо component.php теперь используется class.php, что позволяет значительно улучшить организацию кода, повысить его читаемость и использовать объектно-ориентированные принципы разработки.

Создание компонента комментариев на 1С-Битрикс

В этой статье мы рассмотрим создание компонента для отображения и добавления комментариев к статьям, используя два подхода: старый — через файл component.php и новый — через файл class.php. Мы также сравним оба подхода, включая добавление стилей и скриптов.

Полная структура компонента

Для создания компонента будет использоваться пространство имен Esprimo. Компонент будет хранить комментарии в инфоблоке и иметь возможность их отображать и добавлять.


/local/components/
    esprimo/
        comment/
            .description.php   (Описание компонента)
            .parameters.php    (Параметры компонента)
            class.php          (Логика компонента)
            template/
                .default/
                    template.php (Шаблон компонента)
    
  • class.php — главный файл компонента, где пишется бизнес-логика (например, добавление и вывод комментариев).
  • .description.php — описание компонента.
  • .parameters.php — параметры компонента, которые могут быть настроены в административной панели.
  • template.php — файл шаблона для вывода данных.

Теперь давайте разберемся, как будет выглядеть создание компонента на старом и новом подходах.

Подход 1: Создание компонента через component.php (старый подход)

Ранее для создания компонента в 1С-Битрикс использовался файл component.php, который содержал как логику компонента, так и его вывод. Это означало, что бизнес-логика и шаблон компонента находились в одном файле.

1. Описание компонента (файл .description.php)


<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$arComponentDescription = array(
    "NAME" => "Комментарии",
    "DESCRIPTION" => "Компонент для добавления и отображения комментариев",
    "PATH" => array(
        "ID" => "custom",
        "NAME" => "Мои компоненты"
    ),
);
?>
    

2. Логика компонента (файл component.php)

Ранее бизнес-логика и вывод компонента находились в одном файле component.php. В нем мы добавляли комментарии и выводили их:


<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;

class EsprimoCommentComponent extends CBitrixComponent
{
    public function executeComponent()
    {
        if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["comment_text"])) {
            $this->addComment($_POST["comment_text"]);
        }

        $this->arResult["COMMENTS"] = $this->getComments();
        $this->includeComponentTemplate();
    }

    private function addComment($text)
    {
        Loader::includeModule("iblock");

        $element = new CIBlockElement();
        $fields = array(
            "IBLOCK_ID" => 1,  // ID инфоблока с комментариями
            "NAME" => "Комментарий",
            "PREVIEW_TEXT" => $text,
            "ACTIVE" => "Y",
        );

        $element->Add($fields);
    }

    private function getComments()
    {
        Loader::includeModule("iblock");

        $comments = [];
        $res = CIBlockElement::GetList(
            array("SORT" => "ASC"),
            array("IBLOCK_ID" => 1),  // ID инфоблока с комментариями
            false,
            false,
            array("ID", "NAME", "PREVIEW_TEXT")
        );

        while ($ob = $res->GetNextElement()) {
            $fields = $ob->GetFields();
            $comments[] = $fields;
        }

        return $comments;
    }
}
?>
    

3. Шаблон компонента (файл template.php)


<?php if (!empty($arResult["COMMENTS"])): ?>
    <div class="comments">
        <?php foreach ($arResult["COMMENTS"] as $comment): ?>
            <div class="comment">
                <div class="comment-text"><?= htmlspecialchars($comment["PREVIEW_TEXT"]) ?></div>
            </div>
        <?php endforeach; ?>
    </div>
<?php endif; ?>

<form method="POST">
    <textarea name="comment_text" required></textarea>
    <button type="submit">Добавить комментарий</button>
</form>
    

4. Добавление стилей и скриптов

Стили и скрипты подключались в шаблоне с помощью AddEventHandler() или напрямую через \Bitrix\Main\Page\Asset::getInstance()->addCss() и addJs() в component.php:


<?php
\Bitrix\Main\Page\Asset::getInstance()->addCss('/local/components/esprimo/comment/style.css');
\Bitrix\Main\Page\Asset::getInstance()->addJs('/local/components/esprimo/comment/script.js');
?>
    

Подход 2: Создание компонента через class.php (новый подход)

С введением нового ядра D7, структура компонента изменилась. Теперь основным файлом компонента является class.php. В нем описывается только логика компонента, а шаблон и стили подключаются отдельно. Это позволяет лучше организовать код и использовать объектно-ориентированные подходы.

1. Описание компонента (файл .description.php)

Файл .description.php не изменился, он по-прежнему описывает компонент в административной панели.


<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$arComponentDescription = array(
    "NAME" => "Комментарии",
    "DESCRIPTION" => "Компонент для добавления и отображения комментариев",
    "PATH" => array(
        "ID" => "custom",
        "NAME" => "Мои компоненты"
    ),
);
?>
    

2. Логика компонента (файл class.php)

В class.php используется объектно-ориентированный подход. Мы создаем класс компонента, который инкапсулирует логику работы с комментариями.


<?php
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Main\ArgumentException;

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();

class EsprimoCommentComponent extends \CBitrixComponent
{
    public function executeComponent()
    {
        if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["comment_text"])) {
            $this->addComment($_POST["comment_text"]);
        }

        $this->arResult["COMMENTS"] = $this->getComments();
        $this->includeComponentTemplate();
    }

    private function addComment($text)
    {
        Loader::includeModule("iblock");

        try {
            $element = new \Bitrix\Iblock\Element();
            $element->setFields([
                "IBLOCK_ID" => 1,  // ID инфоблока с комментариями
                "NAME" => "Комментарий",
                "PREVIEW_TEXT" => $text,
                "ACTIVE" => "Y",
            ]);
            $element->save();
        } catch (ArgumentException $e) {
            \Bitrix\Main\Diag\Debug::writeToFile($e->getMessage(), "", "/log/");
        }
    }

    private function getComments()
    {
        Loader::includeModule("iblock");

        $comments = [];
        $res = ElementTable::getList([
            "filter" => ["IBLOCK_ID" => 1],  // ID инфоблока с комментариями
            "order" => ["SORT" => "ASC"],
        ]);

        while ($comment = $res->fetch()) {
            $comments[] = $comment;
        }

        return $comments;
    }
}
?>
    

3. Шаблон компонента (файл template.php)

Шаблон компонента не изменился. Он по-прежнему отвечает за вывод комментариев и формы добавления.


<?php if (!empty($arResult["COMMENTS"])): ?>
    <div class="comments">
        <?php foreach ($arResult["COMMENTS"] as $comment): ?>
            <div class="comment">
                <div class="comment-text"><?= htmlspecialchars($comment["PREVIEW_TEXT"]) ?></div>
            </div>
        <?php endforeach; ?>
    </div>
<?php endif; ?>

<form method="POST">
    <textarea name="comment_text" required></textarea>
    <button type="submit">Добавить комментарий</button>
</form>
    

4. Добавление стилей и скриптов

В отличие от старого подхода, стили и скрипты в новом подходе добавляются через Asset в шаблоне компонента.


<?php
\Bitrix\Main\Page\Asset::getInstance()->addCss('/local/components/esprimo/comment/style.css');
\Bitrix\Main\Page\Asset::getInstance()->addJs('/local/components/esprimo/comment/script.js');
?>
    

Сравнение подходов

  1. Основной файл компонента:
    • Старый подход (component.php): вся логика и вывод компонента находятся в одном файле.
    • Новый подход (class.php): логика компонента вынесена в отдельный класс, а шаблон компонента находится отдельно.
  2. Ограничения старого подхода:
    • Мешание бизнес-логики и шаблона в одном файле делает код громоздким и трудным для поддержки.
    • Прямое подключение стилей и скриптов в component.php может привести к избыточности и неудобству управления.
  3. Преимущества нового подхода:
    • Ясное разделение логики и шаблонов.
    • Использование объектно-ориентированного подхода в классе class.php.
    • Удобное подключение стилей и скриптов через Asset.

Заключение

С переходом на ядро D7 в 1С-Битрикс компоненты стали более организованными и удобными для разработки. Использование class.php вместо component.php позволяет лучше структурировать код, улучшить его читаемость и упростить поддержку.

Теги:  компонент, комментарии, component.php, class.php, разработка, D7

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.

Техническая поддержка

выполняется с сайтами на основе любых CMS

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

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.