указать элементы формы $, которые будут исключены из отображения?
20
Я хочу скрыть определенные элементы в форме, используя form_alter или файл шаблона. Я где-то читал, что в Drupal 7 мы можем указать элементы $ form, чтобы они не отображались в форме, но я не помню! Не unset (), а какая-то другая функция!
Использование unset()не является хорошим решением для форм (как я думаю, вы знаете), поскольку вы никогда не знаете, какие обработчики отправки / проверки могут ожидать, что неустановленный элемент будет существовать при обработке. Это может привести к нежелательным ошибкам.
Есть три метода, которые вы можете безопасно использовать, чтобы «скрыть» элемент формы
Используйте '#type' => 'value'для элемента, что приведет к тому, что значение элемента все равно будет передано в функции submit / validate с его #valueобычным значением. Это мой предпочтительный метод.
Использование '#access' => FALSEэлемента для обозначения его не должно выводиться на экран.
Используйте '#type' => 'hidden'как предложил Барт (хотя использование этого зависит от вашего варианта использования; я думаю, что если вы пытаетесь скрыть значение элемента формы, вы не хотите выводить его в форме как скрытый ввод).
@zhilevan hide()не должен использоваться для элементов формы, он может легко испортить весь процесс отправки формы, так как для элемента все еще выполняются валидаторы. Например, если вы hide($form['title']);в форме узла, вы никогда не сможете отправить форму, так как поле заголовка является обязательным, но значение не будет предоставлено. 3 метода, описанные выше, лучше всего использовать именно в таком порядке :)
Клайв
@Clive спасибо, я знаю выше методы, мой вопрос был связан с hide () я думаю (до сих пор не могу вспомнить функцию) .. в любом случае, пожалуйста, обратитесь мой комментарий в 1-м ответе, почему drupal_render($form['base']['prices']['sell_price'])не работает?
Серхас
Это код в файле шаблона, который представляет собой форму? Если нет, то причина этого не в том, что хотя вы можете распечатать любой элемент рендеринга на экране drupal_render(), вы не получите ни одного из тегов формы / токенов / и т.д. если не вы выводите весь $formмассив
Clive
я использовал тему крючка, и print_r ($ form) и даже drupal_render ($ form ['title']) работают, проблема в элементах под вертикальными вкладками!
Серхас
4
Если вы используете файл шаблона, вы можете скрыть вещи, используя hide () .
Если вы хотите, чтобы скрыть элемент формы hook_form_alter, unset()может быть лучшим вариантом.
Если это просто для хранения значения, вы также можете использовать '#type' => 'hidden' .
Я пытался добиться пользовательской формы узла продукта Ubsercart, все, что я хотел отобразить, это sell_price и скрыть другие элементы, такие как доставка, вес и т. Д. Но drupal_render($form['base']['prices']['sell_price'])будет отображаться форма, но она не сохраняется!
Серхас
4
Я обнаружил, что использование #access для false может сломать некоторые формы, если они используются на кнопках отправки или аналогичных. В тех случаях я просто использовал CSS, чтобы скрыть элементы:
hide()
не должен использоваться для элементов формы, он может легко испортить весь процесс отправки формы, так как для элемента все еще выполняются валидаторы. Например, если выhide($form['title']);
в форме узла, вы никогда не сможете отправить форму, так как поле заголовка является обязательным, но значение не будет предоставлено. 3 метода, описанные выше, лучше всего использовать именно в таком порядке :)drupal_render($form['base']['prices']['sell_price'])
не работает?drupal_render()
, вы не получите ни одного из тегов формы / токенов / и т.д. если не вы выводите весь$form
массивЕсли вы используете файл шаблона, вы можете скрыть вещи, используя hide () .
Если вы хотите, чтобы скрыть элемент формы
hook_form_alter
,unset()
может быть лучшим вариантом.Если это просто для хранения значения, вы также можете использовать '#type' => 'hidden' .
источник
drupal_render($form['base']['prices']['sell_price'])
будет отображаться форма, но она не сохраняется!Я обнаружил, что использование #access для false может сломать некоторые формы, если они используются на кнопках отправки или аналогичных. В тех случаях я просто использовал CSS, чтобы скрыть элементы:
Просто еще один вариант.
источник