2

I am working on a Drupal 7 site and for a few days now, I've been struggling with this problem: I am trying to create a custom template for the edit profile form, but there are more profile types. I managed to create the template but it does not work properly. I am able to save all the fields except the image field. When I hit remove button, the filed disappears completely, then I have to hit save two times for the image to be actually removed. Also, if I add an image, then press upload, I get a warning:

Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'profile2_form' not found or invalid function name in drupal_retrieve_form() (line 841 of /var/www/html/hxl_drupal/includes/form.inc).)

If I hit save twice, the image gets saved.

I tried a lot of websites, including these:

I should also mention that the form is submitted through AJAX and that I use ctools module to open it in modal.

Below you can see the code.

template.php

/*
* Implements hook_form_alter()
*/

function customtheme_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'user_profile_form') {
    if ($form['#user_category'] === 'partner_user') {
      $form['#theme'] = 'profile2_partner_user_edit_form';
    } else if ($form['#user_category'] === 'advisor_user') {
      $form['#theme'] = 'profile2_advisor_user_edit_form';
    }
  }
}

/*
*implements hook_theme()
*/

function customtheme_theme() {
  return array(
    'profile2_partner_user_edit_form' => array(
      'arguments' => array(
        'form' => NULL,
      ),
      'template' => 'templates/profile2--partner-user-edit',
      'render element' => 'form',
    ),
    'profile2_advisor_user_edit_form' => array(
      'arguments' => array(
        'form' => NULL,
      ),
      'template' => 'templates/profile2--advisor-user-edit',
      'render element' => 'form'
    ),
  );
}

custom_module.module

/**
* hook_menu
*/
function custom_module_menu() {
$items['profile/user-advisor_user_edit/%user/%ctools_js'] = array(
  'page callback' => 'profile_advisor_user_edit',
  'page arguments' => array(2,3),
  'type' => MENU_CALLBACK,
  'access callback' => TRUE,
  'file path' => drupal_get_path('module', 'user'),
  'file' => 'user.pages.inc',
);

$items['profile/user-partner_user_edit/%user/%ctools_js'] = array(
    'page callback' => 'profile_partner_user_edit',
    'page arguments' => array(2,3),
    'type' => MENU_CALLBACK,
    'access callback' => TRUE,
    'file path' => drupal_get_path('module', 'user'),
    'file' => 'user.pages.inc',
  );

    return $items;
}

I will post only the code for this profile type, because except the key word advisor_user.

function profile_advisor_user_edit($user, $js = FALSE ){
  if ($js){

   ctools_include('user.pages', 'user', '');
   ctools_include('modal');
   ctools_include('ajax');


   $form_state = array(
   'ajax' => TRUE,
   'title' => t('Edit Profile'),
   'user_id' => $user,
    );

   $form_state['build_info'] = array(
   'args' => array($user),
   );

   $output = ctools_modal_form_wrapper('profile2_advisor_user_edit_form', $form_state);    

    if (!empty($form_state['executed'])) {
      $output = array();
      $output[] = ctools_modal_command_dismiss();
    }

  print ajax_render($output);
  exit;
}else{
  module_load_include('inc', 'user', 'user.pages');
  $user_edit_form =     drupal_get_form('profile2_advisor_user_edit_form',$user);
  return drupal_render($user_edit_form);
}

}

The profile2--advisor-user-edit.tpl.php file I will post the code only for this profile type because they are pretty much the same.

 module_load_include('inc', 'profile2_page', 'profile2_page'); // Include profile2_page module

$profile2 = profile2_by_uid_load($user->uid, 'advisor_user');
$entity_form = entity_ui_get_form('profile2', $profile2, 'edit'); // Or 'add'
print render($entity_form['profile_advisor_user']['field_picture']);
print render($entity_form['profile_advisor_user']['field_first_name']);
print render($entity_form['profile_advisor_user']['field_last_name']);
print render($entity_form['profile_advisor_user']['field_role']);
print render($entity_form['profile_advisor_user']['field_bio']);
print render($entity_form['profile_advisor_user']  ['field_interest_topics']);
print render($entity_form['profile_advisor_user']['field_interest_areas']);
unset($entity_form['extra_fields']) //here I unset the fields that I don't want to appear in the form
print render($entity_form);
2
  • Welcome to Drupal Answers! Notice that Drupal doesn't use any template.tpl.php file.
    – avpaderno
    Commented Jun 3, 2016 at 13:04
  • That's right. Sorry, I meant template.php. It is the one from the custom theme. I edited the question. Thanks! Commented Jun 3, 2016 at 13:14

1 Answer 1

0

Loading form using module_load_include() isn't advised, you should use form_load_include() instead, so the include file is loaded whenever the form is processed. That's why you've issues on form submit.

Use this function instead of module_load_include() from inside a form constructor or any form processing logic as it ensures that the include file is loaded whenever the form is processed. In contrast to using module_load_include() directly, form_load_include() makes sure the include file is correctly loaded also if the form is cached.

Otherwise define your form using hook_forms, so Drupal knows where to find it (in which file).

By default, when drupal_get_form() is called, the system will look for a function with the same name as the form ID, and use that function to build the form. If no such function is found, Drupal calls this hook.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.