Июл 10
remitmaster1С-Битрикс, PHP bitrix api, php
В исходниках битрикса есть CAllFile::GetList($arOrder, $arFilter, $arParams); но он видимо служит для внутреннего использования и не описан в документации. Нам нужно выбрать описание по 10 файлам за раз, этот метод, в качестве параметра фильтра массив из ID файлов не принял. Пришлось накидать свою функцию.
function __arfileGetList($ar_FileID)
{
if(is_array($ar_FileID) && count($ar_FileID) > 0)
{
global $DB;
$rs_File = $DB->Query(
"SELECT * FROM b_file WHERE ID IN
(". implode(',', $ar_FileID). ")",
false,
"FILE: ".__FILE__." LINE: ".__LINE__
);
while($ar_File = $rs_File->Fetch())
{
$ar_Result[] = $ar_File;
}
if(is_array($ar_Result) && count($ar_Result) > 0)
return $ar_Result;
}
}
P/S
Не забудте проверить $ar_FileID, чтобы там были именно ID файлов…
Июл 10
remitmaster1С-Битрикс, Development, PHP bitrix api, bitrix cache, cache
Итак представим что у вас или у вашего клиента большой, высоко-посещаемый сайт. Также представим инфоблок в котором больше 80k элементов. Наверняка у этих элементов есть детальное описание и я уверен 99,9% что ID кэша это ID вашего элемента.
Итак у нас получается что в папке допустим /bitrix/cache/object_80k/ — 80 000 папок с кэшем, т.е.
/bitrix/catche/object_80k/1
/bitrix/catche/object_80k/2
/bitrix/catche/object_80k/3
/bitrix/catche/object_80k/n
/bitrix/catche/object_80k/80 000
Какой бы у вас не был сервер, поиск папки в общем списке из 80k занимает время. Плюс если сайт посещаемый то вы догадываетесь что происходит, нагрузка на ровном месте, даже я бы сказал в том месте где мы пытаемся ее уменьшить.
Итак решение, на мой взгляд просто очень красивое и элегантное, его подсказал мой коллега Николай Рыжонин.
function __getGenerationCachePath($id)
{
$hash = md5($id);
$path = substr($hash,-4,2).'/'.substr($hash,-2);
return $path;
}
Пример:
$ob_Cache = new CPHPCache;
$i_CacheTime = 3600;
$s_CacheID = $ID;
$s_CachePatch = "/object_80k/" . __getGenerationCachePath($ID) . "/" . $ID . "/";
if($ob_Cache->InitCache($i_CacheTime, $s_CacheID, $s_CachePatch))
{
$ar_Cache = $ob_Cache->GetVars();
$ar_Result = $ar_Cache['ITEAM'];
}
else
{
$ar = ''; // выборка
if($obCityCache->StartDataCache())
{
$obCityCache->EndDataCache(array('ITEAM' => $ar));
}
}
Итак функция создаст путь вида /object_80k/as/df/ID и тем самым разобьет 80k папок на под папки, тем самым уменьшит время поиска кэша и общую нагрузку на сервер.
Да и еще важный момент, функция написана с учетом что ID > 100 000k. хотя тем кому это пригодится это не важно…
Июн 15
remitmaster1С-Битрикс, Программирование
Хочу высказать наболевшую мысль. С битриксом я работаю уже 4-ый год, и все бы хорошо, но, есть одна большая проблема, для меня по крайне мере. Так все время приходится работать именно с этой CMS, мало того что становится просто скучно, но и еще идет деградации как разработчика.
Я каждый раз радуюсь когда приходится решать какие-то не стандартные задачи, это подстегивает и пинает мозги. Надоел GetList и $arResult. Хочется чего-то новенького….
Июн 14
remitmaster1С-Битрикс bitrix api, init.php, php, агенты
Для новичков так сказать, про агенты.
Что такое агенты в битриксе?
- Это функция которая будет запущена в определенное время, поддерживает периодичность запуска.
Если вам нужно динамически добавлять агентов, то есть для это API. Если вам просто нужно прикрутить один или два агента то прошу под кат, там по шагам разберемся с этим вопросом.
More
Май 08
remitmaster1С-Битрикс, PHP
Пример реализации выборки из нескольких инфоблоков с постраничной навигацией и сортировкой.
Задача:
1) Выбрать список элементов из нескольких инфоблоков в таблицу;
2) Иметь возможность сортировки элементов;
3) Должна работать постраничная навигация
Итак этот пример можно использовать при небольшом кол-ве выбираемых элементов, думаю максимум до 100, естественно с кэшированием.
Первым делом нужно выбрать все данные в ассоциативный массив, например вот такой:
[ITEAM] => Array
(
[0] => Array
(
[CITY_NAME] => value
[CITY_DETAIL_URL] => value
[OBJECT_NAME] => value
[OBJECT_ID] => 2487
[DATE_CREATE] => 02.07.2006
[STATUS] => Y
[PAID_STATUS] => Y
[DATEIL_OBJECT_URL] => value
)
[1] => Array
(
[CITY_NAME] => value
[CITY_DETAIL_URL] => value
[OBJECT_NAME] => value
[OBJECT_ID] => 2489
[DATE_CREATE] => 02.07.2006
[STATUS] => Y
[PAID_STATUS] => N
[DATEIL_OBJECT_URL] => value
)
More
Мар 30
remitmaster1С-Битрикс, AJAX, IE, JavaScript
Ошибка эта возникает, когда сервер передает IE неизвестную кодировку. То есть, возможна ситуация, когда на одном сервере ваш скрипт будет работать нормально, а на другом - возникнет подобная ошибка.
То есть, передается, как правило — «utf8» а по стандарту должно «utf-8«. То есть, на этот раз Internet Explorer ведет себя вполне корректно (хотя, мог бы и простить, как делает FireFox, например), а гнилые помидоры — тому, кто настраивал web-сервер.
Как исправить? Варианта два:
- Поправить настройки Apache
- B самом начале серверного скрипта Ajax принудительно указать кодировку: header(‘Content-type: text/html; charset=utf-8′);
Поскольку, мы можем не знать настроек сервера, где будет работать наш скрипт, указание данного заголовка header(‘Content-type: text/html; charset=utf-8′);, я считаю, обязательно.
В битриксе это ошибка возникает допустим при обращение аяксом к компоненте в которой подключается js, без js все работает. Так что или выносим js из компонента или пользуемся советами выше.
решение нашли тут
Мар 06
remitmaster1С-Битрикс, PHP OnBeforeIBlock
Хочу предостеречь от очень каверзной особенности работы с расширенными инфоблоками у Битрикса, так называемыми Инфоблоками +.
Если вы используете обработчик на редактирование элемента OnBeforeIBlockElementUpdate, и изменяете в нем хоть одно свойство, то вам нужно указать в массиве параметров все свойства этого элемента. Иначе они будут затерты.
Это происходит только на инфоблоках + и не с включенным документооборотом для этого инфоблока. Все дело в массиве PROPERTY_VALUES, в котором вы меняете значение какого-то свойства. Подвох в том что вы не используете метод $el->Update($ID, $arParams) в самом обработчике, и это ошибка трудно уловима, по сути обработчик переопределяет $arParams['PROPERTY_VALUES'], по этому в нем будет только ваше изменение из обработчика. В этом случае, если вы будете использовать $el->Update($ID, $arParams) к этому инфоблоку в другом месте, свойства будут сбрасываться.
События хорошая штука, но нужно внимательнее сними работать, ими не стоит злоупотреблять.
Фев 09
remitmaster1С-Битрикс, AJAX, JavaScript
Почему-то многие не охотно используют битриксовую библиотеку аякса, почти всегда делая предпочтения в сторону Jquery или других js библиотек. Не сомненно что Jquery очень не плохая библиотека и отлично работает с ajax, но чтобы свободно разрабатывать сайты не 1с-Битрикс надо знать родное API.
Пост для новичков, думаю будет полезно. Рассматриваем только ajax-овую часть библиотеки, ее основу.
More
Фев 03
remitmaster1С-Битрикс, PHP bitrix api, bitrix ЧПУ, Search Engines Friendly URL
Итак вот вам маленький пример, снипет, как можно легко подготавливать добавляемые элементы для поддержки ЧПУ в Битриксе.
Вообще считаю что это должно быть по умолчанию. Т.е. выставляться в настройках инфоблока просто галочкой, так как это займет для разработчиков БУС примерно 1 час.
Пока этого нет, будем делать сами. Итак сейчас в стандартном функционале множества компонент добавили ЧПУ по полю CODE элемента. Это хорошее поле и удобно с ним работать, да и именно для этого оно видимо и предназначено, хотя можно использовать и просто свойства да и пользовательские свойства тоже.
Итак задача :
1. Нужно название элемента переводить в траслит и добавлять его в поле CODE.
2. Это нужно делать автоматически.
More
Янв 29
remitmaster1С-Битрикс, PHP bitrix api, delete element
Есть такая уязвимость, когда атакующий может удалить элемент, каталог, или даже инфоблок. Для этого нужно найти страницу или скрипт который выполняет эти действия.
После чего ему нужно всего навсего добавить картинку, например на форум, и в адрес url картинки подставить определенно сформированный адрес.
Например есть функционал вывода новостей, причем пользователь может как добавлять так и удалять новости. Ссылка на удаление новости выглядит у нас вот так.
www.site.ru/news/detail.php?ID=777&del=Y
Теперь если мы добавим пост на форум или блоги, и добави картинку с ссылкой,
<img src=»www.site.ru/news/detail.php?ID=777&del=Y» />
то администратор будучи авторизованным благополучно удалить элемент в ID 777. Проблема думаю ясна, теперь как это предотвратить.
More
Older Entries Newer Entries
Свежие комментарии