Почему свойство "#weight" иногда не имеет никакого эффекта в форматах Drupal?

Я пытаюсь создать форму node для настраиваемого типа. У меня есть органические группы и таксономия, которые включены, но хотят, чтобы их элементы выходили в нестандартном порядке. Поэтому я внедрил hook_form_alter и установил свойство #weight подмары og_nodeapi на -1000, но он по-прежнему идет после таксономии и меню. Я даже попытался изменить подмассиву на набор полей (чтобы заставить его фактически отображаться), но не кубики. Я также попытался установить

$form['taxonomy']['#weight'] = 1000 

(У меня есть два словаря, поэтому он уже отображается как набор полей), но это тоже не сработало.

Я установил вес моего модуля очень высоко и подтвердил в системной таблице, что он действительно самый высокий модуль на сайте - так что у меня все идеи. Любые предложения?

Update:

Пока я точно не знаю, как это сделать, мне удалось заставить поле таксономии опуститься ниже всего остального, но теперь у меня есть связанная с этим проблема, которую, мы надеемся, более легко понять. Внутри поля таксономии у меня есть два элемента (теги и мульти-выбор), и я хотел добавить некоторые инструкции в hook_form_alter следующим образом:

$form['taxonomy']['instructions'] = array(
  '#value' => "These are the instructions",
  '#weight' => -1,
);

Вы догадались, это появляется после терминов, вставленных модулем таксономии. Однако, если я изменил это на набор полей:

$form['taxonomy']['instructions'] = array(
  '#type' => 'fieldset', // <-- here
  '#title' => 'Instructions',  // <-- and here for good measure
  '#value' => "These are the instructions",
  '#weight' => -1,
);

то он волшебным образом плавает к вершине, как я и предполагал. Я также попробовал textarea (это тоже сработало) и явное указание разметки (это не так).

Таким образом, изменение типа от "разметки" (по умолчанию IIRC) до "fieldset" приводит к тому, что больше не игнорируется его вес.

Ответ 1

Это звучит довольно странно, потому что манипулирование параметром #weight элементов #weight всегда работает для меня надежно, как рекламируется. Однако следует отметить, что веса влияют только на порядок относительно элементов одного уровня, поэтому, если элемент, который вы хотите переместить, находится на уровне ниже уровня других элементов, вам придется изменить вес элемента. родительский элемент, который находится на том же уровне, что и те, против которых вы хотите перейти.

Чтобы уточнить, если у вас есть такая иерархия,

$element['foo'];
$element['bar'];
$element['bar']['baz']

Вы не можете перемещать "baz" относительно "foo", устанавливая вес "baz". Вам нужно будет либо установить вес на 'bar' (перемещая его тоже), либо вытащить 'baz' и довести его до того же уровня, что и 'foo'.

Другой возможной причиной может быть CCK: если у вас установлен CCK, он позволяет вам устанавливать порядок как своих, так и других полей в полях admin/content/node-type/<yourNodeType>/fields. Он изменяет порядок, регистрируя обратный вызов предварительного рендеринга content_alter_extra_weights(), поэтому он будет выполняться после ваших изменений в hook_form_alter.


Изменить: Обновить, чтобы ответить на вопрос обновления

Тип поля разметки имеет особое поведение при использовании внутри наборов полей, на что намекает документация API форм:

Примечание: если вы используете разметку, если ваш контент не обернут в теги (обычно <p> или <div>), ваш контент будет выходить за пределы свернутых наборов полей.

Похоже, что он не только выходит за пределы свернутых наборов полей, но и отказывается учитывать вес в этих случаях. Обтекание содержимого поля разметки в тегах <p> позволяет учитывать его вес на моем компьютере:

$form['taxonomy']['instructions'] = array(
  '#value' => "<p>These are the instructions</p>",
  '#weight' => -1,
);

Ответ 2

Иногда (или всегда, при взвешивании элементов CCK) строка, которая работает в вашем обратном вызове hook_form_alter или $form ['# after_build'], является следующим:

$form['#content_extra_fields']['taxonomy']['weight'] = 5;

Ответ 3

Требуется вставить <div>, который я мог бы использовать в JS. Это не сработало для меня:

  $form['you_as_reviewer']['ui_container'] = array(
    '#type' => 'markup',
    '#value' => '<div id="le_reviewer_tags_ui"/>',
    '#weight' => 5,
  );

Вес был проигнорирован.

Это сработало:

  $form['you_as_reviewer']['ui_container'] = array(
    '#type' => 'markup',
    '#prefix' => '<div>',
    '#value' => '<div id="le_reviewer_tags_ui"/>',
    '#suffix' => '</div>',
    '#weight' => 5,
  );

Добавлен префикс и суффикс.

Ответ 4

Я не совсем понимаю, чего вы хотите достичь. Не могли бы вы уточнить? Вы хотите изменить положение выпадающего списка таксономии на странице?

В то же время вы можете установить Drupal Devel module (если вы еще этого не сделали). Затем включите "Отображать формы и ключи элементов формы" из "Администрирование" > "Настройки девелопмента".

Это поможет вам отладить вашу проблему.

Изменить после отзыва:

Я просмотрел его еще немного. Вес таксономии устанавливается в таксономическом порядке по строке 556 (Drupal 6.12):

$form['taxonomy']['#weight'] = -3;

Для тестирования я также реализовал hook_form_alter для моего модуля следующим образом:

function mymodule_form_alter(&$form, $form_state, $form_id) {
      ...
      $form['taxonomy']['#weight'] = -9;
      ...
} 

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

Поскольку вы сказали, что пытались установить $form['taxonomy']['#weight'] в своем исходном сообщении, я могу сейчас подумать только о двух возможных проверках:

  • Перед тестированием убедитесь, что кеш очищен. (для этого вы можете использовать модуль Devel)
  • Убедитесь, что ваш hook_form_alter называется после taxonomy_form_alter

Я отправляю код, который у вас есть, мы могли бы посмотреть на него более подробно.


Обратите внимание: весы, отображаемые модулем Devel, не очень полезны для этой ситуации. Отображаются веса элементов на "подформах", а не вес самой "подформы". Например. когда я устанавливаю $form['taxonomy']['#weight'] = -9;, -9 не отображается модулем Devel, а весом элементов внутри $form['taxonomy'].

Ответ 5

Вы указали вес другого поля, и теперь форма node не организована должным образом? Форма api немного трогательна, и изменение формы может привести к смешению вещей. Иногда мне приходится переназначать вес для кнопок отправки/предварительного просмотра, чтобы вернуть их в нижней части формы, в которой они находятся.

Ответ 6

Чтобы охватить все базы, убедитесь, что вы очищаете свой кеш при необходимости. Drupal хранит в нем кеширование по умолчанию, если у вас включен модуль кэширования.