Hooks: различия между версиями
Kondin (обсуждение | вклад) (Новая страница: «Логика пользовательских обработчиков в следующем: в каталоге шаблона создается подката…») |
Kondin (обсуждение | вклад) |
||
(не показано 17 промежуточных версий этого же участника) | |||
Строка 4: | Строка 4: | ||
Внутри файла должно быть такое содержание:<br /> | Внутри файла должно быть такое содержание:<br /> | ||
− | + | <pre> | |
<nowiki> | <nowiki> | ||
<?php | <?php | ||
Строка 13: | Строка 13: | ||
return $value; | return $value; | ||
} | } | ||
− | </nowiki><br /> | + | </nowiki> |
− | + | </pre> | |
− | Функция BeforPrintOptionName_getCategorySelectBoxWithName будет выполняться перед выводом заголовка в select_box_structure, для того чтобы мы могли поменять название пункта с Найти квартиру на Аренда квартир.<br /> | + | <br /> |
+ | ===BeforPrintOptionName_getCategorySelectBoxWithName=== | ||
+ | Функция '''BeforPrintOptionName_getCategorySelectBoxWithName''' будет выполняться перед выводом заголовка в select_box_structure, для того чтобы мы могли поменять название пункта с Найти квартиру на Аренда квартир.<br /> | ||
Строка 23: | Строка 25: | ||
Этой функцией:<br /> | Этой функцией:<br /> | ||
− | + | <pre> | |
<nowiki> | <nowiki> | ||
function load_hooks () { | function load_hooks () { | ||
Строка 31: | Строка 33: | ||
} | } | ||
</nowiki> | </nowiki> | ||
+ | </pre> | ||
<br /> | <br /> | ||
− | В дальнейшем при выполнении генерации списка для select_box выполняется код проверки наличия пользовательской функции BeforPrintOptionName_getCategorySelectBoxWithName и если она есть, то ей передается аргумент, а на выходе получаем значение измененного аргумента. | + | В дальнейшем при выполнении генерации списка для select_box выполняется код проверки наличия пользовательской функции BeforPrintOptionName_getCategorySelectBoxWithName и если она есть, то ей передается аргумент, а на выходе получаем значение измененного аргумента.<br> |
+ | Пример выполнения:<br> | ||
+ | <pre> | ||
+ | <nowiki> | ||
+ | if (function_exists('BeforPrintOptionName_getCategorySelectBoxWithName') ) { | ||
+ | $option_title = BeforPrintOptionName_getCategorySelectBoxWithName($category_structure['catalog'][$categoryID]['name']); | ||
+ | } else { | ||
+ | $option_title = $category_structure['catalog'][$categoryID]['name']; | ||
+ | } | ||
+ | </nowiki> | ||
+ | </pre> | ||
+ | ===onGridConditionsPrepare_hook=== | ||
+ | '''onGridConditionsPrepare_hook''' - вызывается во время формирования условий для выборки данных.<br> | ||
+ | Пример использования: исключаем из вывода в личном кабинете apps.data объявления принадлежащие пользователю с user_id=888 | ||
+ | <pre> | ||
+ | <nowiki> | ||
+ | function onGridConditionsPrepare_hook($context, $params) { | ||
+ | if ( $context->table_name == 'data' ) { | ||
+ | $params['grid_conditions_sql'][] = "user_id <> 888"; | ||
+ | } | ||
+ | return $params; | ||
+ | } | ||
+ | </nowiki> | ||
+ | </pre> | ||
+ | |||
+ | ===BeforeDuplicate=== | ||
+ | '''BeforeDuplicate''' - вызывается перед созданием дубля объявления.<br> | ||
+ | Пример использования: если lot_number является уникальным ключом, то при дублировании мы добавляем к нему числовой идентификатор, чтобы сохранить уникальность ключа для новой записи.<br> | ||
+ | <pre> | ||
+ | <nowiki> | ||
+ | /** | ||
+ | * Функция может менять значения в массиве перед созданием нового дубля | ||
+ | */ | ||
+ | function BeforeDuplicate( $form_data ) { | ||
+ | foreach ($form_data as $k => $item) { | ||
+ | if ($item['name'] == 'lot_number') { | ||
+ | $form_data[$k]['value'] .= '-' . time(); | ||
+ | } | ||
+ | } | ||
+ | return $form_data; | ||
+ | } | ||
+ | </nowiki> | ||
+ | </pre> | ||
+ | |||
+ | ===custom_admin_search_fields=== | ||
+ | '''custom_admin_search_fields''' - Добавляем новый параметр поиска в форму расширенного поиска в админке в объявлениях.<br> | ||
+ | <pre> | ||
+ | <nowiki> | ||
+ | function custom_admin_search_fields ( $smarty ) { | ||
+ | return '<tr><td>Мое поле</td><td> <input type="text" name="moe_pole" id="moe_pole" value="'.$_REQUEST['moe_pole'].'" /></td></tr>'; | ||
+ | } | ||
+ | </nowiki> | ||
+ | </pre> | ||
+ | Этот параметр затем можно добавлять в поиск с помощью template_search.php https://www.sitebill.ru/s/topic/241-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BD%D0%BE%D0%B2%D1%8B%D0%B5-%D0%BF%D0%BE%D0%BB%D1%8F-%D0%B2-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-template_search-%D0%B8-%D0%B4%D1%80/ | ||
+ | <br> | ||
+ | |||
+ | ===BeforePrintGridItem=== | ||
+ | '''BeforePrintGridItem''' - выполняет обработку массива данных строки записи перед выводом в таблицу<br> | ||
+ | В данном примере функция принимает массив текущей строки данных $row_data и выполняет проверку идентификатора владельца этого объявления с идентификатором пользователя из сессии, если они различаются, тогда заменяется значение поля телефон (phone) на "скрыт". Т.е. реализуется логика скрытия контактов собственников от всех кроме владельца объявления. | ||
+ | <pre> | ||
+ | <nowiki> | ||
+ | function BeforePrintGridItem ( $row_data, $control_params ) { | ||
+ | if ( $row_data['user_id']['value'] != $_SESSION['user_id_value'] ) { | ||
+ | $row_data['phone']['value'] = 'скрыт'; | ||
+ | } | ||
+ | return $row_data; | ||
+ | } | ||
+ | </nowiki> | ||
+ | </pre> | ||
+ | |||
+ | ===api_model_get_data_grid_conditions_sql($model_name)=== | ||
+ | '''api_model_get_data_grid_conditions_sql($model_name)''' - генерирует дополнительные sql-параметры для выборки данных при обращении к методу api::model::get_data<br> | ||
+ | Пример реализации: | ||
+ | <pre> | ||
+ | <nowiki> | ||
+ | |||
+ | function api_model_get_data_grid_conditions_sql ($model_name) { | ||
+ | if ( $model_name == 'client' ) { | ||
+ | $ra = array( | ||
+ | 'type_id' => "re_client.type_id in ('ipoteka', 'sellа', 'zayavka', 'podbor', 'soprovozhdenie')" | ||
+ | ); | ||
+ | return $ra; | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
+ | </nowiki> | ||
+ | </pre> | ||
+ | |||
+ | ===yandex_data_hook=== | ||
+ | '''yandex_data_hook''' - преобразование массива пользовательской информации. Перехват идет в функции exSalesAgent($data_item)<br> | ||
+ | \apps\yandexrealty\site\site.php | ||
+ | |||
+ | <pre> | ||
+ | <nowiki> | ||
+ | function yandex_data_hook ($data_item) { | ||
+ | return $data_item; | ||
+ | } | ||
+ | </nowiki> | ||
+ | </pre> | ||
+ | ===square_composed=== | ||
+ | square_composed - пример функции для формирования [[Типы_элементов_форм#compose|вычисляемой колонки]] (выводим площадь в формате /X/Y/Z/ | ||
+ | <pre> | ||
+ | <nowiki> | ||
+ | function square_composed ($model, $key) { | ||
+ | $columns = explode(',', $model[$key]['parameters']['columns']); | ||
+ | $separator = $model[$key]['parameters']['separator']; | ||
+ | if ( $separator == '' ) { | ||
+ | $separator = ', '; | ||
+ | } | ||
+ | |||
+ | foreach ( $columns as $idx => $column_item ) { | ||
+ | if ( $model[$column_item]['value_string'] != '' ) { | ||
+ | $composed_items[$column_item] = $model[$column_item]['value_string']; | ||
+ | } elseif ( $model[$column_item]['value'] != '' and $model[$column_item]['value'] != 0) { | ||
+ | $composed_items[$column_item] = $model[$column_item]['value']; | ||
+ | } else { | ||
+ | $composed_items[$column_item] = '-'; | ||
+ | } | ||
+ | } | ||
+ | $value = implode($separator, $composed_items); | ||
+ | |||
+ | |||
+ | return $value; | ||
+ | } | ||
+ | </nowiki> | ||
+ | </pre> |
Текущая версия на 08:30, 10 июня 2020
Логика пользовательских обработчиков в следующем: в каталоге шаблона создается подкаталог hooks в, в который нужно поместить файл hooks.php
/template/frontend/ваш_шаблон/hooks/hooks.php
Внутри файла должно быть такое содержание:
<?php function BeforPrintOptionName_getCategorySelectBoxWithName ( $value ) { if ( $value == 'Найти квартиру' ) { $value = 'Аренда квартир'; } return $value; }
Содержание
BeforPrintOptionName_getCategorySelectBoxWithName
Функция BeforPrintOptionName_getCategorySelectBoxWithName будет выполняться перед выводом заголовка в select_box_structure, для того чтобы мы могли поменять название пункта с Найти квартиру на Аренда квартир.
Эти функции из файла hooks загружаются в процессе обработки модулем
/apps/system/lib/system/apps/apps_processor.php
Этой функцией:
function load_hooks () { if ( file_exists(SITEBILL_DOCUMENT_ROOT.'/template/frontend/'.$this->getConfigValue('theme').'/hooks'.'/hooks.php') ) { include_once (SITEBILL_DOCUMENT_ROOT.'/template/frontend/'.$this->getConfigValue('theme').'/hooks'.'/hooks.php'); } }
В дальнейшем при выполнении генерации списка для select_box выполняется код проверки наличия пользовательской функции BeforPrintOptionName_getCategorySelectBoxWithName и если она есть, то ей передается аргумент, а на выходе получаем значение измененного аргумента.
Пример выполнения:
if (function_exists('BeforPrintOptionName_getCategorySelectBoxWithName') ) { $option_title = BeforPrintOptionName_getCategorySelectBoxWithName($category_structure['catalog'][$categoryID]['name']); } else { $option_title = $category_structure['catalog'][$categoryID]['name']; }
onGridConditionsPrepare_hook
onGridConditionsPrepare_hook - вызывается во время формирования условий для выборки данных.
Пример использования: исключаем из вывода в личном кабинете apps.data объявления принадлежащие пользователю с user_id=888
function onGridConditionsPrepare_hook($context, $params) { if ( $context->table_name == 'data' ) { $params['grid_conditions_sql'][] = "user_id <> 888"; } return $params; }
BeforeDuplicate
BeforeDuplicate - вызывается перед созданием дубля объявления.
Пример использования: если lot_number является уникальным ключом, то при дублировании мы добавляем к нему числовой идентификатор, чтобы сохранить уникальность ключа для новой записи.
/** * Функция может менять значения в массиве перед созданием нового дубля */ function BeforeDuplicate( $form_data ) { foreach ($form_data as $k => $item) { if ($item['name'] == 'lot_number') { $form_data[$k]['value'] .= '-' . time(); } } return $form_data; }
custom_admin_search_fields
custom_admin_search_fields - Добавляем новый параметр поиска в форму расширенного поиска в админке в объявлениях.
function custom_admin_search_fields ( $smarty ) { return '<tr><td>Мое поле</td><td> <input type="text" name="moe_pole" id="moe_pole" value="'.$_REQUEST['moe_pole'].'" /></td></tr>'; }
Этот параметр затем можно добавлять в поиск с помощью template_search.php https://www.sitebill.ru/s/topic/241-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BD%D0%BE%D0%B2%D1%8B%D0%B5-%D0%BF%D0%BE%D0%BB%D1%8F-%D0%B2-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-template_search-%D0%B8-%D0%B4%D1%80/
BeforePrintGridItem
BeforePrintGridItem - выполняет обработку массива данных строки записи перед выводом в таблицу
В данном примере функция принимает массив текущей строки данных $row_data и выполняет проверку идентификатора владельца этого объявления с идентификатором пользователя из сессии, если они различаются, тогда заменяется значение поля телефон (phone) на "скрыт". Т.е. реализуется логика скрытия контактов собственников от всех кроме владельца объявления.
function BeforePrintGridItem ( $row_data, $control_params ) { if ( $row_data['user_id']['value'] != $_SESSION['user_id_value'] ) { $row_data['phone']['value'] = 'скрыт'; } return $row_data; }
api_model_get_data_grid_conditions_sql($model_name)
api_model_get_data_grid_conditions_sql($model_name) - генерирует дополнительные sql-параметры для выборки данных при обращении к методу api::model::get_data
Пример реализации:
function api_model_get_data_grid_conditions_sql ($model_name) { if ( $model_name == 'client' ) { $ra = array( 'type_id' => "re_client.type_id in ('ipoteka', 'sellа', 'zayavka', 'podbor', 'soprovozhdenie')" ); return $ra; } return false; }
yandex_data_hook
yandex_data_hook - преобразование массива пользовательской информации. Перехват идет в функции exSalesAgent($data_item)
\apps\yandexrealty\site\site.php
function yandex_data_hook ($data_item) { return $data_item; }
square_composed
square_composed - пример функции для формирования вычисляемой колонки (выводим площадь в формате /X/Y/Z/
function square_composed ($model, $key) { $columns = explode(',', $model[$key]['parameters']['columns']); $separator = $model[$key]['parameters']['separator']; if ( $separator == '' ) { $separator = ', '; } foreach ( $columns as $idx => $column_item ) { if ( $model[$column_item]['value_string'] != '' ) { $composed_items[$column_item] = $model[$column_item]['value_string']; } elseif ( $model[$column_item]['value'] != '' and $model[$column_item]['value'] != 0) { $composed_items[$column_item] = $model[$column_item]['value']; } else { $composed_items[$column_item] = '-'; } } $value = implode($separator, $composed_items); return $value; }