Custom Field

Аватар пользователя mikl_w mikl_w 19 сентября в 22:10

Помогите разобраться в API Field. Мне нужно сделать собственное поле - custom field, состоящее из 3частей (первые два вводит пользователь при создании ноды, а третий - результат, зависящий от ввода первых двух).
В каком месте и что использовать, чтобы успеть вычислить третью часть перед сохранением ноды? Поле потенциально используется в разных типа сущностей?

0 Thanks

Лучший ответ

Аватар пользователя mikl_w mikl_w 20 сентября в 14:09

Семен Семеныч... :-) все так просто оказалось...
Нужно просто при создании плагина в FieldType добавить функцию setValue и делать в ней что хочешь :-)
Спасибо всем за участие.

Комментарии

Аватар пользователя ivnish ivnish 19 сентября в 22:13

Если нужно показать значение третьего поля в форме создания ноды, то поможет ajax. А если просто вычислить значение перед созданием ноды, то хуки

Аватар пользователя mikl_w mikl_w 20 сентября в 12:14

вот я как раз хочу понять для поля, что использовать - какие хуки? По идее то решение должно быть универсальным - на уровне поля.? Была мысль в плагинах, при описании FieldWidget, в функции formElement указать для элемента
 $element['#value_callback'] = array($this, 'valueCallback'); и соответственно пытаться установить результат вычислений в функции valueCallback, но что то не выходит каменный цветок...

Аватар пользователя Andruxa Andruxa 20 сентября в 17:35

А вот не факт. Если по третьему значению надо фильтровать-сортировать, то это значение должно быть вычислено заранее, и лежать в базе.

Аватар пользователя gun_dose gun_dose 20 сентября в 17:42

А вот не факт, что не факт! Можно написать вьюс-хэндлер для этого поля, который будет в запрос добавлять expression с выражением, а считать уже сам MySQL будет на лету.

Аватар пользователя gun_dose gun_dose 20 сентября в 18:15

Дорого только если искать спеца, который умеет это делать)) А с точки зрения производительности практически без разницы, но при условии, что там нужны арифметические операции.
У меня, к примеру есть проект, в котором выбираются ближайшие по расположению материалы при помощи вот такого кода:

<?php
$query
->addExpression('6371 * acos( cos( radians(' $lat ') ) * cos( radians( n.field_location_lat ) ) * cos( radians( n.field_location_lon ) - radians(' $lon ') ) + sin( radians(' $lat ') ) * sin( radians( n.field_location_lat ) ) )''distance');
?>

И никаких вопросов с производительностью.

Аватар пользователя gun_dose gun_dose 20 сентября в 18:45
1

Только по этому типу нод около 20.000. Вообще заметил такую штуку, что mysql довольно быстро работает с числовыми значениями. Но как только нужно делать поиск по частичному совпадению текста, производительность падает в десятки раз и тогда выручает только Solr или что-то подобное.

Аватар пользователя bumble bumble 20 сентября в 12:23

Ковырните Link field какой нибудь, там все по полочкам уже разложено. Ну, и воспроизведите, проецируя на свою логику.

Аватар пользователя mikl_w mikl_w 20 сентября в 14:09

Семен Семеныч... :-) все так просто оказалось...
Нужно просто при создании плагина в FieldType добавить функцию setValue и делать в ней что хочешь :-)
Спасибо всем за участие.