Производительность: Снипет vs Views. А как сделать снипетом, то что делает вьюс

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

Аватар пользователя Valeratal Valeratal 30 ноября 2009 в 17:55

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

Что имется
Вывод анонсов (стандартных тизеров) нод со следующими фильтрами
1. Опубликовано
2. Вид ноды (page или story например)
3. У ноды есть определенный термин таксономии

Сортировка стандартная, по дате публикации

вывод по 10 штук

Все это добро поместить по определенной ссылке (то есть вывод страничный)

и второй вид

Вывод заголовком, в таблице (со стилем "таблица") заголовки, отсортированные по заголовку ноды, фильтры те же

1. Опубликовано
2. Вид ноды (page или story например)
3. У ноды есть определенный термин таксономии

также, это добро доступно по определенный ссылке

Подскажите, можно ли и нужно ли это лучше делать сниппетом, или нет, не тот случай?

Комментарии

Аватар пользователя toshaxtsa toshaxtsa 30 ноября 2009 в 18:39

Насчет производительности точно не скажу. Отвечу что знаю и как думаю.

Вьюсы работают через модуль. Если не изменяет память то то что наяваяли во вьюсе (запрос) храниться в базе. Вывод Дергаем базу 1 раз на извлечение запроса, 2 раз выполняем сам запрос.

Снипет - дергаем только сам запрос, так как обращаемся к самой базе на прямую.

Но при работе со снипетами есть один сколькзий момент. Безопасность. Если вьюсы еще более менее фильтруют вход в базу, то снипет это код программиста и ответственность за передачу параметров полностью на разработчике кода. Тоесть снипет больше уязвим в плане XSS

Я на своем сайте использую и то и то.

Вьюс просто хорош тем что визуально можно сконструировать запрос. Хотя в некоторых местах он не совсем верно использует синтаксис SQL

Аватар пользователя Mr.Alinaki@drupal.org Mr.Alinaki@drup... 30 ноября 2009 в 18:48

Views, помимо всего прочего, предлагают тонну хуков, генерируют кучу лишних данных в объекте, которые вы может и не будете использовать, и вообще весьма активно используют как процессор, так и память. В своём коде будет в разы меньше данных гоняться. В связи с этим мне просто непонятно, зачем некоторые модули требуют Views для работы, хотя он им в принципе по факту не нужен... например OG User Roles...

Аватар пользователя kyky kyky 1 декабря 2009 в 8:14

Вьюс показывает запрос, которым он черпает данные.
Вы его контрол-Ц контрол-В, поправьте, если нужно, и пишите модуль или сниппет.
Если запрос тяжелый, то закешируйте, можно и мемкеш, можно и самому на файлах.

Аватар пользователя Dmitriy_ua Dmitriy_ua 5 декабря 2009 в 3:24

sql + php [+ drupal API]

вот небольшой пример без hook_menu

function news_list() {
        $type = 'story';
    $status = 1;
    $sql = "SELECT * FROM {node} n WHERE type = '%s' AND status = %d ORDER BY n.created DESC";
    $pager_num = 0; // This is the first pager on this page. We number it 0.
    $result = pager_query(db_rewrite_sql($sql), 10, $pager_num, NULL, $type, $status);
    while ($data = db_fetch_object($result)) {
          $node = node_load($data->nid);
          $output .= node_view($node, TRUE);
    }
        $output .= theme('pager', NULL, 10, $pager_num);
return $output;
}

Только это не снипет, это кусок модуля.

можно обойтись без node_load и node_view, но кода тогда будет гораздо больше.