Api Drupal 7 сильно изменилось, в связи с этим перевод модуля был долгим, но я все же это сделал :)
Предлагаю всем желающим обновиться.
Ссылка для скачивания модуля новая: http://pihel.myjino.ru/files/punbb7.zip
воскресенье, 19 июня 2011 г.
воскресенье, 15 мая 2011 г.
Особенности OnBeforeIBlockElementUpdate в Bitrix
Метки:
bitrix,
DETAIL_TEXT,
OnBeforeIBlockElementUpdate,
php
В ходе работы сайта на Bitrix вдруг начали пропадать содержания статей.
Сначала я грешил на человеческий фактор, что кто-то случайно или специально удаляет содержания статей.
После недолгих разбирательств (создания истории изменений) выяснилось, что ошибка скорей техническая. Т.к. ошибку удалось локализовать, она проявлялась при привязки раздела к статье из списка элементов. Тогда как изменение раздела из самой статьи не приводило к ошибке.
Следующим этапом было штудирование файла init.php, где хранятся обработчики событий портала.
В файле init.php хранился обработчик, заменяющий текст статьи на другой в автоматическом режиме.
Оказывается при привязке статьи к разделу или переносе статьи между разделами в списке элементов, событию OnBeforeIBlockElementUpdate идут не все поля и такая обработка затирает текущий детальный текст статьи. Ошибка естественно не проявлялась при редактировании элемента, т.к. в этом случае передавались все поля.
Правильный код в этом случае выглядит так (т.е. необходима проверка существования поля):
Сначала я грешил на человеческий фактор, что кто-то случайно или специально удаляет содержания статей.
После недолгих разбирательств (создания истории изменений) выяснилось, что ошибка скорей техническая. Т.к. ошибку удалось локализовать, она проявлялась при привязки раздела к статье из списка элементов. Тогда как изменение раздела из самой статьи не приводило к ошибке.
Следующим этапом было штудирование файла init.php, где хранятся обработчики событий портала.
В файле init.php хранился обработчик, заменяющий текст статьи на другой в автоматическом режиме.
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler")); class MyClass { function OnBeforeIBlockElementUpdateHandler(&$arFields) { $arFields["DETAIL_TEXT"] = str_replace('src="../../upload/', 'src="/upload/', $arFields["DETAIL_TEXT"]); } }
Оказывается при привязке статьи к разделу или переносе статьи между разделами в списке элементов, событию OnBeforeIBlockElementUpdate идут не все поля и такая обработка затирает текущий детальный текст статьи. Ошибка естественно не проявлялась при редактировании элемента, т.к. в этом случае передавались все поля.
Правильный код в этом случае выглядит так (т.е. необходима проверка существования поля):
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler")); class MyClass { function OnBeforeIBlockElementUpdateHandler(&$arFields) { if(!empty($arFields["DETAIL_TEXT"])) { $arFields["DETAIL_TEXT"] = str_replace('src="../../upload/', 'src="/upload/', $arFields["DETAIL_TEXT"]); } } }
вторник, 29 марта 2011 г.
Автоматизация OpenOffice
Метки:
проект,
c++,
openoffice,
uno,
xls
Мои статьи по автоматизации OpenOffice на C++.
Скачать проект, готовые модули.
четверг, 3 февраля 2011 г.
Особенности Oracle: данные выборки при joine таблиц
Метки:
join,
oracle,
sql,
virtual table
Все кто пишет SQL запросы так или инче знает, что данные основной выборки можно использовать где угодно, кроме секции from.
Вот такой запрос выполнится с ошибкой:
Пример:
Есть таблица, содеражщая 2 столбца: имя, число. Нам нужно вывести данные, продублировав поле "имя" число раз, заданное в поле "число". (Понятно, что данный пример можно сделать рекурсивным запросом, но факт такой возможности может не раз пригодится). Запрос:
С 12 версии есть стандартный вариант: Create a lateral inline view in a query
Вот такой запрос выполнится с ошибкой:
SELECT t1.id, t1.name FROM t1, (SELECT id FROM tmp WHERE tmp.sec_id = t1.id) as t2Но оказывается это ограничение можно обойти в ORACLE. Достаточно оформить подзапрос в функцию, возвращающую таблицу и все отработает без проблем.
Пример:
Есть таблица, содеражщая 2 столбца: имя, число. Нам нужно вывести данные, продублировав поле "имя" число раз, заданное в поле "число". (Понятно, что данный пример можно сделать рекурсивным запросом, но факт такой возможности может не раз пригодится). Запрос:
SELECT t1.num, t1.name FROM t1, table (virtual_date_table(t1.num, sysdate, sysdate))Функция, возвращающая таблицу:
CREATE OR REPLACE FUNCTION admin.virtual_date_table(p_num_rows in INTEGER, p_start_date IN DATE, p_end_date IN DATE) RETURN virtual_date_table_type IS l_data virtual_date_table_type := virtual_date_table_type(); l_step NUMBER := 1; BEGIN l_step := (p_end_date - p_start_date) / p_num_rows; FOR i IN 1 .. p_num_rows LOOP l_data.extend; l_data(l_data.count) := p_start_date + i * l_step; END LOOP; RETURN l_data; END; /Результат выборки:
num | name 1 | value1 3 | value3 3 | value3 3 | value3
С 12 версии есть стандартный вариант: Create a lateral inline view in a query
Подписаться на:
Сообщения (Atom)