Получить первое поле из Double Fields

Главные вкладки

Аватар пользователя Kottov Kottov 3 февраля 2014 в 3:03

Использую поле 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 в поле.

Комментарии

Аватар пользователя Kottov Kottov 4 февраля 2014 в 2:50

"Ch" wrote:
> array_pop(array_pop
Зачем два раза?

так по инструкции самого Computed Feild, - прямо в описании поля дан такой пример.
зачем - не знаю. но по другому не работает.

но вопрос в другом как получить определенный элемент массива, если о нем известно что он предпоследний а массиве?

Аватар пользователя Kottov Kottov 4 февраля 2014 в 5:31

Вот описание поля.
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'] - но все равно выдает только первое поле (последнее в массиве)

Аватар пользователя drupby drupby 4 февраля 2014 в 6:02

"Kottov" wrote:
наверное имелось ввиду так:

имелось ввиду то что было написано
что выводит код?

$field_items = field_get_items($entity_type, $entity, 'field_a');
end($field_items);
$penult_item = prev($field_items);
print_r($penult_item);
Аватар пользователя Kottov Kottov 16 июля 2014 в 13:22

так тоже пробовал - ничего не выдало в поле

только ворнинги
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).

будто бы просто дело - скопировать поле Sad

Аватар пользователя Kottov Kottov 6 февраля 2014 в 4:46

Сделал через токены (по вашей подсказке из 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] - для второго суб-поля

важно что надо было указывать название поля (с дефисом), а не его машинное имя с подчеркиванием как обычно.

Решено.

Аватар пользователя Kottov Kottov 6 февраля 2014 в 14:27

"Ch" wrote:
Зачем те сурово то? Оба значения можно получить через field_get_items().

Можно, но не понятно как. Предложите рабочую конструкцию.

Аватар пользователя Ch Ch 6 февраля 2014 в 18:08
<?php
$items 
field_get_items($entity_type$entity'field_a');
print 
$items[0]['first']; // Первое значение
print $items[0]['second']; // Последнее значение
?>
Аватар пользователя Kottov Kottov 7 февраля 2014 в 2:41

не вышло.
вставил как есть:

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)

Аватар пользователя drupby drupby 7 февраля 2014 в 3:34

"Kottov" wrote:
Надо получить данные этих суб-полей для расчетов в другом поле.

а почему вместо Computed Feild не использовать для этого hook_node_presave
проще перед сохранением ноды вычислить значение и вставить его в нужное поле , чем Computed Feild будет его постоянно рассчитывать