Ongedefinieerde index #account in template_preprocess_user_profile ()

Ik probeer het bewerkingsformulier voor gebruikersprofielen in Drupal 7 te overschrijven en ik krijg de volgende foutmeldingen:

Opmerking: ongedefinieerde index: #account in template_preprocess_user_profile() (regel 189 van /var/www/menit/modules/user/user.pages.inc).
  Notice: Undefined index: #account in rdf_preprocess_user_profile() (regel 578 van /var/www/menit/modules/rdf/rdf.module).
  Opmerking: Proberen om de eigenschap van niet-object te krijgen in user_uri() (regel 190 van /var/www/menit/modules/user/user.module).
  Opmerking: Proberen de eigenschap van niet-object te verkrijgen in rdf_preprocess_user_profile() (regel 603 van /var/www/menit/modules/rdf/rdf.module).
  Opmerking: Probeert eigenschap van niet-object te verkrijgen in rdf_preprocess_user_profile() (regel 604 van /var/www/menit/modules/rdf/rdf.module).

Wat ik heb gedaan is het schrijven van een aangepaste module, die de volgende code bevat:

function custom_profile_form_user_profile_form_alter(&$form, &$form_state, $form_id) {
  global $user;

  if ($user->uid != 1){
    $form['#theme'] = 'user_profile';
  }
}

function menit_theme($existing, $type, $theme, $path){
  return array(
    'user_profile' => array(
      'render element' => 'form',
      'template' => 'templates/user_profile',
    ),
  );
}

en voegde het volgende user_profile.tpl.theme toe aan mijn themasjablonenmap:

<div class="profile"<?php print $attributes; ?>>
  <?php print render($user_profile['field_second_name']);  ?>
  <?php print render($user_profile['field_first_name']);?>
  <?php print render($user_profile);?>
</div>

Ik ben nu een beetje verdwaald, en ik schiet tekort op tijd. Heeft iemand een idee van wat ik hier fout heb gedaan?

0

1 antwoord

Het probleem is de volgende regel die u gebruikt:

$form['#theme'] = 'user_profile';

Die regels veranderen de themafunctie die aan het formulier is gekoppeld, en het zorgt ervoor dat sommige voorbewerkingsfuncties worden opgeroepen, zoals [template_preprocess_user_profile ()] [1] en [rdf_preprocess_user_profile ()] [2]. Al die preprocess-functies, waarvan wordt gedacht dat ze voor het gebruikersprofiel zijn opgevraagd, zijn op zoek naar een aantal variabelen die in uw geval niet zijn gedefinieerd, zoals $ variables ['elements'] ['# account'] .

U gebruikt geen sjabloonbestand om een ​​formulier weer te geven. Afhankelijk van wat u wilt bereiken, kunt u verschillende methoden gebruiken:

  • If you want to remove some form fields, you implement hook_form_FORM_ID_alter(), which is the hook you have already implemented, and use it to hide some form fields.

    $form[$field_id]['#access'] = FALSE;
    

    In this way, the field will not shown for the user. I suggest using that, as it is the method that causes less problem to other modules than unset($form[$field_id]); if you use this, $form_state['values'] will not contain the values for that field, and some validation, or submission handler could report an error (e.g. "the value for [name of the field] must be entered").

  • If you want to add a CSS class to a form field, you can use:

    $form[$field_id]['#prefix'] = '<div class="mymodule-custom-class">';
    $form[$field_id]['#suffix'] = '</div>';
    

    This is the simpler, and faster way. If you need to wrap more than one form field, then you should use something similar to the following code:

    $form[$field_id1]['#prefix'] = '<div class="mymodule-custom-class">';
    $form[$field_id2]['#suffix'] = '</div>';
    

    In such cases, you normally want to add a CSS style to the form, which is done with code similar to the following one:

    $form['#attached']['css'][] = drupal_get_path('module', 'mymodule') . '/mymodule.css';
    

    You could also move the form fields in a #container form field, as with the following code:

    $form['container_01'] = array(
      '#type' => 'container',
      '#attributes' => array(
        'class' => array('mymodule-custom-class'),
      ),          
    );
    
    $form['container_01'][$field_id] = $form[$field_id];
    
    unset($form[$field_id]);
    

    In this case, the form field will be wrapped with a <div> tag with the CSS class set for the container. The con with this is that the fields are moved from where they were; you need to adjust their weight to make then appear where they were before. If you use this method, you should be sure your module is the last one to change the form, or modules that expect to find $form[$field_id] will have some problems; this doesn't apply to the form handlers, except when $form[$field_id]['#tree'] is set to TRUE.

0
toegevoegd
Heel erg bedankt Alberto, werkt nu als charme
toegevoegd de auteur Eytyy, de bron