Skip to content

⚠️1C-Bitrix module for D7 entities management (under development)

License

Notifications You must be signed in to change notification settings

saundefined/ps.d7

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Генератор админки

Предупреждение

Модуль не предназначен для рядовых пользователей. Используйте его, только если вы понимаете, что делать. В противном случае, пожалуйста, обратитесь к специалисту.

Зачем?

Таблицы на D7 создаются практически в каждом проекте, но иногда необходимо реализовывать интерфейс для них.

Чтобы не копипастить каждый раз из проекта в проект страницы в админке для управления таблицами и был создан модуль.

Подключение своей таблицы

Чтобы модуль узнал про вашу таблицу D7, необходимо зарегистрировать обработчик

<?php

use Bitrix\Main\Loader;
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;
use Bitrix\Main\EventResult;

$event = EventManager::getInstance();
$event->addEventHandler('ps.d7', 'onGetEntityList', 'registerMyEntity');

function registerMyEntity() {
    // Если подключаете таблицу из стороннего модуля
    Loader::includeSharewareModule('ps.demo');
    
    return [
        // Классы всех сущностей, для которых нужно будет управление
        new Bitrix\Main\UserTable(),
        new Ps\Demo\ORM\DemoTable(),
    ];
}

Кастомные поля

Все поля должны наследовать Bitrix\Main\ORM\Fields\ScalarField.

Модуль по умолчанию поддерживает следующие поля:

  • Bitrix\Main\ORM\Fields\EnumField
  • Bitrix\Main\ORM\Fields\BooleanField
  • Bitrix\Main\ORM\Fields\DateField
  • Bitrix\Main\ORM\Fields\DatetimeField
  • Bitrix\Main\ORM\Fields\TextField
  • Ps\D7\Fields\FileField
  • Ps\D7\Fields\D7EntityField
  • Bitrix\Main\ORM\Fields\StringField

Иногда может потребоваться собственное поле, рассмотрим добавление кастомного поля на примере D7EntityField

<?php

namespace Ps\D7\Fields;

use Bitrix\Main\ORM\Fields\ScalarField;

class D7EntityField extends ScalarField
{
    public function cast($value) {
        return $value;
    }

    public function convertValueFromDb($value) {
        return $this->getConnection()->getSqlHelper()->convertFromDbString($value);
    }

    public function convertValueToDb($value) {
        return $this->getConnection()->getSqlHelper()->convertToDbString($value);
    }
}

В таблице D7 указываем наше поле

<?php

namespace Ps\D7\ORM;

use Bitrix\Main\Entity\DataManager;
use Bitrix\Main\SystemException;
use Ps\D7\Fields\D7EntityField;

class EntityTable extends DataManager
{
    // ...

    public static function getMap() {
        try {
            return [
                new D7EntityField('ENTITY', [
                    'title' => 'Сущность',
                ]),
            ];
        } catch (SystemException $e) {
        }

        return [];
    }
}

Регистрируем обработчик:

<?php

use Bitrix\Main\EventResult;
use Bitrix\Main\EventManager;
use Bitrix\Main\Event;
use Ps\D7\Fields\D7EntityField;

$event = EventManager::getInstance();
$event->addEventHandler('ps.d7', 'onGetCustomFields', 'registerCustomField');

function registerCustomField() {
    return [
        D7EntityField::class => 'addEntityHandler'
    ];
}

/**
 * @param $tabControl CAdminForm
 * @param $field Bitrix\Main\ORM\Fields\ScalarField
 * @param $value
 */
function addEntityHandler($tabControl, $field, $value) {
    $classes = [];
    foreach (get_declared_classes() as $class) {
        if (is_subclass_of($class, '\\Bitrix\\Main\\ORM\\Data\\DataManager')) {
            $classes[$class] = $class;
        }
    }

    $tabControl->AddDropDownField($field->getName(), $field->getTitle(), $field->isRequired(),
        $classes, $value);
}

Модификация данных

Иногда может потребоваться изменить тип данных перед добавлением или обновлением, например, для поля DatetimeField:

Модуль по умолчанию модифицирует следующие типы данных:

  • Bitrix\Main\ORM\Fields\BooleanField
  • Bitrix\Main\ORM\Fields\DateField
  • Bitrix\Main\ORM\Fields\DatetimeField
<?php

use Bitrix\Main\EventResult;
use Bitrix\Main\EventManager;
use Bitrix\Main\Event;
use Bitrix\Main\ORM\Fields\DatetimeField;

$event = EventManager::getInstance();
$event->addEventHandler('ps.d7', 'registerCustomModifier', 'registerCustomModifierHandler');

function registerCustomModifierHandler(Event $event) {
    $event->addResult(new EventResult(EventResult::SUCCESS, [
        'ENTITY' => DatetimeField::class,
        'HANDLER' => 'customDateTimeHandler',
    ]));

    return $event;
}


function customDateTimeHandler($value) {
    return new \Bitrix\Main\Type\DateTime($value);
}

About

⚠️1C-Bitrix module for D7 entities management (under development)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages