Помогите разобраться в API Field. Мне нужно сделать собственное поле - custom field, состоящее из 3частей (первые два вводит пользователь при создании ноды, а третий - результат, зависящий от ввода первых двух).
В каком месте и что использовать, чтобы успеть вычислить третью часть перед сохранением ноды? Поле потенциально используется в разных типа сущностей?
Custom Field
Главные вкладки
Лучший ответ
Семен Семеныч... все так просто оказалось...
Нужно просто при создании плагина в FieldType добавить функцию setValue и делать в ней что хочешь
Спасибо всем за участие.
Комментарии
Если нужно показать значение третьего поля в форме создания ноды, то поможет ajax. А если просто вычислить значение перед созданием ноды, то хуки
вот я как раз хочу понять для поля, что использовать - какие хуки? По идее то решение должно быть универсальным - на уровне поля.? Была мысль в плагинах, при описании FieldWidget, в функции formElement указать для элемента
$element['#value_callback'] = array($this, 'valueCallback');
и соответственно пытаться установить результат вычислений в функции valueCallback, но что то не выходит каменный цветок...Examples for Developers
А нужно ли собственное если есть https://www.drupal.org/project/computed_field ?
разобраться хочу
Поле вычисляемое, под Вашу задачу.
А вот не факт. Если по третьему значению надо фильтровать-сортировать, то это значение должно быть вычислено заранее, и лежать в базе.
А вот не факт, что не факт! Можно написать вьюс-хэндлер для этого поля, который будет в запрос добавлять expression с выражением, а считать уже сам MySQL будет на лету.
ну дорого же получится
Дорого только если искать спеца, который умеет это делать)) А с точки зрения производительности практически без разницы, но при условии, что там нужны арифметические операции.
У меня, к примеру есть проект, в котором выбираются ближайшие по расположению материалы при помощи вот такого кода:
<?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');
?>
И никаких вопросов с производительностью.
А много записей?
Только по этому типу нод около 20.000. Вообще заметил такую штуку, что mysql довольно быстро работает с числовыми значениями. Но как только нужно делать поиск по частичному совпадению текста, производительность падает в десятки раз и тогда выручает только Solr или что-то подобное.
интересный кейс, спасибо
https://www.drupal.org/project/computed_field
...
You can also choose whether to store your computed field values in the database with other content fields, or have them "calculated" on the fly during node views.
...
Ковырните Link field какой нибудь, там все по полочкам уже разложено. Ну, и воспроизведите, проецируя на свою логику.
Это вот этот например linked_field?
Link
Семен Семеныч... все так просто оказалось...
Нужно просто при создании плагина в FieldType добавить функцию setValue и делать в ней что хочешь
Спасибо всем за участие.