Hooks: различия между версиями

Материал из CMS Sitebill Wiki
Перейти к навигации Перейти к поиску
 
(не показано 11 промежуточных версий этого же участника)
Строка 16: Строка 16:
 
</pre>
 
</pre>
 
<br />
 
<br />
 
+
===BeforPrintOptionName_getCategorySelectBoxWithName===
Функция BeforPrintOptionName_getCategorySelectBoxWithName будет выполняться перед выводом заголовка в select_box_structure, для того чтобы мы могли поменять название пункта с Найти квартиру на Аренда квартир.<br />
+
Функция '''BeforPrintOptionName_getCategorySelectBoxWithName''' будет выполняться перед выводом заголовка в select_box_structure, для того чтобы мы могли поменять название пункта с Найти квартиру на Аренда квартир.<br />
  
  
Строка 44: Строка 44:
 
} else {
 
} else {
 
     $option_title = $category_structure['catalog'][$categoryID]['name'];
 
     $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>
 
</nowiki>
 
</pre>
 
</pre>
  
 +
===BeforeDuplicate===
 
'''BeforeDuplicate''' - вызывается перед созданием дубля объявления.<br>
 
'''BeforeDuplicate''' - вызывается перед созданием дубля объявления.<br>
 
Пример использования: если lot_number является уникальным ключом, то при дублировании мы добавляем к нему числовой идентификатор, чтобы сохранить уникальность ключа для новой записи.<br>
 
Пример использования: если lot_number является уникальным ключом, то при дублировании мы добавляем к нему числовой идентификатор, чтобы сохранить уникальность ключа для новой записи.<br>
Строка 62: Строка 76:
 
     }
 
     }
 
     return $form_data;
 
     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>
 
</nowiki>
 
</pre>
 
</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;
}