arrilot / bitrix-models Goto Github PK
View Code? Open in Web Editor NEWLicense: MIT License
License: MIT License
https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/add.php
https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/update.php
добавьте пожалуйста поддержку флага bWorkflow
, также как это сделано для флага bUpdateSearch
Нужна возможность "подписки" на события Eloquent-моделей
https://laravel.com/docs/5.5/eloquent#events
Если для стандартных сущностей такая возможность предоставляется из Битрикс API.
То при использовании Eloquent моделей этого очень не хватает.
Иногда на разных машинах получение элементов из БД падает с ошибкой:
[LogicException]
Object initialization failed (0)
/var/www/artem/data/www/mysite.ru/local/vendor/arrilot/bitrix-models/src/Models/BitrixModel.php:218
#0: Arrilot\BitrixModels\Models\BitrixModel::instantiateObject()
/var/www/artem/data/www/mysite.ru/local/vendor/arrilot/bitrix-models/src/Models/ElementModel.php:136
#1: Arrilot\BitrixModels\Models\ElementModel::query()
/var/www/artem/data/www/mysite.ru/local/vendor/arrilot/bitrix-models/src/Models/BaseBitrixModel.php:274
#2: Arrilot\BitrixModels\Models\BaseBitrixModel::__callStatic(string, array)
/var/www/artem/data/www/mysite.ru/local/classes/Myhelp.php:54
#3: Artem\Myhelp->isPromotion(string)
/var/www/artem/data/www/mysite.ru/local/templates/vabank_map/components/bitrix/news.detail/guides/component_epilog.php:85
#4: include(string)
/var/www/artem/data/www/mysite.ru/bitrix/modules/main/classes/general/component.php:1398
#5: CBitrixComponent->includeComponentEpilog(array)
/var/www/artem/data/www/mysite.ru/bitrix/modules/main/classes/general/component.php:965
#6: CBitrixComponent->startResultCache(integer, array)
/var/www/artem/data/www/mysite.ru/bitrix/components/bitrix/news.detail/component.php:137
#7: include(string)
/var/www/artem/data/www/mysite.ru/bitrix/modules/main/classes/general/component.php:551
#8: CBitrixComponent->__includeComponent()
/var/www/artem/data/www/mysite.ru/bitrix/modules/main/classes/general/component.php:603
#9: CBitrixComponent->includeComponent(string, array, NULL)
/var/www/artem/data/www/mysite.ru/bitrix/modules/main/classes/general/main.php:1041
#10: CAllMain->IncludeComponent(string, string, array)
/var/www/artem/data/www/mysite.ru/guides/index.php:55
#11: include_once(string)
/var/www/artem/data/www/mysite.ru/bitrix/modules/main/include/urlrewrite.php:159
#12: include_once(string)
/var/www/artem/data/www/mysite.ru/bitrix/urlrewrite.php:2
Функция в которой происходит вызов:
public function isPromotion($qid)
{
$res = \Questions::select('PROPERTY_PROMODATE')->getById($qid);
return $res['PROPERTY_PROMODATE_VALUE'];
}
Без подключения модуля iblock выдает ошибку "Object initialization failed"
Subj. Со строками и числами проблем нет, но с массивом обломался. Пример:
class protectedProject extends ElementModel {
const IBLOCK_ID = 110;
const IBLOCK_VERSION = 1;
protected $appends = ['NORMALIZE_ORDER'];
public function getNormalizeOrderAttribute()
{
// $this['PROPERTY_SOSTAVZAKAZ_VALUE & $this['PROPERTY_QTYZAKAZ_VALUE'] - массивы гарантированно.
$ewa = array_combine ( $this['PROPERTY_SOSTAVZAKAZ_VALUE'] , $this['PROPERTY_QTYZAKAZ_VALUE'] );
return $ewa;
}
}
В 'NORMALIZE_ORDER' пустота.
Так и задумано?
При использовании with (для отложенной загрузки) совместно с filter связанные данные не возвращаются, если вызывать просто без filter, то все нормально
BC:
src/Collection.php
потому что конфликтовала с Illuminate\Support\Collection
на php 5.6+Model::getById
, Model::getList
, Model::first
которые были deprecatedElementModel::$fetchUsing
упразднено. Раньше был выбор между getNextElement
(по умолчанию) и getNext
. С этим много проблем с разными типами инфоблоков. Теперь всегда используется строго FetchUser::current()
теперь сразу получает и поля юзера из БД (но только один раз)New:
Использовал модуль на небольшом проекте. Показалось что он довольно стабильный, но напрягает надпись "В разработке".
Вижу что уже год не было по нему обновлений. Хотелось бы узнать что осталось нереализованным, какие могут быть подводные камни при использовании?
При вызове метода Save() на элементе с неполным набором свойств, они пропускаются через setPropertyValues, соответственно затираются все остальные свойства. Это ожидаемое поведение или нет?
Вот, еще похоже что при вызове Save() на элементе с множественным свойством файл - дублируется PROPERTY_VALUE_ID , точнее, они не дублируются, а создаются новые в количестве равном текущему размеру массива PROPERTY_VALUE
P.S. Огромное спасибо за проделанную работу!
Случайно обнаружил такой баг:
Если в коде используются модели Элемента и Секции, то в свойство модели bxObject
записывается класс первой вызванной модели.
Добавил дополнительную проверку в код
if (static::$bxObject && (get_class(static::$bxObject) == static::$objectClass) ) {
return static::$bxObject;
}
bitrix-models/src/Models/BitrixModel.php
Lines 361 to 363 in ad79f2a
Но не уверен в правильности решения
При использовании связанных данных для свойства типа справочник, даёт ошибку Getting unknown property
$this->$getter()
в методе __get
класса BaseBitrixModel
для такого свойства возвращает объект Illuminate\Database\Eloquent\Builder
Было бы удобно использовать этот пакет для самого laravel 5.4, при использовании laravel в качестве фронта.
В данный момент выбрасывает ошибку:
FatalThrowableError in ProviderRepository.php line 149:
Call to undefined method Arrilot\BitrixModels\ServiceProvider::isDeferred()
Попробовал использовать версию 5.8 - вроде все работает.
Не тестили работу с ней?
Отличная штука, спасибо. Пара моментов:
Когда много полей в базе свойств элемента инфоблока и ставишь опцию PROPS ожидаемо вываливается с ошибкой Too many tables; MySQL can only use 61 tables in a join. Причем, количество property не впечатляющее - штук 20 или 30 на элемент.
Хорошо бы сделать по аналогии с activate/deactivate функцию установки цен.
Выдает шаблон ссылок, а не уже сгенерированные ссылки (как понимаю из-за применения fetch вместо GetNext)
$sectionsListForSmallMenu = oboiCollection::query()->select('ID')
->sort(["SORT" => "ASC", "NAME" => "ASC"])
->filter(["IBLOCK_ID" => $arParams['IBLOCK_ID'], "ACTIVE" => "Y", "SECTION_ID" => false])
->limit(10)
->select("ID", "CODE", "NAME", "SECTION_PAGE_URL")
->getList()
->toArray()
;
printr ($sectionsListForSmallMenu);
Результат:
[4550] => Array
(
[SECTION_PAGE_URL] => #SITE_DIR#wallcoverings/#SECTION_CODE_PATH#/
)
Предполагаеться что в результате должно вернуть кол-во, но не вернуло...
Выборка множественного поля типа список, вываливается:
Fatal error: [] operator not supported for strings in [..]./vendor/arrilot/bitrix-models/src/Queries/BaseQuery.php on line 377
Если поле пустое, то всё OK.
Если применить limit () к инфоблоку "некаталожного" типа (например, новостям), то он работает криво. Чтобы выбрать 16 записей надо задать 95.
$this->interior = \interior::query()->select('ID')
->filter([
])
->sort(['SHOW_COUNTER' =>'DESC'])
->select ('NAME', 'FIELDS', 'SHOW_COUNTER', 'PROPERTY_PHOTO')
->limit(16)
->getList()
->toArray()
;
Вытаскиевает только три элемента. Ставишь 95 - вытягивает сколько нужно.
interior:
class interior extends ElementModel
{
const IBLOCK_ID = \iblocksID::INTERIOR;
}
Здравствуйте!
Можно-ли, не модифицируя bitrix-models, организовать работу с несколькими БД?
Например, добавить внешнюю БД postgree.
Стандартно в Битриксе это решается добавлением подключения в файле /bitrix/.settings.php
Второй вопрос: можно-ли в bitrix-models добавлять options для подключения?
Пример из Laravel:
app/config/database.php
return array(
'connections' => array(
'mysql' => array(
'options' => array(
PDO::ATTR_CASE => PDO::CASE_UPPER,
),
),
)
)
Это позволит объявлять в моделях названия колонок таблиц в lower_case.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.