Як відобразити форму профілю за допомогою модуля profile2


11

Profile2 - це модуль, який використовує об'єкти для створення профілів, відокремлених від облікового запису користувача.

Зсередини мого модуля я хочу мати змогу відобразити форму для редагування об'єктів профілю. Можливо, використовуючи API 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 основних програм:

  • field_attach_form додає поля до форми.
  • field_attach_validate обробляє перевірку.
  • field_attach_submit для обробки додавання значень сутності (профілю).
  • Нарешті, вам потрібно буде зберегти сутність профілю за допомогою profile2_save.

Переглянувши код модуля profile2, я виявив, що він забезпечує функцію обгортки для приєднання полів до форми та збереження форми. Це простіше, але, роблячи це, ви втрачаєте трохи контролю. Для цього вам потрібно скористатися profile2_attach_form. Це також допоможе перевірити та зберегти дані.

Щоб скористатись вищевказаним кодом, ви повинні мати змогу c / p, перейменувати форму та замінити profile_machine_nameфактичною машинною назвою профілю, для якого ви хочете відобразити форму.


Я не розумію, що тут відбувається. Мені просто потрібно відобразити форму Profile2. Чи можливо це?
Карлос Муніс

коли я використовую ваш код у своєму модулі, він дає мені цю помилку: Фатальна помилка: Непідтримувані типи операндів у C: \ wamp \ www \ working \ module \ field \ field. field.attach.inc на лінії 550
Carlos Muñiz

@Charlie Я оновив свою відповідь більш детально та запропонував альтернативне та простіше рішення за допомогою API profile2.
googletorp

це він googletorp !!! Ваша відповідь працювала з незначним редагуванням: наприкінці функції я додав: поверніть форму $, що було єдиним способом я зможу її відобразити, зателефонувавши за допомогою drupal_get_form (). Якщо був альтернативний спосіб відобразити його без повернення $ форми, будь ласка, поясніть, інакше дуже дякую!
Карлос Муніс

Мені доводиться чекати 12 годин, щоб нагородити нагороду :)
Карлос Муніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.