Как транспонировать таблицу в модуле Views при использовании способа отображения Table view? [решено]

Главные вкладки

Аватар пользователя NeuZeitgeist NeuZeitgeist 15 декабря 2007 в 18:06

Для отображения данных использую модуль Views и Table view.
При стандартном отображении названия полей идут в столбцах, а сами продукты в строчках. Можно ли сделать наоборот, т.е. чтобы названия полей были в строчках, а продукты стали столбцами.
Очень нужно, и нигде не могу найти ответ.

Комментарии

Аватар пользователя gorr gorr 15 декабря 2007 в 18:46

В модуле views такая функция:
/**
* Display the nodes of a view as a table.
*/
function theme_views_view_table($view, $nodes, $type) {
$fields = _views_get_fields();

foreach ($nodes as $node) {
$row = array();
foreach ($view->field as $field) {
if ($fields[$field['id']]['visible'] !== FALSE) {
$cell['data'] = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);
$cell['class'] = "view-field ". views_css_safe('view-field-'. $field['queryname']);
$row[] = $cell;
}
}
$rows[] = $row;
}
return theme('table', $view->table_header, $rows);
}

Ее нужно в своей теме перекрыть функцией МОЯ_ТЕМА_views_view_table , в которой транспонировать массив $rows перед тем, как передать его в theme('table', $view->table_header, $rows);
Полученную таким образом функцию надо вставить в файл template.php в своей теме.

Аватар пользователя NeuZeitgeist NeuZeitgeist 15 декабря 2007 в 19:08

Простите, не могли бы еще проще объяснить, как поменять местами два forech. Что куда перекопировать? Если я правильно поняла файл views.modul, то один foreach встроен в другой. Как же их поменять местами?

Аватар пользователя gorr gorr 15 декабря 2007 в 19:12

строчки
foreach ($nodes as $node) {
и
foreach ($view->field as $field) {
поменять местами( надеюсь вы в самом модуле вьюс этого не делаете, а делаете как я указал)

Аватар пользователя NeuZeitgeist NeuZeitgeist 15 декабря 2007 в 19:17

Нет, сам модуль трогать не рискую. После некоторых проблем знаю, что так делать не следует Smile Спасибо огромное за совет. Сейчас буду экспериментировать.

Аватар пользователя NeuZeitgeist NeuZeitgeist 15 декабря 2007 в 19:25

Метод сработал, но не совсем. Заголовки таблицы остались на прежнем месте! Т.е. данные таблицы стали столбцами, но заголовки таблицы остались на месте. Что еще сделать, чтобы заголовки, идущие в строчку теперь стали одним столбцом? Называется это table_header.

Аватар пользователя gorr gorr 15 декабря 2007 в 19:53

попробуйте так, может пойдет
/**
* Display the nodes of a view as a table.
*/
function theme_views_view_table($view, $nodes, $type) {
$fields = _views_get_fields();

foreach ($view->field as $field) {
$row = array();
$row[] = $view->table_header['$field["id"]'];//пока точно не знаю
foreach ($nodes as $node) {
if ($fields[$field['id']]['visible'] !== FALSE) {
$cell['data'] = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);
$cell['class'] = "view-field ". views_css_safe('view-field-'. $field['queryname']);
$row[] = $cell;
}
}
$rows[] = $row;
}
return theme('table', '', $rows);
}

Аватар пользователя NeuZeitgeist NeuZeitgeist 15 декабря 2007 в 19:55

Не проходит.
Выдает следующие ошибки:
warning: Invalid argument supplied for foreach() in D:\....\tablesort.inc on line 149.
warning: Invalid argument supplied for foreach() in D:\.....includes\tablesort.inc on line 187.
warning: Invalid argument supplied for foreach() in D:\.....\includes\theme.inc on line 769.

Аватар пользователя NeuZeitgeist NeuZeitgeist 15 декабря 2007 в 20:40

Эти ошибки исчезают, если строчку
return theme('table', '', $rows);
заменить на return theme('table', $table_header, $rows);
При этом таблица оказывается совсем без заголовков

Аватар пользователя gorr gorr 16 декабря 2007 в 20:53

В итоге функция получилась такая(и все решается)
/**
* Display the nodes of a view as a table.
*/
function МОЯ_ТЕМА_views_view_table($view, $nodes, $type) {
$fields = _views_get_fields();
foreach ($view->field as $field) {
$row = array();if ($field['label']) {
$cellhead['data'] = $field['label'];$cellhead['class'] = "view-cell-header" . views_css_safe(' view-field-'. $field['queryname']);$row[] = $cellhead;
}foreach ($nodes as $node) {

if ($fields[$field['id']]['visible'] !== FALSE) {
$cell['data'] = views_theme_field('views_handle_field', $field['queryname'], $fields, $field, $node, $view);
$cell['class'] = "view-field ". views_css_safe('view-field-'. $field['queryname']);
$row[] = $cell;
}
}
$rows[] = $row;
}
return theme('table', array(), $rows);
}

Аватар пользователя kima kima 13 января 2008 в 9:21

а никак нельзя, чтобы была возможность форматировать таблицу и так и так?
то есть какие-то виды выводить в колонках поля а какие-то - в строчках?

Аватар пользователя gorr gorr 14 января 2008 в 14:04

Можно. Для этого нужно поставить условие, при выполнении которого функция будет перекрываться.

Аватар пользователя gorr gorr 21 февраля 2008 в 16:05

Тогда вместо return theme('table', array(), $rows);
нужно вставить return theme('table', (то,что вам надо в виде массива), $rows);

Аватар пользователя vadbars@drupal.org vadbars@drupal.org 25 февраля 2008 в 11:48

Что надо заменить array() - это понятно. А вот что поставить вместо "то,что вам надо в виде массива", чтобы в таблице была секция thead, содержащая первую строку транспонированной таблицы (т.е. первую колонку до транспонирования) - пока не "врубаюсь". Smile

Аватар пользователя gorr gorr 26 февраля 2008 в 17:51

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

Аватар пользователя gorr gorr 22 марта 2008 в 12:45

В таком случае можно разбить массив $rows так, чтобы в заголовок попал первый его элемент, а в остальные строки таблицы все его элементы, начиная со второго.
Для этого в вышеприведенной функции достаточно поменять последнюю строчку
return theme('table', array(), $rows);
на такую:
return theme('table', $rows[0], array_shift($rows));