смена количества выводимых нод в списке на лету

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

Аватар пользователя Sangre Sangre 17 июня 2009 в 4:25

для определённого типа материалов нужно выводить не по 10, как по-умолчанию, а по 16 нод на страницу, как можно изменить этот параметр перед выводом и потом вернуть обратно?

Комментарии

Аватар пользователя romass romass 17 июня 2009 в 13:07

в node_page_default() есть запрос к бд:
$result = pager_query(db_rewrite_sql('SELECT n.nid, n.sticky, n.created FROM {node} n WHERE n.promote = 1 AND n.status = 1 ORDER BY n.sticky DESC, n.created DESC'), variable_get('default_nodes_main', 10));

Аватар пользователя Dan Dan 17 июня 2009 в 14:54

2romass: ура хакерам! Smile

Если человек хакает ядро, это значит, что он или нашёл баг или не знает Drupal. В первом случае надо отсылать патч на D.org, во втором - учиться, учиться, учиться Smile

Аватар пользователя romass romass 17 июня 2009 в 15:09

Dan, я разве что-то говорил про хакиннг?.. Ты или не внимательно читал мой коммент, или тупишь:)
Что бы решить проблему, нужно сначала найти ее причину. В данном случае это тот запрос к дБ.
А вариантов решений может быть несколько (в том числе и хаккинг).

Аватар пользователя romass romass 17 июня 2009 в 15:43

Интересная логика. Вообще-то я выделил параметр функции, а не сам запрос…
Можно определить свой калбек, создать отдельный блок, hook_ menu_alter или может даже через view…
А вообще было бы неплохо сначала узнать как автор поста выводит и фильтрует ноды.

Аватар пользователя Sangre Sangre 17 июня 2009 в 17:51
<?php
    $q 
explode('/'$_REQUEST['q']);    
    switch(
$q[0])
    {                                                                  
        case 
'news':
            
//variable_set('default_nodes_main', 16);
            
include('page-taxonomy-news.tpl.php');
            
//variable_set('default_nodes_main', 10);
            
break;
        case 
'business':
            include(
'page-taxonomy-business.tpl.php');
            break;
        default:
            include(
'page.tpl.php');            
    }
?>

это код page-taxonomy-term.tpl.php, думаю логика ясна )
закоменченные строки - попытка решить проблему без хака ядра(провал)

Аватар пользователя kosilko kosilko 17 июня 2009 в 17:53

перед выводом типа материала прописать $GLOBALS['conf']['default_nodes_main'] = 16,
после вывода вернуть взад. Вроде должно сработать...

Аватар пользователя Sangre Sangre 18 июня 2009 в 12:15

romass wrote:
Как вариант:

function hook_init() {
$GLOBALS['conf']['default_nodes_main'] = (arg(0) == 'news') ? 16 : 10;
}

а куда это нужно написать? пробовал в template.php. не работает.

Аватар пользователя kosilko kosilko 17 июня 2009 в 21:40

"Sangre" wrote:
заменил variable_set('default_nodes_main', 16); на $GLOBALS['conf']['default_nodes_main'] = 16; не пашет! ( неужели без хака ядра никак?

вся фишка в том, что по факту код этот должен отработать ДО pager_query, а в какое место вы этот код решите прописать - дело ваше, можете ядро хакнуть, можете в своем модуле или теме. А оперировать с $GLOBALS['conf'] я предложил как альтернативу variable_set, дабы в БД лишний раз не записывать.

Аватар пользователя romass romass 18 июня 2009 в 13:36

Этот хук запускается только в файлах модуля.
Его нужно поместить в какой-то свой модуль.

function [module_name]_init() {
$GLOBALS['conf']['default_nodes_main'] = (arg(0) == 'news') ? 16 : 10;
}
где [module_name] – название модуля

Аватар пользователя Sangre Sangre 18 июня 2009 в 15:14

пришлось хакать taxonomy.module

<?php
function taxonomy_select_nodes($tids = array(), $operator 'or'$depth 0$pager TRUE$order 'n.sticky DESC, n.created DESC') {
  if (
count($tids) > 0) {
    
// For each term ID, generate an array of descendant term IDs to the right depth.
    
$descendant_tids = array();
    if (
$depth === 'all') {
      
$depth NULL;
    }
    foreach (
$tids as $index => $tid) {
      
$term taxonomy_get_term($tid);
      
$tree taxonomy_get_tree($term->vid$tid, -1$depth);
      
$descendant_tids[] = array_merge(array($tid), array_map('_taxonomy_get_tid_from_term'$tree));
    }

    if (

$operator == 'or') {
      
$args call_user_func_array('array_merge'$descendant_tids);
      
$placeholders implode(','array_fill(0count($args), '%d'));
      
$sql 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ('$placeholders .') AND n.status = 1 ORDER BY '$order;
      
$sql_count 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ('$placeholders .') AND n.status = 1';
    }
    else {
      
$joins '';
      
$wheres '';
      
$args = array();
      foreach (
$descendant_tids as $index => $tids) {
        
$joins .= ' INNER JOIN {term_node} tn'$index .' ON n.nid = tn'$index .'.nid';
        
$placeholders implode(','array_fill(0count($tids), '%d'));
        
$wheres .= ' AND tn'$index .'.tid IN ('$placeholders .')';
        
$args array_merge($args$tids);
      }
      
$sql 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n '$joins .' WHERE n.status = 1 '$wheres .' ORDER BY '$order;
      
$sql_count 'SELECT COUNT(DISTINCT(n.nid)) FROM {node} n '$joins .' WHERE n.status = 1 '$wheres;
    }
    
$sql db_rewrite_sql($sql);
    
$sql_count db_rewrite_sql($sql_count);
    if (
$pager) {
      
$q explode('/'$_REQUEST['q']);
      switch (
$q[0])
      {
        case 
'news':
            
$default_nodes_main 16;
            break;
        default:
            
$default_nodes_main variable_get('default_nodes_main'10);
      }
      
$result pager_query($sql$default_nodes_main0$sql_count$args);
    }
    else {
      
$result db_query_range($sql$args0variable_get('feed_default_items'10));
    }
  }

  return 

$result;
}

function 

taxonomy_render_nodes($result) {
  
$output '';
  if (
db_num_rows($result) > 0) {
    while (
$node db_fetch_object($result)) {
      
$output .= node_view(node_load($node->nid), 1);
    }
    
    
$q explode('/'$_REQUEST['q']);
    switch (
$q[0])
    {
        case 
'news':
            
$default_nodes_main 16;
            break;
        default:
            
$default_nodes_main variable_get('default_nodes_main'10);
    }

    

$output .= theme('pager'NULL$default_nodes_main0);
  }
  else {
    
$output .= '<p>'t('There are currently no posts in this category.') .'</p>';
  }
  return 
$output;
}
?>
Аватар пользователя Dan Dan 18 июня 2009 в 15:47

Чем Вас не устроил вариант romass - написание своего модуля размером в одну строчку?

Теперь, по хорошему, Вам ещё патч надо делать. Потом, после очередного апгрейда его накладывать. Или у Вас по типу "сдал проект и заб[ы|и]л"?

Аватар пользователя Sangre Sangre 18 июня 2009 в 18:57

Я думаю, ап модуля таксономии можно ещё пережить. А проект на стадии активной разработки и при особой надобности можно написать и модуль!