Как программно удалить поле из Views 3? - PullRequest
4 голосов
/ 31 января 2012

Привет! Я использую Drupal 7 и Views 3. У меня есть представление (с именем 'export'), которое генерирует csv-экспорт выбранных объектов узлов. Однако я поместил некоторый пользовательский код, который отображает все поля, содержащиеся в выбранной сущности узла, и позволяет пользователю выбирать поля (с помощью флажков), которые они не хотят включать в экспорт.

Я попытался сбросить выделенные поля в hook_views_query_alter следующим образом:

function mymodule_views_query_alter (&$view, &$query) {
  if ($view->name == "export") {
    unset($query->fields['field_data_field_description_node_entity_type']);
  }
}

Хотя эта часть массива полей не сбрасывается, я все же получаю заполненное поле описания в экспорте csv. Я просто недостаточно знаком со структурой объекта views, чтобы полностью понять, как удалить данное поле из представления. Я искал в Интернете буквально часы, пытаясь найти пост, чтобы пролить свет на это. Хотя я нашел множество примеров использования hook_views_query_alter для добавления фильтров или изменения оператора WHERE объекта запроса, я не нашел ничего общего с удалением столбцов, возвращаемых запросом представления. Любой совет по этому поводу будет очень признателен!

Спасибо, Axl

Ответы [ 2 ]

8 голосов
/ 27 марта 2012

Мне удалось удалить поля представлений для экспорта в CSV, отменив установку поля в hook_views_pre_build () в моем пользовательском модуле .:

function mymodule_views_pre_build(&$view) {
  if ($view->name == 'campaign_report'
      && $view->current_display == 'views_data_export_1') {

    // You'll have your own list of fields to remove that you create somehow...
    $fields_to_remove = array('field_name_to_remove_1','field_name_to_remove_2');

    foreach ($fields_to_remove as $field_name) {
      unset($view->field[$field_name]);            
      unset($view->display_handler->handlers['field'][$field_name]);  
    }
  }
}

Мне кажется, это отлично работает и выполняется раньше в жизненном цикле представлений, еще до того, как запрос будет построен. Фактически я начал использовать его как для представления таблицы, так и для экспорта в CSV, поскольку он кажется более эффективным, чем использование флажка «скрыть, если пуст» в настройках таблицы «Представления» (который должен повторяться для каждой строки в наборе результатов, чтобы посмотрите, пусто ли это, чтобы скрыть заголовок столбца). Если вы тоже хотите это сделать, вам нужно изменить оператор if () вверху, чтобы он проверял только $ view-> name. Затем поля будут удалены со всех дисплеев в этом представлении (а не только с дисплеем views_data_export_1).

0 голосов
/ 02 февраля 2012

Попробуйте удалить столбец из объекта $view.

unset($view->field['field_name'];
...