Для отображения данных использую модуль Views и Table view.
При стандартном отображении названия полей идут в столбцах, а сами продукты в строчках. Можно ли сделать наоборот, т.е. чтобы названия полей были в строчках, а продукты стали столбцами.
Очень нужно, и нигде не могу найти ответ.
Комментарии
В модуле 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 в своей теме.
Просто поменяйте местами первый и второй foreach в этой функции и массив транспонируется
Простите, не могли бы еще проще объяснить, как поменять местами два forech. Что куда перекопировать? Если я правильно поняла файл views.modul, то один foreach встроен в другой. Как же их поменять местами?
строчки
foreach ($nodes as $node) {
и
foreach ($view->field as $field) {
поменять местами( надеюсь вы в самом модуле вьюс этого не делаете, а делаете как я указал)
Нет, сам модуль трогать не рискую. После некоторых проблем знаю, что так делать не следует Спасибо огромное за совет. Сейчас буду экспериментировать.
Метод сработал, но не совсем. Заголовки таблицы остались на прежнем месте! Т.е. данные таблицы стали столбцами, но заголовки таблицы остались на месте. Что еще сделать, чтобы заголовки, идущие в строчку теперь стали одним столбцом? Называется это table_header.
попробуйте так, может пойдет
/**
* 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);
}
Не проходит.
Выдает следующие ошибки:
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.
Эти ошибки исчезают, если строчку
return theme('table', '', $rows);
заменить на return theme('table', $table_header, $rows);
При этом таблица оказывается совсем без заголовков
В итоге функция получилась такая(и все решается)
/**
* 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);
}
При этом, увы, таблица получается без секции
<thead></thead>
, что не есть хорошо. Иногда, например, jQuery использует header таблицы.а никак нельзя, чтобы была возможность форматировать таблицу и так и так?
то есть какие-то виды выводить в колонках поля а какие-то - в строчках?
Можно. Для этого нужно поставить условие, при выполнении которого функция будет перекрываться.
Тогда вместо return theme('table', array(), $rows);
нужно вставить return theme('table', (то,что вам надо в виде массива), $rows);
Что надо заменить array() - это понятно. А вот что поставить вместо "то,что вам надо в виде массива", чтобы в таблице была секция thead, содержащая первую строку транспонированной таблицы (т.е. первую колонку до транспонирования) - пока не "врубаюсь".
Вообще то там получаются столбцы, содержащие инфу об отдельном ноде и логично было бы выводить тайтл нода в хедер, но ведь его можно выводить первым полем( настройка вьюс- филдз) и тогда все названия( тайтлы) нодов будут в первой строке таблицы и необходимость thead отпадает.
В моем случае для скрипта на jQuery нужно именно thead...
В таком случае можно разбить массив $rows так, чтобы в заголовок попал первый его элемент, а в остальные строки таблицы все его элементы, начиная со второго.
Для этого в вышеприведенной функции достаточно поменять последнюю строчку
return theme('table', array(), $rows);
на такую:
return theme('table', $rows[0], array_shift($rows));