Изменить значение поля CCK [РЕШЕНО]

Прислано: maxim adamov

вс, 28/02/2010 - 21:04

Добрый вечер!
Прошу помочь разобраться в следующем вопросе:
Создан тип материала с использованием полей CCK. Нужно, чтобы значение одного из полей данного материла генерировалось бы из значений других полей, т.е., например у материала есть поле1, поле2, поле3,поле4. И мне нужно, чтобы значение поля4=поле1+поле2+поле3. При чем поле4 - обязательное поле, т.е. записать в него значение нужно до валидации формы.
Я понимаю, что такое можно легко реализовать с помощью javascript, но мне бы не хотелось делать это на стороне клиента. Гораздо лучше, если это можно сделать на сервере.
Заранее спасибо за помощь!

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано RxB в вс, 28/02/2010 - 21:06.

А на стороне ТС, всегда желательно пользоваться поиском.
Conditional Fields


Опубликовано maxim adamov в вс, 28/02/2010 - 22:47.

Спасибо, только не Conditional Fields, а Computed Field. Буду с ними разбираться. А все же ради любопытства есть ли возможность сделать это в своем модуле? Или это будет изобретение велосипеда?


Опубликовано RxB в вс, 28/02/2010 - 23:24.

Можно и в модуле, но займёт намного больше времени


Опубликовано maxim adamov в пн, 01/03/2010 - 09:50.

Какая то странная проблема с Computed field. Здесь на форуме нашел похожую (), но там автор ее решил, выключив галочку store in database. Я так делать не хочу, потому что проект большой и это будет означать лишнюю нагрузку на сервер. Ситуация следующая.
Мне нужно автоматически заполнять поле Артикул (которое в ноду добавляет ubercart). Для этого я предпринял следующее:
1. Через hook_form_alter делаю его необязательным, потому что валидация происходит раньше выполненяи кода в computed field
2. В computed field пишу код:

if (!$node->nid) node_save($node);
$node->model=нужное мне выражение;

И результат не сохраняется в базу при создании ноды, а только при пересохранении. Если написать
if (!$node->model) node_save($node);

То результат будет сохранятся с первого раза, но тогда выдает ошибку 404.


Опубликовано maxim adamov в вт, 02/03/2010 - 09:00.

Т.е. я правильно понимаю, что никто никогда с подобным не сталкивался и помочь никто не может??? (((


Опубликовано orangeudav в вт, 02/03/2010 - 13:55.

пока что непонятно, что вы хотите в итоге получить.

если вы знаете слово "до валидации" то в чем проблема в собственном модуле определить собственную форму для ноды данного типа?


Опубликовано maxim adamov в вт, 02/03/2010 - 21:58.

Ситуация такая, что форма уже определена и поля эти не хочется менять и переопределять. У меня есть тип товара, часть полей в котором созданы с помощью CCK,а часть добавлены сторонними модулями (в частности Ubercart). Мне нужно производить манипуляции как раз с полями, созданными Ubercart (Цена и Артикул). Если вы подскажете как это сделать в собственном модуле, то буду благодарен, использование computed fields не является обязательным для меня.


Опубликовано orangeudav в вт, 02/03/2010 - 23:02.

ну, грязный вариант - в своем модуле через альтер_форм вешать на нужную форму валидатор из своего модуля, и в нем меня данные как угодно. возникают только сомнения 1) ваш валидатор может быть в любом месте списка валидаторов 2) это все таки неправильно, менять данные в валидаторе


Опубликовано RxB в вт, 02/03/2010 - 23:03.

"orangeudav" написал(а):

ваш валидатор может быть в любом месте списка валидаторов

Неправда. Свой валидатор можно засунуть каким угодно счёту, играем весом своего модуля, потом в массив валидаторов кидаем свой валидатор на первое место

"orangeudav" написал(а):

2) это все таки неправильно, менять данные в валидаторе

С этим согласен


Опубликовано orangeudav в ср, 03/03/2010 - 10:24.

RxB написал(а):

Неправда. Свой валидатор можно засунуть каким угодно счёту, играем весом своего модуля, потом в массив валидаторов кидаем свой валидатор на первое место

всегда была интересно, чтобы будет, если встретится два модуля, авторы которых им выставили максимальный (одинаковый) вес, будут запускаться в порядке именования модулей?


Опубликовано maxim adamov в ср, 03/03/2010 - 12:53.

"RxB" написал(а):

Неправда. Свой валидатор можно засунуть каким угодно счёту, играем весом своего модуля, потом в массив валидаторов кидаем свой валидатор на первое место
"orangeudav" написал(а):
2) это все таки неправильно, менять данные в валидаторе
С этим согласен

Если неправильно менять данные в валидаторе, тогда как в данной ситуации правильно поступить?


Опубликовано RxB в ср, 03/03/2010 - 13:00.

"orangeudav" написал(а):

всегда была интересно, чтобы будет, если встретится два модуля, авторы которых им выставили максимальный (одинаковый) вес, будут запускаться в порядке именования модулей?

Если одинаковый вес, то по имени тогда.

"maxim adamov" написал(а):

Если неправильно менять данные в валидаторе, тогда как в данной ситуации правильно поступить?

Вы задачу по нормальному обрисуйте, хотя бы почему вам значение ещё до валидации нужно


Опубликовано maxim adamov в ср, 03/03/2010 - 13:38.

"RxB" написал(а):

Вы задачу по нормальному обрисуйте, хотя бы почему вам значение ещё до валидации нужно

Сейчас попытаюсь еще раз все изложить!
Задача:
1. Есть товар, часть полей которого созданы с помощью CCK и соответственно часть полей добавлены Ubercart`ом (цена, артикул и т.д.)
2. Мне нужно формировать содержимое полей цена, артикул и еще одного поля cck, исходя из значений других полей.

Получить значение поля до валидации теперь уже для меня не критично, потому, что я через hook_form_alter делаю эти поля необязательными.
Раз уж я все равно использую свой модуль и hook_form_alter, то тогда и действия со значениями, наверное, лучше делать в нем же.
Скажите, есть ли вариант через hook_form_alter на кнопку сохранить повесить свою функцию, которая вначале бы делала все необходимые мне операции с полями, а потом сохраняла бы форму.
Если так сделать можно и это будет нормально, пожалуйста, не ограничивайтесь лаконичным "Да", а хотя бы намекните как это сделать. Заранее благодарен!


Опубликовано maxim adamov в ср, 03/03/2010 - 17:23.

В общем я добился того, что требовалось.
Через hook_form_alter я для кнопки "Сохранить" в начала массива #submit добавил свою функцию
array_unshift($form['buttons']['submit']['#submit'],my_submit1);
В которой уже произвожу все необходимые манипуляции:

function my_submit1($form, &$form_state){
$form_state['values']['model']=......
}

Все вроде работает и теперь мне хотелось бы услышать экспертное мнение на тему того, можно ли вообще так делать и хорошо ли это?


Опубликовано orangeudav в ср, 03/03/2010 - 18:22.

не сколько сабмитов для одной формы - стандартный прием


Опубликовано maxim adamov в ср, 03/03/2010 - 20:30.

"orangeudav" написал(а):

не сколько сабмитов для одной формы - стандартный прием

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


Новое на сайте

Ссылки партнёров