itgro / extensions
1С-Битри克斯工作助手
Requires
- php: >=7.0.0
- itgro/installer: *@dev
- maximaster/tools.twig: 1.1.0
- nesbot/carbon: ^2.16.3
README
模块包含多种类,旨在简化1С-Битри克斯网站开发者的工作。
安装
-
composer require itgro/extensions
-
为了正确使用twig模板,需要按照 maximaster/tools.twig 的设置说明进行操作。
-
为了使用ajax路由器,需要在
urlrewrite.php
文件中添加(建议放置较高位置)。array( 'CONDITION' => '#^\/ajax\/([^\/]*)#', 'RULE' => 'handler=$1', 'ID' => '', 'PATH' => '/ajax/index.php', ),
-
为了使用动态代理,需要通过
(new \Itgro\Cron\Kernel)->register();
添加代理核心的初始化。注意!必须在创建代理处理器后执行此操作。
有哪些功能
辅助类
-
\Itgro\BufferView
- 与$APPLICATION->ShowViewContent()
一起工作,但范围更窄、更易于理解; -
\Itgro\Log
- 对CEventLog::Log()
的小型包装; -
\Itgro\Mail
- 可以通过模板或普通发送发送邮件; -
\Itgro\Router
- 一个类,可以存储项目中的所有(相对简单的)链接到一个数组中,并通过简短的助手获取它们。默认情况下,所有别名都存储在网站的根目录中的routes.php
文件中。可以通过声明常量EXTENSIONS_ROUTES_PATH
来改变此文件的路径(从网站根目录开始)。routes.php
文件中的数组结构非常简单return [ 'auth' => '/personal/auth/', 'register' => '/personal/registration/', ];
因此,可以通过 \Itgro\Router::getByCode('auth')
(或助手 route('auth')
)获取所需的路径;
-
\Itgro\Session
- 对会话的包装(所有数据都存储在$_SESSION
的子数组中); -
在
\Itgro\Bitrx\*
命名空间下有大量不同的类,允许简单地获取值(类似于“根据代码获取id”)。
所有数据都进行缓存。因此,如果您通过\Itgro\Bitrix\IBlock\Iblock::getByCode()
一次获取到IB的id,则后续所有调用都将调用已缓存的值。 -
\Itgro\Sharing
- 一个用于在社交媒体中创建分享链接的类(和相关处理器);
用于处理比特里克斯实体的类
-
\Itgro\Entity\IBlock\Base
- 一个抽象类,用于更方便地处理CIBlockElement
; -
\Itgro\Entity\IBlock\Entity
- 一个抽象类(以前者为父类),允许将返回数组的每个元素都用作对象; -
在
\Itgro\Entity\IBlock\Base
(以及相应地,在\Itgro\Entity\IBlock\Entity
)中有一个名为\Bitrix\Entity\IBlock\WithEvents
的特质(您当然也可以在其他比特里克斯实体类型中使用它)。
它允许将处理器(更新、添加、删除元素)附加到特定的您的实体上,以便处理器仅对特定IB执行。
当然,您可以扩展您的实体以添加新的处理器(例如,"激活时",它扩展\Bitrix\Entity\IBlock\WithEvents::afterUpdate()
); -
\Itgro\Entity\HighloadIBlock\Base
- 一个用于方便处理Highload-IB的抽象类; -
\Itgro\Entity\DataManager\Base
- 一个用于方便处理有自己ORM类的单独表的抽象类;
类扩展器
-
通过在
\Itgro\Ajax\Distributor::EXPAND_HANDLERS_EVENT
上附加处理器,可以添加自己的ajax处理器;/** * В этом примере будут доступны запросы вида `/ajax/feedback/%method%/`, * каждый из которых будет делигироваться в соответствующий класс на соответствующий метод */ event_manager()->addEventHandler('extensions', \Itgro\Ajax\Distributor::EXPAND_HANDLERS_EVENT, function (\Bitrix\Main\Event $event) { return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [ 'feedback' => \Namespace\Some\Class::class, ]); })
甚至更简单
\Itgro\Ajax\Distributor::setHandlers([ 'feedback' =>\Namespace\Some\Class::class, ]);
为了通用ajax请求的数据,有以
\Itgro\Ajax\Result\*
命名空间为类的类。可以返回它们作为ajax方法的响应,并按返回对象类型处理。 -
通过在
\Itgro\Twig\Extension\Functions::EXPAND_HANDLERS_EVENT
上附加处理器,可以添加自己的Twig函数;event_manager()->addEventHandler('extensions', \Itgro\Twig\Extension\Functions::CREATE_HANDLERS_LIST_EVENT, function (\Bitrix\Main\Event $event) { return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [ 'foo_func' => [\Namespace\Some\Class::class, 'fooFunc'], 'bar_func' => [\Namespace\Some\Second\Class::class, 'barFunc'], ]); })
甚至更简单
\Itgro\Twig\Extension\Functions::setHandlers([ 'foo_func' => [\Namespace\Some\Class::class, 'fooFunc'], ]);
-
通过在
\Itgro\Twig\Extension\Filters::EXPAND_HANDLERS_EVENT
上附加处理器,可以添加自己的Twig过滤器。代码的结构大致如上所述。 -
通过类创建动态代理的能力。每个这样的类都必须是类
\Itgro\Cron\Agent
的子类,并且必须有一个call()
方法。如果您的代理需要接受参数并返回它们,则在同一方法中完成此操作。
函数名称可以通过代理类的参数name
明确指定,或者类的名称将自动转换为 camel_case,因此函数名称将变为\Itgro\Cron\Agent -> itgro_cron_agent
。 -
通过标准初始化添加自定义代理类的能力
event_manager()->addEventHandler('extensions', \Itgro\Cron\Kernel::EXPAND_HANDLERS_EVENT, function () { return new EventResult(EventResult::SUCCESS, [ \Namespace\Some\FirstAgent::class, \Namespace\Some\SecondAgent::class, ]); });
甚至更简单
\Itgro\Cron\Kernel::setHandlers([ \Namespace\Some\Agent::class, ]);
与行政面板的操作
-
在元素编辑页面上操纵特定属性
(new \Namespace\IBlockExtended\Entity)->addElementPropertyInformation( 'IBLOCK_PROPERTY_CODE', // Код свойства, для которого отрабатывается js-функция function ($propertyId) { // JavaScript-код или JavaScript-функция, которые будут обрабатываться только на странице, где есть свойство с указанным кодом return 'javascriptFunctionName'; } )
-
在关联实体页面上添加按钮,用于根据当前实体进行过滤以跳转到元素编辑页面上
(new \Namespace\IBlockExtended\Entity)->addElementAdminButton( (new \Itgro\Bitrix\Admin\Button\ElementEdit) ->withProperties([ 'iblock_type' => 'iblock_type_id', // Тип ИБ связанной страницы 'iblock_code' => 'iblock_code', // Код ИБ связанной страницы 'filter' => [ // Фильтр по текущей сущности ['type' => 'property', 'code' => 'RELATED_PROPERTY_CODE'], ], ]) ->withView([ 'place' => 'before', // Добавлять до или после кнопки копирования 'style' => 'adm-btn-green', // Доп.классы для кнопки 'name' => 'Элементы', // Заголовок кнопки ]) );