[Решено] Арифметическое действие с полями [модуль Computed Field]

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

Аватар пользователя molp molp 30 июня 2010 в 9:15

Подскажите как реализовать данный функционал.
Каждая нода имеет поле (cck) с ценой. На сайте в настройках требуется указывать коэффициент, который будет использоваться в арифметическом действии с числовым значением (ценой) и нужно поле для вывода результата.

Комментарии

Аватар пользователя molp molp 2 июля 2010 в 9:25

Подскажите как правильно создать форму ввода этакого коэффициента для админа? Тоесть это должен быть или блок или отдельная страница где будет поле для смены значения.

Аватар пользователя molp molp 2 июля 2010 в 15:39

Вообще по модулю http://drupal.org/project/computed_field]Computed Field">Computed">http://drupal.org/project/computed_field]Computed Field информация практически отсуствует. Нашел статью в которой автор говорит «тем кто не понимает в PHP ничего - не стоит лезть в этот модуль». Чтож с php буду разбираться сам, а вас очень попрошу просто рассказать как работает данный модуль. Или какие настройки мне нужно задействовать для своей задачи.

Еще раз подробно про то что нужно сделать.

1. При добавлении содержимого в нем будет заполняться поле с числовым значением (цена).
2. Необходимо место (лучше блок) с полем в которое администратор сможет вносить значение (коэффициент).
3. При просмотре записи рядом с ценой должно отображаться поле с результатом вычисления (цена умноженная на коэффициент)

Аватар пользователя molp molp 6 июля 2010 в 16:10

Помогите найти ошибку:

Вначале я создам место в котором будет задаваться коэффициент

1. Создание нового типа материала (kurs)
2. Добавление к типу kurs поля field_koefecient
3. Создание записи типа материала kurs и ввод значения в поле field_koefecient

Затем настраиваю поле Computed Field которое будет перемножать значение из поля field_koefecient со значением из поля field_cena

4. Добавление к типу материалов tovar (с заполненным при создании полем field_cena) поля Computed и настройка:

Computed Code:
$node_field[0]['value'] = $node->field_koefecient[0]['value'] * $node->field_cena[0]['value'];

Display Format:
$display = '' . $node_field_item['value'];

Store using the database settings below: check

Data Type: float

Data Length: 10 ?

Default Value: 0.00

Not NULL: check

Sortable: check

Данный способ не работает.
Очень прошу помочь найти ошибку.

Аватар пользователя Dimm Dimm 7 июля 2010 в 20:30

molp wrote:
Помогите найти ошибку:

Вначале я создам место в котором будет задаваться коэффициент

1. Создание нового типа материала (kurs)
2. Добавление к типу kurs поля field_koefecient
3. Создание записи типа материала kurs и ввод значения в поле field_koefecient

Затем настраиваю поле Computed Field которое будет перемножать значение из поля field_koefecient со значением из поля field_cena

4. Добавление к типу материалов tovar (с заполненным при создании полем field_cena) поля Computed и настройка:

Computed Code:
$node_field[0]['value'] = $node->field_koefecient[0]['value'] * $node->field_cena[0]['value'];

Display Format:
$display = '' . $node_field_item['value'];

Store using the database settings below: check

Data Type: float

Data Length: 10 ?

Default Value: 0.00

Not NULL: check

Sortable: check

Данный способ не работает.
Очень прошу помочь найти ошибку.

Вроде все правильно.
Что именно не работает?

Аватар пользователя molp molp 7 июля 2010 в 16:41

Computed Code:
$node_field[0]['value']  = $node->field_koefecient[0]['value'] .'*'.  $node->field_cena[0]['value'];

Display Format:
$display = $node_field_item['value'];

Пытаюсь пересохранить ноду но выдает ошибку
Parse error: syntax error, unexpected '<' in Z:\home\sitename\www\sites\all\modules\computed_field\computed_field.module(161) : eval()'d code on line 1

Аватар пользователя Dan Dan 7 июля 2010 в 18:16

"molp" wrote:
$node_field[0]['value'] = $node->field_koefecient[0]['value'] .'*'. $node->field_cena[0]['value'];

Не надо использовать коннектацию строк, иначе выйдет строка, а не число. Вариант из предыдущего коммента был правильный.

"molp" wrote:
Parse error: syntax error, unexpected '<' in Z:\home\sitename\www\sites\all\modules\computed_field\computed_field.module(161) : eval()'d code on line 1

Очевидно Вы оборачиваете код в <?php ?>, не помню надо ли это. Попробуйте без этого.

Аватар пользователя direqtor direqtor 8 июля 2010 в 3:46

"molp" wrote:
$node_field[0]['value'] = $node->field_koefecient[0]['value'] * $node->field_cena[0]['value'];
Может поможет превращение переменных во float

$node_field[0]['value'] = (float) $node->field_koefecient[0]['value'] * (float) $node->field_cena[0]['value'];
<code>
Аватар пользователя molp molp 8 июля 2010 в 16:51

"Dimm" wrote:
Вроде все правильно.
Что именно не работает?

Результат всегда один - "ноль".

Пробовал воспользоваться советом direqtor - результат тот же.

Может я не правильно поля создавал?
Цена - Integer, Text field
Курс - Integer - Text field

Хотя это моя вторая попытка первый раз с Decimal пробовал и c float было все тоже самое.

При попытке внести изменения в существующий материал получаю:
Parse error: syntax error, unexpected '<' in Z:\home\site\www\sites\all\modules\computed_field\computed_field.module(161) : eval()'d code on line 1
При обновлении страницы:
Содержимое было изменено другим пользователем, изменения не удается сохранить.

Может ли это быть связано с установленным FCKeditor которое оказывает влияние на поле Computed Code:?

Поле Display Format: имеет описание: This code should assign a string to the $display variable, which will be printed as the value of the field. The stored value of the field is in $node_field_item['value']. Note: this code has no effect if you use the "Computed Value" formatter option. Alternately, this code can be supplied by your own custom function named computed_field_field_kurs_rezultat_display().

Тут в конце что то интересное но не совсем понятное.

Еще возможно вот это подскажет - при попытке сгенерировать содержимое при помощи Devel получаю:
Возникла ошибка. \n/batch?id=10&op=do\n
Parse error: syntax error, unexpected '<' in Z:\home\site\www\sites\all\modules\computed_field\computed_field.module(161) : eval()'d code on line 1

Parse error: syntax error, unexpected '<' in Z:\home\site\www\sites\all\modules\computed_field\computed_field.module(161) : eval()'d code on line 1
{ "status": true, "percentage": 36, "message": "Осталось 14 из 22.\x3cbr/\x3e\x26nbsp" }

Аватар пользователя molp molp 8 июля 2010 в 17:44

"direqtor" wrote:
А у вас в поле computed field случайно FCKeditor не стоит?

"molp" wrote:
Может ли это быть связано с установленным FCKeditor которое оказывает влияние на поле Computed Code:?

Как видите да это поле (а именно поле настроек "Computed Code" если я вас правильно понял) обрабатывается FCKeditor`ом. Но где отключить эту обработку? Я экспериментировал с отключением некоторых фильтров в "Форматы ввода" но так ничего и не добился. Хотя тогда торопился и мог что то пропустить.

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

Аватар пользователя Dan Dan 8 июля 2010 в 20:35

"molp" wrote:
Так же стоит отметить что для этого поля (Computed Code) нельзя выбрать формат ввода так как к примеру при создании нод.

А на кой чёрт там выбирать формат ввода? Там должен быть голый текст.
Отключите fuckeditor как угодно, ссылкой под ним, в настройках самого редактора, или модуль напрочь.

Аватар пользователя molp molp 8 июля 2010 в 20:50

"Dan" wrote:
А на кой чёрт там выбирать формат ввода? Там должен быть голый текст.

Чтобы выбрать формат который не будет преобразовывать мой код ни во что кроме как в голый текст.

Как его для данного поля отключить? В настройках самого редактора это в Edit FCKeditor Global profile? Visibility settings добавлением Fields to exclude/include?

Аватар пользователя Dan Dan 8 июля 2010 в 21:33

"molp" wrote:
Чтобы выбрать формат который не будет преобразовывать мой код ни во что кроме как в голый текст.

Там уже голый текст стоит и форматы не предусмотрены. А вот то что какой-то редактор суёт себя во все поля админки - это сугубо проблемы админа.

Аватар пользователя direqtor direqtor 9 июля 2010 в 9:49

По умолчанию FCK Editor суёт себя во все текстовые поля. Но внизу появляется инфа об адресе страницы и ID формы. Настройте в Global Profile редактора исключение для ID этой формы.

Аватар пользователя molp molp 9 июля 2010 в 12:44

Добавил в настройках FCKeditor: FCKeditor Global Profile - Visibility settings - Fields to exclude/include: строку admin/content/node-type/название-типа-материала/fields/field_kurs_rezultat.edit-code

Поле Computed Code теперь не форматируется. Ошибок после изменения материала нет. Но результат все ровно "0", то есть то что я указал в Default Value.

Может нужно как то иначе построить Display Format? Там ниже поля существует подсказка:
This code should assign a string to the $display variable, which will be printed as the value of the field. The stored value of the field is in $node_field_item['value']. Note: this code has no effect if you use the "Computed Value" formatter option. Alternately, this code can be supplied by your own custom function named computed_field_field_kurs_rezultat_display().

Аватар пользователя molp molp 9 июля 2010 в 18:02

Возможно я глупость спрошу так как с php не знаком но все же ... Может быть переменную в которой я пытаюсь задать коэффициент нужно определить как глобальную?

Аватар пользователя Dan Dan 10 июля 2010 в 12:34

"molp" wrote:
Поле Computed Code теперь не форматируется. Ошибок после изменения материала нет. Но результат все ровно "0", то есть то что я указал в Default Value.

Делайте по частям.
1. Сначала отображение поля: $display = 123; Должно отобразить 123.
2. Потом передачу из значения в отображение:

  • Значение поля: $node_field[0]['value'] = 123;
  • Отображение поля: $display = $node_field_item['value'];

3. Окончательный код.

PS: Я надеюсь ноду вы пересохраняете для расчёта значения?

Аватар пользователя molp molp 11 июля 2010 в 3:30

Первые два шага работают. Третий, когда вставляю код - нет, вернее опять ноль выдает.
Ноду пересохраняю.

$node_field[0]['value'] = 1+1; тоже считает правильно, а с переменными не хочет Sad
Поля цены и коэффициента - Decimal

Пробовал на голом Drupal без всяких визивиг и проч модулей, только CCK и Computed field

Аватар пользователя molp molp 12 июля 2010 в 20:44

Модуль PHP filter включал, разрешения устанавливал, в настройках роли задавал, ноду и настройки полей пересохранял - ноль Sad

Аватар пользователя Варяг Варяг 30 сентября 2010 в 12:59

Нашёл небольшой совет в разделе проекта на drupal.org (http://drupal.org/node/149225):

If you have a computed field that depends on another, then give it a higher weight. Otherwise you will get an older value of the field, or none at all.

Короче говоря, советуют назначить вес полю больше. Так что можно еще с весом поля поэскперементировать

Аватар пользователя imarky4 imarky4 5 июля 2011 в 8:11

Народ, доброго времени!
А кто нибудь решил проблему? у меня такая же шляпа.НО, если отключить Content translation и Locale то все работает как часы.

Вот мой код:

$start = strtotime($entity->field_begin_policy_date[LANGUAGE_NONE][0]['value']);
$end = strtotime($entity->field_begin_policy_date[LANGUAGE_NONE][0]['value2']);
$difference = ($end - $start);
$entity_field[0]['value'] = $difference/(86400)+1;

------
$display_output = $entity_field_item['value'] . " дн.";
---

Аватар пользователя AntonVTR AntonVTR 1 ноября 2011 в 10:30

что то тоже лыжи не едут

Computed Code (PHP)
$entity_field[0]['value'] = $entity->field_ch[0]['value'];

Display Code (PHP)
$display_output = $entity_field_item['value'];

проблема с этим полем $entity->field_ch[0]['value'], если его заменить на число то все работает. я так полагаю я неправильно обращаюсь к переменной.

Drupal 7 правильно ли что пишу $entity а не $node?

Аватар пользователя zhen4ek zhen4ek 4 июля 2013 в 4:12

2TS,

Я использую друпал 7. думаю различия если буду то небольшие.
1)создаем тип материала "курс". добавляем в него десятичное поле "field_usd" тип для поля--десятичное.
2)добавляем материал, заполняем поля к примеру ставим для field_usd значение 100500.
3)запоминаем айди только что добавленной ноды(к примеру 40000000)
4)устанавливаем https://drupal.org/project/computed_field
5)создаем новый тим материала "товар"
6)создаем поле price_usd тип поля десятичный
7)создаем поле price_rub тип поля computed_field, когда сохраняем у нас появляются Display Code (PHP)--оставляем без изменения и Computed Code (PHP) и вот в него вставляем следующий код

<?php$nd=node_load(40000000);
$entity_field[0]['value'] = round($nd->field_usd['und'][0]['value']*$entity->price_usd['und'][0]['value'],2) ;?>

а теперь по пунктам--в переменную $nd мы загружаем нашу ноду. берем её значение $nd->field_usd['und'][0]['value'] и умножаем на значение $entity->price_usd['und'][0] . ну и округляем до двух знаков после запятой.
ВСЁ)
да и самое главное убираем галочку с "Store value in the database". и у нас значение этого поля будет генерироваться динамически. стоит только изменять курс и зафлашить кеш.

ну и

direqtor wrote:
Ставьте devel и http://shaman.asiadata.ru/node/366[/quote]
чтобы удобно посмотреть что у Вас и как у Вас обзывается)

2гуру, способ немного топорный, но как старт думаю пойдет.