Окт 18
remitmaster1С-Битрикс, Development, PHP bitrix api, php
Задача, вывести в пагинацию и в заголовок диапазон в котором находится пользователь в текущий момент т.е. в конец добавлять текущую позицию в списке, список [c 10 по 20]
Вот наброски кода который решает эту задачу $rs_Element объект типа arResult
if(is_array($ar_Navigatonparams))
{
$ar_NavParams = array(
'NavPageNomer' => $rs_Element->NavPageNomer,
'NavPageSize' => $rs_Element->NavPageSize,
'NavRecordCount' => $rs_Element->NavRecordCount,
'nEndPage' => $rs_Element->nEndPage
);
function navigationIntervalList($ar_NavParams)
{
if(isset($_REQUEST['PAGEN_1']) && intval($_REQUEST['PAGEN_1']) > 0)
{
if(intval($ar_NavParams['NavPageNomer']) > 1)
{
$_s = ($ar_NavParams['NavPageNomer'] * $ar_NavParams['NavPageSize']) - $ar_NavParams['NavPageSize'] + 1;
$_p = $ar_NavParams['NavPageNomer'] * $ar_NavParams['NavPageSize'];
if($ar_NavParams['nEndPage'] == $ar_NavParams['NavPageNomer'])
$_p = $ar_NavParams['NavRecordCount'];
return 'список с '.$_s.' по '.$_p;
}
}
}
$s_nav = navigationIntervalList($ar_NavParams);
$s_Nav = (!empty($s_nav)) ? ' / '.$s_nav : '';
$s_Tit = (!empty($s_nav)) ? ', '.$s_nav : '';
$APPLICATION->AddChainItem($s_TitleNavchain.$s_Nav);
$APPLICATION->SetTitle($s_TitleNavchain.$s_Tit);
}
Окт 04
remitmasterPHP Exel, PHPExcel
В общем была проблема после переезда на другой хостинг, на timeweb. Попросил поставить Spreadsheet_Excel_Writer, ТП быстро отреагировала и поставила библиотеку, но она напроч отказывалась писать в файл. Т.е. файл генерила, но данные не записывались в файл. Я не дождался ответа в выходной день, оказывается у них админы в выходные не работают, поставил другую библиотеку для работы с Exel, PHPExcel называется. В работе даже полегче чем выше указанная. Она потребовала настройки mbstring.func_overload != 2, что и было сделано, оказалось что и Spreadsheet_Excel_Writer не работала по той же причине, в общем проблема тут mbstring.func_overload
Авг 30
remitmaster1С-Битрикс, PHP отложенные функции Bitrix
Итак чтобы не забывать и постоянно не вспоминать как это делается запишу.
Нам нужно в хидере вывести какую либо информацию, но не просто вставить компонент в шаблон, а передавать в этот компонент какие-то параметры которые мы получаем только в теле страницы.
Делается это так. Пишется функция вида
function componentHeader($text)
{
global $APPLICATION;
$arParams = $APPLICATION->GetPageProperty('PARAMS');
if(is_array($arParams))
{
ob_start();
$APPLICATION->IncludeComponent('demo:test', '', $arParams);
$contentTime = ob_get_contents();
ob_end_clean();
return $contentTime;
}
}
кладем ее как через init.php и в хидере выводим $APPLICATION->AddBufferContent(«componentHeader»); должно работать.
Июл 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. хотя тем кому это пригодится это не важно…
Июл 08
remitmasterDevelopment, PHP
Сегодня заметил небольшую особенность в стандартной php функции, которую раньше как-то не замечал. Вылез баг в замене значения по маске через str_replace. Код выглядит вот так :
$ar_ResultList[] = str_replace(
array("#ID#", "", "", "", "#CODE#",
"#CITY_CODE#", "#DETAIL_URL#", "#HOTEL_CODE#"),
$ar_ObjectFiled,
$s_LinkTemplates
);
Это уже исправленный код, т.е если мы ищем и заменяем в массиве то ключи должны совпадать и по расположению, т.е. по ключам.
Июн 11
remitmasterPHP
Оператор сравнения (==)

Проверка переменных:

Взято отсюда http://www.webpeeps.ru/article/17/
Май 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
Мар 06
remitmaster1С-Битрикс, PHP OnBeforeIBlock
Хочу предостеречь от очень каверзной особенности работы с расширенными инфоблоками у Битрикса, так называемыми Инфоблоками +.
Если вы используете обработчик на редактирование элемента OnBeforeIBlockElementUpdate, и изменяете в нем хоть одно свойство, то вам нужно указать в массиве параметров все свойства этого элемента. Иначе они будут затерты.
Это происходит только на инфоблоках + и не с включенным документооборотом для этого инфоблока. Все дело в массиве PROPERTY_VALUES, в котором вы меняете значение какого-то свойства. Подвох в том что вы не используете метод $el->Update($ID, $arParams) в самом обработчике, и это ошибка трудно уловима, по сути обработчик переопределяет $arParams['PROPERTY_VALUES'], по этому в нем будет только ваше изменение из обработчика. В этом случае, если вы будете использовать $el->Update($ID, $arParams) к этому инфоблоку в другом месте, свойства будут сбрасываться.
События хорошая штука, но нужно внимательнее сними работать, ими не стоит злоупотреблять.
Фев 03
remitmaster1С-Битрикс, PHP bitrix api, bitrix ЧПУ, Search Engines Friendly URL
Итак вот вам маленький пример, снипет, как можно легко подготавливать добавляемые элементы для поддержки ЧПУ в Битриксе.
Вообще считаю что это должно быть по умолчанию. Т.е. выставляться в настройках инфоблока просто галочкой, так как это займет для разработчиков БУС примерно 1 час.
Пока этого нет, будем делать сами. Итак сейчас в стандартном функционале множества компонент добавили ЧПУ по полю CODE элемента. Это хорошее поле и удобно с ним работать, да и именно для этого оно видимо и предназначено, хотя можно использовать и просто свойства да и пользовательские свойства тоже.
Итак задача :
1. Нужно название элемента переводить в траслит и добавлять его в поле CODE.
2. Это нужно делать автоматически.
More
Older Entries Newer Entries
Свежие комментарии