Вот здесь https://idea.1c-bitrix.ru/mass-update-...ts-in-orm/ просили добавить массовое удаление в ORM Битрикса. Поскольку функции deleteAll() так и не появилось, предлагаю использовать следующее решение:
class YourEntityTable extends Entity\DataManager
{
public static function deleteAll()
{
if(!is_callable(array(get_parent_class(__CLASS__), "deleteAll"))){
global $DB;
return $DB->Query("TRUNCATE TABLE " . self::getTableName(), true);
} else {
return parent::deleteAll();
}
}
/* ... your code ... */
}
Если разработчики Bitrix допишут соответствующую функцию, то вызываться будет именно она.
не предусмотрен тип поля "привязка файла". При этом добавление к сущности файла (например, картинки) является самой банальной задачей. Приходится писать велосипеды вида:
class MyEntityTable extends Entity\DataManager
{
/**
* @return string
*/
public static function getFilePath()
{
return __FILE__;
}
/**
* @return string
*/
public static function getTableName()
{
return 'b_my_table';
}
/**
* @return array
*/
public static function getMap()
{
return array(
new Entity\IntegerField('PICTURE', array(
'validation' => function() {
return array(
function ($value) {
/*Валидация - файл может быть только картинкой*/
if(intval($value)>0){
$rsFile = CFile::GetByID($value);
if($arFile = $rsFile->Fetch()){
if (!CFile::IsImage($arFile["FILE_NAME"], $arFile["CONTENT_TYPE"])) {
return Loc::getMessage("FILE_ERROR");
}
}
}
return true;
}
);
}
))
);
}
/*Удаление файла вместе с удалением элемента*/
public static function onBeforeDelete(Entity\Event $event)
{
$primary = $event->getParameter("primary");
$rs = static::GetByID($primary["ID"]);
if($ar = $rs->Fetch()){
if (intval($ar['PICTURE'])>0)
{
CFile::Delete($ar['PICTURE']);
}
}
}
/*Удаление старого файла при обновлении элемента*/
public static function onBeforeUpdate(Entity\Event $event)
{
$fields = $event->getParameter("fields");
$primary = $event->getParameter("primary");
if(intval($fields['PICTURE'])>0){
$rs = static::GetByID($primary["ID"]);
if($old = $rs->Fetch()){
if (intval($old['PICTURE'])>0 && $fields["PICTURE"]!=$old["PICTURE"])
{
CFile::Delete($old['PICTURE']);
}
}
}
}
}
Возможно кто-то подскажет более адекватное решение?
Дмитрий Гринкевич, можно сделать свой тип FileField, унаследовавшись от класса \Bitrix\Main\Entity\ScalarField. Потом написать валидаторы, унаследовавшись от класса \Bitrix\Main\Entity\Validator\Base. Это будет наверное самый правильный путь. Не самый быстрый, но зато можно будет использовать в разных ORM-классах просто как new FileField.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».