Неопределенный индекс #account в template_preprocess_user_profile () - PullRequest
0 голосов
/ 06 декабря 2011

Я пытаюсь переопределить форму редактирования профиля пользователя в Drupal 7, и я продолжаю получать следующие сообщения об ошибках:

Примечание: неопределенный индекс: #account в template_preprocess_user_profile () (строка 189 из /var/www/menit/modules/user/user.pages.inc).
Примечание: неопределенный индекс: #account в rdf_preprocess_user_profile () (строка 578 из /var/www/menit/modules/rdf/rdf.module).
Примечание. Попытка получить свойство необъекта в user_uri () (строка 190 из /var/www/menit/modules/user/user.module).
Примечание: Попытка получить свойство необъекта в rdf_preprocess_user_profile () (строка 603 из /var/www/menit/modules/rdf/rdf.module).
Примечание: Попытка получить свойство необъекта в rdf_preprocess_user_profile () (строка 604 из /var/www/menit/modules/rdf/rdf.module).

Я написал собственный модуль, содержащий следующий код:

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',
    ),
  );
}

и добавил следующую папку user_profile.tpl.theme в папку шаблонов моей темы:

<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>

Я сейчас немного заблудился, и мне не хватает времени. У кого-нибудь есть представление о том, что я здесь сделал неправильно?

1 Ответ

0 голосов
/ 08 декабря 2011

Проблема в том, что вы используете следующую строку:

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

Эти строки изменяют функцию темы, связанную с формой, и вызывают некоторые функции предварительной обработки, такие как [template_preprocess_user_profile ()] [1] и [rdf_preprocess_user_profile ()] [2]. Все те функции предварительной обработки, которые, как считается, вызываются для профиля пользователя, ищут некоторые переменные, которые в вашем случае не определены, такие как $variables['elements']['#account'].

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

  • Если вы хотите удалить некоторые поля формы, вы реализуете hook_form_FORM_ID_alter(), то есть хук, который вы уже реализовали, и используете его, чтобы скрыть некоторые поля формы.

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

    Таким образом, поле не будет отображаться для пользователя. Я предлагаю использовать это, поскольку именно этот метод создает меньше проблем для других модулей, чем unset($form[$field_id]); если вы используете это, $form_state['values'] не будет содержать значений для этого поля, и некоторый обработчик проверки или отправки может сообщить об ошибке (например, «необходимо ввести значение для [имя поля]»).

  • Если вы хотите добавить класс CSS в поле формы, вы можете использовать:

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

    Это более простой и быстрый способ. Если вам нужно обернуть более одного поля формы, вам следует использовать что-то похожее на следующий код:

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

    В таких случаях обычно требуется добавить стиль CSS в форму, что выполняется с помощью кода, подобного следующему:

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

    Вы также можете переместить поля формы в поле формы #container, как показано в следующем коде:

    $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]);
    

    В этом случае поле формы будет обернуто тегом <div> с классом CSS, установленным для контейнера. С этим связано то, что поля перемещены от того места, где они были; вам нужно отрегулировать их вес, чтобы потом появиться там, где они были раньше. Если вы используете этот метод, вы должны быть уверены, что ваш модуль последним изменит форму, иначе у модулей, которые ожидают найти $form[$field_id], будут некоторые проблемы; это не относится к обработчикам форм, за исключением случаев, когда для $form[$field_id]['#tree'] установлено значение TRUE.

...