[решено] Разное время генерации страницы при выводе одних и тех же нод в VIEWS

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

Аватар пользователя droopy droopy 22 февраля 2013 в 13:01

Здравствуйте!
Прошу помочь с сей ситуацией: есть интернет магазин, каталог строится через views-taxonomy где отображаются teasers товаров по 20 шт. на страницу.
Заметила такую странность, что если выводить товары с помощью полей views, то время генерации страницы составляет около 1000мс, а если выводить товары как материалы (шаблон node-product.tpl.php), то время генерации страницы составляет около 5000мс. Полями строить вывод товаров неудобно, хочется пользоваться своим шаблоном node-product.tpl.php
Ради эксперимента решила удалить весь код из шаблона и снова замерила скорость генерации. Увы, она осталась прежней, около 5000мс. Стало ясно, что время генерации не зависит от того, что в моем шаблоне.
Затем решила выключить (скрыть) все не нужные мне поля в тизере товара из display fields в /admin/content/node-type/product/display, время генерации немного уменьшилось, на 500мс. Этого недостаточно.
Появилось подозрение, что views при отображении каталога не полями, а материалом (тизер из node-product.tpl.php) берет в расчет абсолютно все данные из тизера (teaser node) и полной ноды (full node). КАКОЙ кошмар!
Что делать? Кто сталкивался?

-------------------

Решение очень простое: все же использовать поля (отказаться от вывода шаблона node-product.tpl.php т.к. в любом случае движок будет выполнять node_load т.е. прогружать ноду целиком, со всеми полями и это не исправить). Настроить view так, что бы поля брались (заимствовались) из вида default (по-умолчанию, самый первый) в другие виды.

Комментарии

Аватар пользователя droopy droopy 22 февраля 2013 в 13:55

Да, около 30 полей CCK (характеристики товаров), но в полноый ноде (full node). В тизере выводится только node->title, цена, фото и производитель.
Есть у меня подозрение на то, что все поля в full node просчитываются, даже для вывода teaser (для вывода в views как материал шаблон node-product.tpl.php).
А если выводить полями в views, то разумеется, просчитываются только добавленные для вывода поля.
Может быть такое?

Аватар пользователя drupby drupby 22 февраля 2013 в 14:07

в node-product.tpl.php передаётся объект ноды , в котором естественно содержится инфа о всех полях
а вьюха при выводе полей просто делает запрос к базе данных делая выборку из 2-х полей
время генерации запроса пару милисекунд , а сформировать объект ноды - тут зависит от самой ноды и навешенной на нее полями
с другой стороны вопрос в целесообразности использования такого количества полей
и кэшированием не стоит пренебрегать - главное настроить правильно под конкретную задачу

Аватар пользователя droopy droopy 22 февраля 2013 в 14:06

"drupby" wrote:
в node-product.tpl.php передаётся объект ноды , в котором естественно содержится инфа о всех полях

Получается, что метод вывода шаблоном node-product.tpl.php (даже если шаблон вообще пустой) подразумевает 100% прогрузку всех полей этого типа материала и никак это нельзя исправить?

"ХулиGUN" wrote:
Никогда каталог не делал тизерами, но друпал скорее всего загружает сначала всю ноду, а отдавать может что угодно, Попробуйте выводить полями

Выводить полями - это кошмар. В taxonomy-view нужно выводить около 10 полей (для тизера). Для разных страниц каталога требуются разные views-фильтры (разные типы товаров). Получается, что мне нужно создавать каждый раз по 10 полей для каждого вида, что бы использовать отдельные фильтры.
Я поэтому и написала, что поля использовать неудобно.

Аватар пользователя droopy droopy 22 февраля 2013 в 14:16

Вот настройки из display fields в /admin/content/node-type/product/display (по идее full_node прогружаться не должен, но похоже, что прогружается).

Аватар пользователя drupby drupby 22 февраля 2013 в 14:49

вот здесь рассмотрен данный вопрос
и заметьте , что заголовок "использование вьюс для избежания загрузки node_load()"
так что выводите полями либо кэш

Аватар пользователя droopy droopy 22 февраля 2013 в 15:03

А может есть какая-то надстройка для views, что бы не собирать каждый вид из 10 и более полей и настраивать каждое из них, а внедрять какой-то заготовленный шаблон для импорта или код аналогичный как в node-product.tpl.php?
Знаю про views import, но там импортируется целиковая view, а не фрагмент с полями.

Аватар пользователя drupby drupby 22 февраля 2013 в 15:11

так используйте один вьюс и только добавляйте дисплеи , при этом выбирая для каждого поля которое в нём индивидуальное переопределить для данного дисплея(override)

Аватар пользователя droopy droopy 22 февраля 2013 в 15:26

"drupby" wrote:
так используйте один вьюс и только добавляйте дисплеи , при этом выбирая для каждого поля которое в нём индивидуальное переопределить для данного дисплея(override)

Ага, спасибо за подсказку, забыла про зависимые виды в настройках.

Аватар пользователя gorr gorr 22 февраля 2013 в 20:12

В 6-ке если views настроен выводить тизерами, то он работает так: сначала отбирает запросом нужные ноды по критериям, а потом для каждого выбранного nid с помощью node_load загружает все поля ноды (на этот 2-й этап и уходят 4 секунды).
Поэтому используйте поля, а в теме можно сделать шаблон для вьюза выводящий поля, например перекрыв этот: http://api.drupal.org/api/views/theme!views-view-fields.tpl.php/6

Аватар пользователя drupby drupby 23 февраля 2013 в 18:09

"droopy" wrote:
Решение очень простое: все же использовать поля (отказаться от вывода шаблона node-product.tpl.php т.к. в любом случае движок будет выполнять node_load т.е. прогружать ноду целиком, со всеми полями и это не исправить). Настроить view так, что бы поля брались (заимствовались) из вида default (по-умолчанию, самый первый) в другие виды.

а я бы ещё и Views content cache поставил - он кэш сбрасывает как только нода добавилась новая или старая обновилась , тогда можно выводить и хоть full отображением материала