Как отобразить форму профиля с помощью модуля profile2

11

Profile2 - это модуль, который использует сущности для создания профилей, которые отделены от учетной записи пользователя.

Из моего модуля я хочу иметь возможность отображать форму для редактирования профилей сущностей. Возможно, используя drupal_get_form или API Profile2 или любым другим методом.

Каков наилучший способ сделать это?

Карлос Муньис
источник

Ответы:

20

Я недавно сделал что-то подобное. Поскольку в профиле используются поля, это упрощает задачу. Для формы вы можете сделать что-то вроде этого:

function my_profile_form($form, &$form_state) {
  global $user;
  if (!isset($form_state['profiles'])) {
    $profile = profile2_load_by_user($user, 'profile_machine_name');
    if (!$profile) {
      $profile = profile_create(array(
        'type' => 'profile_machine_name',
        'uid' => $user->uid
      ));
    }
    $form_state['profiles'][$profile->type] = $profile;
  }

  // Use field attach form and handle the fields yourself:
  field_attach_form('profile2', $profile, $form, $form_state);
  // Or use profile2 API which is simpler
  profile2_attach_form($form, $form_state);

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  return $form;
}

Поскольку вся форма профиля - это только поля, прикрепленные к профилю, вы можете просто присоединить поля к форме самостоятельно, используя основные API-интерфейсы Drupal:

  • field_attach_form добавляет поля в форму.
  • field_attach_validate обрабатывает проверку.
  • field_attach_submit обрабатывает добавление значений к сущности (профилю).
  • Наконец, вам нужно сохранить профиль объекта с помощью profile2_save.

Просматривая код модуля profile2, я обнаружил, что он предоставляет функцию-обертку для присоединения полей к форме и сохранения формы. Это проще, но при этом вы теряете немного контроля. Чтобы использовать это вам нужно использовать profile2_attach_form. Выполнение этого также будет обрабатывать проверку и сохранение данных.

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

googletorp
источник
Я не понимаю, что здесь происходит. Мне просто нужно отобразить форму Profile2. Это возможно?
Карлос Муньис
когда я использую ваш код в моем модуле, он выдает мне эту ошибку: Неустранимая ошибка: неподдерживаемые типы операндов в C: \ wamp \ www \ working \ modules \ field \ field.attach.inc в строке 550
Карлос Муньис,
@Charlie Я обновил свой ответ более подробной информацией и предоставил альтернативное и более простое решение с использованием API-интерфейса profile2.
googletorp
это гуглторп !!! ваш ответ работал с незначительным редактированием: в конце функции, которую я добавил: вернуть $ form, это был единственный способ, которым я мог отобразить его, вызвав его с drupal_get_form (). Если есть альтернативный способ отображения без формы возврата $, объясните, в противном случае большое спасибо!
Карлос Муньис,
Мне нужно подождать 12 часов, чтобы присудить награду :)
Карлос Муньис,