Есть тип профиля "Продавец" (Profile2) и есть тип материала "Товар". И там, и там есть одинаковые поля разных типов (текст, число, ссылка на термин и т.д.).
Задача в том, чтобы, когда пользователь создает новый материал, значения полей из профиля автоматически подставлялись в соответствующие поля материала. Как более правильно это можно реализовать?
Насколько я понимаю, модуль Computed Field мне не совсем подходит, так как предполагает создание новых полей специального типа.
Комментарии
Решил с помощью такого модуля. Работает с полями типа текст и ссылка на термин. Реализация, на самом деле, выглядит довольно геморройно, хочется верить, что все же есть более простые способы взаимодействия с однотипными полями. Тем не менее, найти его не удалось, хотя, задача, вроде как, типовая.
<?php /**
// узнаем имя профиля, в зависимости от id формы
* hook_form_alter
*/
function mymodule_form_alter(&$form, &$form_state, $form_id)
{
$profile_name = _get_profile_name($form_id);
if (is_null($profile_name))
{
return;
}
global
$user;// загружаем профиль
$profile = profile2_load_by_user($user->uid);
if (isset(
$profile[$profile_name])){
// перебираем поля профиля
foreach ($profile[$profile_name] as $key => $field)
{
// если поле профиля присутсвует в форме, генерируем значение по умолчанию
if (substr($key, 0, 6) == 'field_' and isset($form[$key]))
{
$lang = $form[$key]['#language'];
// для текстовых полей
if (isset($form[$key][$lang][0]))
{
$form[$key][$lang][0]['value']['#default_value'] = $field[$lang][0]['value'];
}
// для ссылки на термин
elseif(isset($form[$key][$lang]))
{
switch ($form[$key][$lang]['#type']) {
// виджет с автозаполнением
case 'textfield':
$term = taxonomy_term_load($field[$lang][0]['tid']);
$form[$key][$lang]['#default_value'] = $term->name;
break;
// виджет обычного спискаcase 'select':
$form[$key][$lang]['#default_value'] = array($field[$lang][0]['tid']);
break;
}
}
else continue;
}
}
}
}
/*** указываем имя профиля в зависимости от id формы
*/
function mymodule_get_profile_name($form_id)
{
switch ($form_id)
{
case 'form1_node_form':
$profile_name = 'profile1';
break;
case 'form2_node_form':
$profile_name = 'profile2';
break;
default:
$profile_name = null;
break;
}
return
$profile_name;} ?>