如何主题化视图公开形式?


12

我创建了一个带有许多暴露滤镜的视图,但是它看起来很丑陋。

在此处输入图片说明

我想改善主题,包括将整个内容包装在一个字段集中,以及对其他一些元素进行分组(例如,将已发布和已更新的输入配对),但是不确定如何执行此操作。

我尝试了var_dump表单,但是它似乎永远存在,并且我的浏览器锁定了,因此我无法轻易地以这种方式学习任何有关表单的信息。

我还尝试将表单作为字段集子级放置在另一个表单中,但是事实证明,获取所有表单ID信息都是有问题的(尽管我确实获得了字段集样式)。

任何人都有指针吗?

更新:

我将模板从模块复制到站点的主题目录,并开始了工作。

<fieldset>
    <legend>Filters</legend>

    <div class="views-exposed-form">
        <div class="views-exposed-widgets clear-block">
            <?php foreach($widgets as $id => $widget): ?>
                <div class="views-exposed-widget">
                    <?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; ?>
            <div class="views-exposed-widget">
                <?php print $button ?>
            </div>
        </div>
    </div>
</fieldset>

我似乎无法弄清楚如何配对日期字段-我需要以某种方式修改小部件属性,以便将它们包装在HTML中(使用hook_form_alter无效,因为#prefix和#suffix已添加到$widget->widget它们中,因此它们中断输出)

Answers:


22

主题视图的公开形式很难,因为它的行为不像大多数形式,而是使用其自己的标签机制。因此,您不能简单地使用一个form_alter钩子来添加#prefix和添加#suffix元素。但是,使用THEME_preprocess_views_exposed_form,您可以构建自己的后缀/前缀机制:

function THEME_preprocess_views_exposed_form(&$variables) {
  if ($variables['form']['#id'] == 'views-exposed-form-VIEWNAME-DISPLAYID') {
    foreach ($variables['widgets'] as $id => &$widget) {
      switch ($id) {
        case 'first_date_id':
          $widget->prefix = '<div class="date-widgets-wrapper">';
          break;
        case 'last_date_id':
          $widget->suffix = '</div>';
          break;
      }
    }
  }
}

并在模板文件中

<fieldset>
    <legend>Filters</legend>

    <div class="views-exposed-form">
        <div class="views-exposed-widgets clear-block">
            <?php foreach($widgets as $id => $widget): ?>
                <?php if (!empty($widget->prefix)) print $widget->prefix; ?>
                <div class="views-exposed-widget">
                    <?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 if (!empty($widget->suffix)) print $widget->suffix; ?>
            <?php endforeach; ?>
            <div class="views-exposed-widget">
                <?php print $button ?>
            </div>
        </div>
    </div>
</fieldset>

7

您可以将views-exposed-form.tpl.php从sites / all / modules / views / theme复制到主题路径以覆盖模板。


您也可以仅使用诸如views-exposed-form--view_id.tpl.php或的模式覆盖特定视图views-exposed-form--view_id--display_id.tpl.php更多信息
user56reinstatemonica8 '16


3

您应该调查一下form['#theme']项目中的内容。更好的方法var_dump()是使用dsm($form),甚至可以使用,甚至kpr($form)可以在安装devel模块(http://drupal.org/project/devel)之后使用这些功能。form['#theme']应该是大约7个元素的数组。这些元素是呈现此表单时调用的主题挂钩的名称。您可以使用它们来实现您自己的表单主题设置方式。

其中一项将称为views_exposed_form__VIEW_NAME__DISPLAY_ID

在您的模块(如果有的话)中,应该有一个hook_theme()实现。

function MYMODULE_theme($existing, $type, $theme, $path) {
  return array(
    'views_exposed_form__VIEW_NAME__DISPLAY_ID' => array(
      'function' => 'my_exposed_form_theme_function',
      'render element' => 'form',
    )
  );
}

// somwhere later in code

function my_exposed_form_theme_function($vaiables) {
  //$vaiables['form'] contains a form array
  //to display a form element call drupal_render($vaiables['form']['some element'])
  //don't forget to call drupal_render($form) 
  //after you are done with rendering individual elements
  //
  //you can use template_preprocess_views_exposed_form() from 
  // views/theme/theme.inc as an example

  return "concatenated results of multiple drupal_render() calls";
}

2

在以前的情况下,我使用Hook_form_alter()添加前缀和后缀来形成元素,以将它们包装在div中,然后可以对其进行样式设置。虽然不确定是否包装在字段集中。

例如。

$form['submitted']['full_name']['#prefix'] = '<div class="background">';        
$form['submitted']['message']['#suffix'] = '</div>';

1

使用Drupal的hook_form_FORM_ID_alter修改表单。这是解决了我在价格字段前添加£字符的问题的解决方案(将此放入您的自定义模块中):

function THEME_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
   // check this is the right form
   if ($form['#theme'][0] == 'REPLACE_THIS') {
      // add the prefix
      $form['price']['min']['#prefix'] = "£";
   }
}


0

在视图的编辑页面中,我们可以检查主题信息(右下角)。它提供了有关Drupal用于在屏幕上呈现视图的不同部分的模板文件的信息。默认情况下,使用views模块提供的模板文件(在其主题文件夹中),但是如果要修改视图的显示方式,则可以使用可放入我们内部的自定义模板文件覆盖这些模板文件。自己的自定义主题文件夹(或将用于显示此视图的主题)

该主题信息向我们展示了如何根据层次结构(或将要覆盖视图自己的模板的模板文件的作用范围)来命名文件。

现在,此主题信息可能不会显示该视图用于呈现此特定视图的所有模板文件。

因此,请转到site / all / modules / views / theme并复制views-exposed-form.tpl.php(因为在这种情况下,我们要覆盖呈现过滤器的默认设置!)并将其粘贴到您自己的主题文件夹中,现在,您必须按照相同的方法来控制此覆盖的模板文件的效果,方法是通过相应地重命名该模板文件并将其放置在自己的主题文件夹中。例如,views-exposed-form-您的视图名称-窗格名称.tpl.php(您将通过在视图的编辑页面中查看theme:information来了解术语)

现在,您可以在此模板文件中将css添加到单个小部件(由过滤器处理程序生成)中,并且这些设置将应用于过滤器。

请访问http://eureka.ykyuen.info/2011/07/25/drupal-theme-the-exposed-filter-in-views/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.