[РЕШЕНИЕ] Вставить exposed фильтры в collapsible fieldset

Аватар пользователя VVS VVS 26 августа 2012 в 15:33

Надо было сделать exposed фильтры во views скрывающимися. Видел в сборке Drupal Commons такое. Простой перенос tpl и css практически ничего не дал - там Drupal 6? то одно не работало, то другое.
Решения под Д7 не нашёл в одном месте (или плохо искал?). Собрал по крупицам:

Перетащить views/theme/views-exposed-form.tpl.php в тему и изменить к виду:


<?php
/**
 * file views-exposed-form.tpl.php
 *
 * This template handles the layout of the views exposed filter form.
 *
 * Variables available:
 * - $widgets: An array of exposed form widgets. Each widget contains:
 * - $widget->label: The visible label to print. May be optional.
 * - $widget->operator: The operator for the widget. May be optional.
 * - $widget->widget: The widget itself.
 * - $sort_by: The select box to sort the view using an exposed form.
 * - $sort_order: The select box with the ASC, DESC options to define order. May be optional.
 * - $items_per_page: The select box with the available items per page. May be optional.
 * - $offset: A textfield to define the offset of the view. May be optional.
 * - $reset_button: A button to reset the exposed filter applied. May be optional.
 * - $button: The submit button for the form.
 *
 * ingroup views_templates
 */
?>
<?php 
// Add collapsible fieldset js if it is not already included
drupal_add_js('misc/drupal.js');
drupal_add_js('misc/form.js');
drupal_add_js('misc/collapse.js');
?>

<?php if (!empty($q)): ?>
  <?php
    
// This ensures that, if clean URLs are off, the 'q' is added first so that
    // it shows up first in the URL.
    
print $q;
  
?>
<?php 
endif; ?>
<fieldset class="views-exposed-form collapsible collapsed">
<legend><span class="fieldset-legend"><?php print(t("Filter")); ?></span></legend>
  <div class="views-exposed-widgets fieldset-wrapper clearfix">
    <?php foreach ($widgets as $id => $widget): ?>
      <div id="<?php print $widget->id?>-wrapper" class="views-exposed-widget views-widget-<?php print $id?>">
        <?php if (!empty($widget->label)): ?>
          <label for="<?php print $widget->id?>">
            <?php print $widget->label?>
          </label>
        <?php endif; ?>
        <?php if (!empty($widget->operator)): ?>
          <div class="views-operator">
            <?php print $widget->operator?>
          </div>
        <?php endif; ?>
        <div class="views-widget">
          <?php print $widget->widget?>
        </div>
      </div>
    <?php endforeach; ?>
    <?php if (!empty($sort_by)): ?>
      <div class="views-exposed-widget views-widget-sort-by">
        <?php print $sort_by?>
      </div>
      <div class="views-exposed-widget views-widget-sort-order">
        <?php print $sort_order?>
      </div>
    <?php endif; ?>
    <?php if (!empty($items_per_page)): ?>
      <div class="views-exposed-widget views-widget-per-page">
        <?php print $items_per_page?>
      </div>
    <?php endif; ?>
    <?php if (!empty($offset)): ?>
      <div class="views-exposed-widget views-widget-offset">
        <?php print $offset?>
      </div>
    <?php endif; ?>
    <div class="views-exposed-widget views-submit-button">
      <?php print $button?>
    </div>
    <?php if (!empty($reset_button)): ?>
      <div class="views-exposed-widget views-reset-button">
        <?php print $reset_button?>
      </div>
    <?php endif; ?>
  </div>
</fieldset>
?>

Т.е. в tpl добавляется подключение js, fieldset, legend span, fieldset-wrapper в div.

Добавить CSS:

fieldset.views-exposed-form:after {
  clear: both;
  content: ".";
  display: block;
  height: 0;
  visibility: hidden;
}
html.js fieldset.views-exposed-form {
  margin: 18px 0;
}
html.js fieldset.collapsible {
  position: relative;
}
html.js fieldset.collapsible .fieldset-wrapper {
  overflow: visible;
}
fieldset.views-exposed-form {
  border: 1px solid #CCCCCC;
  clear: both;
  overflow: visible;
  padding: 0;
}

CSS пока не чистил, возможно он избыточен, перетаскивал через firebug.

Использовано:
Частично Drupal Commons тема commons_roots
разбор кода misc/collapse.js
http://drupal.org/node/321779 - отличия от D6 в span.fieldset-legend и span.fieldset-wrapper
http://api.drupal.org/api/drupal/includes!form.inc/function/theme_fields... - подключение form.js

Комментарии

Аватар пользователя cosmos cosmos 27 августа 2012 в 10:51

а я бы просто перехватил в хуке form_alter форму exposed фильтров
и подцепил туда филдсет без всяких шаблонов ит подобного гемороя

Аватар пользователя divined divined 27 августа 2012 в 11:09

делается в 2 секунды и вешать можно на что угодно:
http://rkreal.ru/kvartiry-v-bolgarii

Хук на форму, добавление префикса и суфикса к элементам.

Всего 4 строчки кода и все работает и незачем такой огород городить.

Аватар пользователя VVS VVS 27 августа 2012 в 11:18

Уважаемые, очень умные господа!
Где Вы увидели тут геморрой и огород?
Опишите свои решения подробно, и в отдельных ветках, пожалуйста.

Аватар пользователя VVS VVS 27 августа 2012 в 13:00

"orion76" wrote:
гугл: drupal 7 form fieldset

Спасибо.
Мне решение темизацией нужно было. Почему все предлагают хуки?

Аватар пользователя cosmos cosmos 5 сентября 2012 в 1:38

потому что мы это более правильное и гибкое решение чем вставляь html филдсета
можно прикрутить collapsible например легко при чем, но минус в то мчто нужно уметь программить хотя бы немного
вот ссылка на доки
http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.ht...