Использую поле Double Field. Там 2 суб-поля. (доп. "2" и "руб.")
Надо получить данные этих суб-полей для расчетов в другом поле.
Использую Computed Field
$entity_field[0]['value'] = array_pop(array_pop(field_get_items($entity_type, $entity, 'field_a')))
оно выдает последнее (значение массива) - "руб."
как получить предпоследнее? - "2"
Если можно также пример как это сделать без Computed Field - кодом PHP в поле.
Комментарии
> array_pop(array_pop
Зачем два раза?
так по инструкции самого Computed Feild, - прямо в описании поля дан такой пример.
зачем - не знаю. но по другому не работает.
но вопрос в другом как получить определенный элемент массива, если о нем известно что он предпоследний а массиве?
end($field_items);
$penult_item = prev($field_items);
наверное имелось ввиду так:
$field_items = field_get_items($entity_type, $entity, 'field_price3');
$penult_item = prev($field_items);
print_r($penult_item);
?>
но тоже ничего не дало
Вот описание поля.
The variables available to your code include: &$entity_field, $entity_type, $entity, $field, $instance, $langcode, and $items. To set the value of the field, set $entity_field[0]['value']. For multi-value computed fields continue with $entity_field[1]['value']. Here's a simple example which sets the computed field's value to the value of the sum of the number fields (field_a and field_b) in a node entity:
$entity_field[0]['value'] = array_pop(array_pop(field_get_items($entity_type, $entity, 'field_a'))) + array_pop(array_pop(field_get_items($entity_type, $entity, 'field_b'))); The first pop fetches the last (or only) item from the field while the second pop fetches its ['value'] contents (assuming it's the only key that's set).
Alternately, this code can be supplied by your own custom function named: computed_field_field_sum3_compute(&$entity_field, $entity_type, $entity, $field, $instance, $langcode, $items)
по идее чтоб получить значения доп.суб-полей надо испольловать $entity_field[1]['value'] - но все равно выдает только первое поле (последнее в массиве)
имелось ввиду то что было написано
что выводит код?
end($field_items);
$penult_item = prev($field_items);
print_r($penult_item);
так тоже пробовал - ничего не выдало в поле
только ворнинги
Warning: end() [function.end]: Passed variable is not an array or object в функции eval() (строка 3 в файле C:\OpenServer\domains\localhost\xxxxxx.org\modules\php\php.module(80) : eval()'d code).
это если вставлять в поле c PHP кодом
в Computed field - там все через $entity_field[0]['value'] делать надо (по конструкции модуля)
попробовал
в поле - Computed Code (PHP):
$field_items = field_get_items($entity_type, $entity, 'field_price3');
end($field_items);
$penult_item = prev($field_items);
$entity_field[0]['value'] =$penult_item;
в поле - Display Code (PHP):
$display_output = $entity_field_item['value'];
тоже ничего не дало в поле
только ворнинги
Warning: urlencode() expects parameter 1 to be string, array given в функции eval() (строка 1 в файле C:\OpenServer\domains\localhost\xxxxxxxxxx.org\sites\all\modules\computed_field\computed_field.module(394) : eval()'d code).
будто бы просто дело - скопировать поле
Сделал через токены (по вашей подсказке из http://www.drupal.ru/node/107354#comment-597732)
<?php
if (arg(0) == 'node' && ctype_digit(arg(1))) {
$node = menu_get_object();
$price_first = token_replace('[node:field-price:first]', array('node' => $node));
}
print_r($price_first);
?>
Нашел такое описание по токену Double Field
Field "field_price". The following properties may be appended to the token: first (First subfield), second (Second subfield)
[node:field-price:first] - для первого суб-поля
[node:field-price:second] - для второго суб-поля
важно что надо было указывать название поля (с дефисом), а не его машинное имя с подчеркиванием как обычно.
Решено.
Зачем те сурово то? Оба значения можно получить через field_get_items().
Можно, но не понятно как. Предложите рабочую конструкцию.
<?php
$items = field_get_items($entity_type, $entity, 'field_a');
print $items[0]['first']; // Первое значение
print $items[0]['second']; // Последнее значение
?>
не вышло.
вставил как есть:
Notice: Undefined variable: entity_type в функции eval() (строка 2 в файле C:\OpenServer\domains\clean\modules\php\php.module(80) : eval()'d code).
Notice: Undefined variable: entity в функции eval() (строка 2 в файле C:\OpenServer\domains\clean\modules\php\php.module(80) : eval()'d code).
Notice: Undefined index: entity keys в функции entity_extract_ids() (строка 7715 в файле C:\OpenServer\domains\clean\includes\common.inc).
Notice: Undefined index: entity keys в функции entity_extract_ids() (строка 7716 в файле C:\OpenServer\domains\clean\includes\common.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined index: field_name в функции field_language() (строка 278 в файле C:\OpenServer\domains\clean\modules\field\field.multilingual.inc).
Notice: Undefined variable: entity_type в функции eval() (строка 2 в файле C:\OpenServer\domains\clean\modules\php\php.module(80) : eval()'d code).
Notice: Undefined variable: entity в функции eval() (строка 2 в файле C:\OpenServer\domains\clean\modules\php\php.module(80) : eval()'d code).
Notice: Undefined index: entity keys в функции entity_extract_ids() (строка 7715 в файле C:\OpenServer\domains\clean\includes\common.inc).
Notice: Undefined index: entity keys в функции entity_extract_ids() (строка 7716 в файле C:\OpenServer\domains\clean\includes\common.inc).
попробовал так же вставить в Computed Field:
$items = array_pop(array_pop(field_get_items($entity_type, $entity, 'field_price')));
$entity_field[0]['value'] = $items[0]['first'];
Fatal error: Cannot use string offset as an array in C:\OpenServer\domains\clean\sites\all\modules\modules\computed_field\computed_field.module(394) : eval()'d code on line 2
Жаль что Computed Field нивкакую не работает, он не дает поле для редактирования пользователю.
php поле надо будет как-то закрыть скрыть от редактирования но при этом отобразить в ноде
(делается в https://drupal.org/project/nodeformcols)
а почему вместо Computed Feild не использовать для этого hook_node_presave
проще перед сохранением ноды вычислить значение и вставить его в нужное поле , чем Computed Feild будет его постоянно рассчитывать