Бывают ситуации, когда появляется желание создать отдельную логику для компонента, где, например, происходят различные операции с таблицами. Ну или еще для чего. Такие вещи надо модулем делать, конечно же, но если очень хочется, то можно) К делу:
Например есть у нас компонент test.my_table
В папке компонента (где находится component.php) создаем class.php. В этом файле расширяем стандартный класс компонента CBitrixComponent, например вот так:
class CMyComponent extends CBitrixComponent{
// Создаем таблицу
public function createTable(){
global $DB;
$strSql = "
CREATE TABLE IF NOT EXISTS `my_table` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`date_create` DATETIME DEFAULT CURRENT_TIMESTAMP,
`date_modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`name` VARCHAR(255) NOT NULL DEFAULT '',
`xml_id` VARCHAR(100) NOT NULL DEFAULT '',
`active` TINYINT UNSIGNED NOT NULL DEFAULT 1,
PRIMARY KEY (`id`)
);
";
$res = $DB->Query($strSql, false);
return $res;
}
// Добавляем данные в таблицу
public function insertTable(){
global $DB;
$strSql = "
INSERT INTO `my_table`
(`name`, `xml_id`)
VALUES
('Test 1', '00001'),
('Test 2', '00002'),
('Test 3', '00003')
;";
$req = $DB->Query($strSql, false);
return $req;
}
// Получаем данные
public function getTable(){
global $DB;
$strSql = "
SELECT
`my_table`.`id`,
`my_table`.`name`
FROM
`my_table`
;";
$req = $DB->Query($strSql, false);
$arRes = [];
while ($res = $req->Fetch()) {
$arRes[] = $res;
}
return $arRes;
}
}
Теперь в компоненте (component.php) можно использовать эти методы класса:
$this->createTable();
$this->insertTable();
$arResult['data'] = $this->getTable();
Чтобы использовать этот класс компонента вне его, например в другом компоненте или на странице сайта, то можно вызвать его так:
CBitrixComponent::includeComponentClass("bitrix:test.my_table");
$cMyComp = new CMyComponent();
$arResult['data'] = $cMyComp->getTable();