Drupal views - возможно ли разделить открытую форму? - PullRequest
4 голосов
/ 03 июля 2011

Мне нужно отобразить часть открытой формы на боковой панели моей страницы, а остальные формы и содержимое в области $content. Там действительно нет хорошего способа, которым я могу найти, чтобы сделать это. Я в некотором роде заставлял его показываться таким образом, создавая представление «блок» с набором «открытая форма», а затем пытаясь показать только ту часть, которая мне была нужна, через файлы .tpl. Проблема в том, что тогда, когда нажимается кнопка отправки (кнопка отправки находится в области $content), тогда фильтры, которые находятся на боковой панели, не учитываются.

Ответы [ 6 ]

5 голосов
/ 05 июля 2011

Немного побочного мышления ... Почему бы не изучить варианты только для CSS? Вы можете поместить этот элемент формы, играя с position:absolute? Или (учитывая, что это правая боковая панель) float:right, а затем какое-то отрицательное правое поле, чтобы подтолкнуть его к боковой панели? Если вы используете сетку 960, поиграйте с классами pull и push.

3 голосов
/ 07 июля 2011

Сначала я собираюсь ответить на ваш вопрос, а затем объясню, почему вы задаете неправильный вопрос:

Если вы создаете форму вне формапи, возможно, вам повезет.Это вырастет и потребует от вас особой осторожности в отношении векторов атак, таких как массовое назначение.

views_some_view.tpl.php :

<form name="input" action="/link/to/view" method="get">
  Country: <input type="text" name="country" />

my_custom_exposed_view.module: hook_block () Город:

Это будетсоздайте форму, которая в большинстве случаев будет начинаться с <form>, имеет несколько полей ввода, затем lot случайного HTML, затем еще несколько полей ввода и затем закрытие.

Как вы, возможно, знаете, <input type="submit" value="Submit" /> будет публиковать только все теги form, в которые он включен. Кнопка отправки в следующем HTML-коде:

<form name="input_1" action="/link/to/view" method="get">
  Country: <input type="text" name="country" />
</form>
<form name="input_2" action="/link/to/view" method="get">
  City: <input type="text" name="city" />
  <input type="submit" value="Submit" />
</form>

будет отправлять толькоCity.Это не те дроиды, которых вы ищете.

Это должна быть одна большая форма, но, поскольку все между form и /form очень динамичны и содержат большое количество HTML, включая потенциальные другие формы, это действительно не то, что выхочу.Более того: внешний вид блоков (показан / не показан) контролируется полностью независимо от содержимого.Вам понадобится много надежного кода, чтобы гарантировать, что блок a) никогда не будет отображаться, когда отсутствует начальный тег form, и b) блок будет гарантированно отображаться при наличии этого открывающего тега form.В противном случае у вас есть не только недействительный HTML, но и неработающий HTML, который в большинстве случаев действительно сделает вашу страницу непригодной для использования.

Вам просто не нужна часть формы в блоке, а другая часть всодержимое .

Однако вы хотите, чтобы оно визуализировалось , как если бы одна часть находилась в теле, а остальные - на боковой панели.

Хорошей новостью является то, что с HTML структура представления не зависит.Вот где лежит ваше решение.

  1. Дайте вашим полям формы хорошие идентификаторы и классы.Вы можете использовать hook_form_alter для изменения существующих форм, но вы, вероятно, просто хотите сами создать HTML-код для всей этой формы.Слой темы позволяет это.
  2. Используйте CSS, чтобы выбрать одно поле формы по идентификатору и положению: поместите их в нужное место.Или выберите классы полей по классу и расположению: сравните их в правильном месте.
  3. Создайте простую процедуру идентификации, которая позволит добавить класс в тег body.(см. ниже).
  4. Добавьте немного CSS, чтобы сдвинуть боковую панель ниже, освобождая место для полей формы, в которые нужно переместить, когда этот класс находится в теге body.

    <body class="<?php print $splitform ?>">

    function my_themename_preprocess_page() {
      if ($GET['q'] == 'path/to/view') {
        $vars['spliform'] = "splitform"
      }
    }
0 голосов
/ 12 июля 2011

Вы можете создать блок как пустой элемент div и сделать так, чтобы javascript с главной страницы заполнил его вторичной формой фильтра и всем остальным, что вам нужно. Опять же, вы можете использовать javascript для копирования значений формы из блочной формы в скрытые поля в главной форме при отправке. Это дает вам все необходимое управление из одного места (вывод узла). Единственное предостережение заключается в том, что он все больше полагается на javascript, чтобы объединить все вместе.

0 голосов
/ 05 июля 2011

Здесь есть связанная проблема: https://drupal.stackexchange.com/questions/3827/multiple-copies-of-views-filter-form-exposed-filters, которая описывает, как дублировать ваши фильтры.Однако это похоже на уродливый хак.

Похоже, что решение, упомянутое в # 6, выглядит немного чище: http://drupal.org/node/641838#comment-3247748 Не проверял его, но выглядит хорошо.

Это все еще даст вам некоторые накладные расходы (дубликатпредставления), но это может быть самый простой способ сделать это, используя представления.

С другой стороны, вы можете написать модуль и создать свой собственный блок фильтров, который подключается к вашему представлению.Вот сообщение в блоге об этом: http://www.hashbangcode.com/blog/creating-custom-views-filters-exposed-form-element-drupal-6-561.html

0 голосов
/ 05 июля 2011

Если вы используете что-то вроде context , вы можете получить доступ к блоку открытых фильтров дважды на одной странице.Затем вы можете использовать CSS, чтобы скрыть поля, которые вы не хотите отображать в каждой форме.

Основная проблема, с которой вы столкнулись, состоит в том, что если две формы находятся в разных местах, у них будет каждаяих собственный элемент формы - когда инициируется отправка, отправляются только поля формы в том же элементе формы.Вам нужно переместить их в одну форму или использовать JavaScript для сбора полей из обеих форм и создания поста.

0 голосов
/ 05 июля 2011

Из приведенного выше объяснения я предполагаю, что вы печатаете одну и ту же форму в блоке и в области содержимого и скрываете некоторую часть формы в page.tpl. Если это так, вы можете использовать hook_form_alter () в своем пользовательском модуле. тогда

  1. Сохранить значение элемента формы (присутствует в блоке) в глобальной переменной.
  2. Теперь используйте эту глобальную переменную и установите элемент формы (присутствует в области содержимого, этот элемент формы не виден пользователю).

Предоставьте больше информации, если вы реализовали другой способ.

С уважением, Chintan.

...