хук, тайтлы и 34000 записей

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

Аватар пользователя airam airam 11 декабря 2008 в 10:46

пишу модуль..

в хуке определял путь страницы, ее тайтл и функцию, генерющую содержание..
Почему я так делаю? - потому что что мне важны тайтлы у этих страниц..

все было хорошо покуда я в базу не залил 34000 записей..
друпал крякнул и пожаловался на нехватку памяти..
выделил ему память.. он пожаловался что мало времени..
дал много времени - отклика никакого..

думаю все равно это не выход, тк так долго ждать при каждом обращении к модулям - не дело..

какие можете предложить способы решения?
адреса выглядят как ноды 'page/32452'

можно в вызываемой функции переопределять тайтл страницы?

Комментарии

Аватар пользователя oblivion oblivion 11 декабря 2008 в 11:05

>какие можете предложить способы решения?
не могу помоч, так как не вижу кода
>можно в вызываемой функции переопределять тайтл страницы?
можно, но имхо не правельно, если путь типа node/12, тебе прийдется переоприделить рендеринг вывода ноды. рас так хочется переоприделять титл, так делай это перед сохранением/созданием ноды.

Аватар пользователя oblivion oblivion 11 декабря 2008 в 11:09

та пусть код покажет, тогда и будим гадать, дело в том что мне к примеру не понятно что он там переоприделят и какими хуками

Аватар пользователя airam airam 12 декабря 2008 в 5:00
$sql="SELECT * FROM price_firms";
$result = db_query(db_rewrite_sql($sql));

        while($data=db_fetch_object($result)){
                $items['firm/'.$data->id] = array(
                'title' => $data->title,
                //'description' => 'Sorting by alphabet.',
                'page callback' => 'firms',
                'page arguments' => array($data->id),
                'access callback' => TRUE,
                'type' => MENU_CALLBACK,
                //'type' => MENU_NORMAL_ITEM,
                );

}

Аватар пользователя edhel edhel 12 декабря 2008 в 6:50

Так даже в 5-ке не делали... Вы посмотрите как сделано в стандартных модулях, в том же node.module. Должен быть не цикл, а один элемент в массиве: $items['firm/%node'] = ...

См. также http://drupal.org/node/102338

Аватар пользователя airam airam 12 декабря 2008 в 10:25

drupal_set_title($data->title);

Нашел в ноде:

function node_page_view($node, $cid = NULL) {
  drupal_set_title(check_plain($node->title));
  return node_show($node, $cid);
}

можно, но имхо не правельно, если путь типа node/12, тебе прийдется переоприделить рендеринг вывода ноды. рас так хочется переоприделять титл, так делай это перед сохранением/созданием ноды.

Хочу удостовериться в верности решения..
Хук генерит пути и содержания страниц и добавляет их в кэш..
после изменения кода хук в модуле приходится выключать/включать модуль что бы он заново сгенерил в кэш меню..
точно тайтл нода определяется перед созданием ноды?

Аватар пользователя edhel edhel 12 декабря 2008 в 10:36

Только ради титула делать хук menu вообще смысла нет, лучше юзать хук nodeapi при $op=='view' && $page или вообще можно в теме нужный титул подписывать.

Но даже если делать хук menu, то не надо никакого цикла, один пункт меню firm/%node для всех нод (выше уже написал).

Аватар пользователя airam airam 12 декабря 2008 в 10:49

edhel wrote:
Только ради титула делать хук menu вообще смысла нет, лучше юзать хук nodeapi при $op=='view' && $page или вообще можно в теме нужный титул подписывать.
Но даже если делать хук menu, то не надо никакого цикла, один пункт меню firm/%node для всех нод (выше уже написал).

я думал в строке брать переменную и по ней определять содержимое, теперь уже с тайтлом..

function firms($n=''){
$output='<br>';
$sql="SELECT * FROM firms WHERE firms.id=$n";
        $result = db_query(db_rewrite_sql($sql));
        while($data=db_fetch_object($result)){
        drupal_set_title($data->title);
        $output.= ($data->title).'<br>';
        }
Аватар пользователя airam airam 12 декабря 2008 в 10:44

не могу понять

$items['node/%node'] = array(
    'title callback' => 'node_page_title',
    'title arguments' => array(1),
    'page callback' => 'node_page_view',
    'page arguments' => array(1),
    'access callback' => 'node_access',
    'access arguments' => array('view', 1),
    'type' => MENU_CALLBACK);

%node - откуда берется? что это такое?

Аватар пользователя edhel edhel 12 декабря 2008 в 11:12

$items['node/%node']
неявно вызывает node_load(arg(1))

'page callback' => 'node_page_view',
'page arguments' => array(1),
затем вызывается node_page_view($node), где $node загружен ранее с помощью node_load

В Вашем случае это может быть так:
$items['firm/%node'] = array(
'title' => 'Firm',
'page callback' => '_firm_page',
'page arguments' => array(1),
'access callback' => TRUE,
'type' => MENU_CALLBACK
);

function _firm_page($node) {
...drupal_set_title...print...
}

См. также http://drupal.org/node/102338

Аватар пользователя airam airam 12 декабря 2008 в 11:53

тк я понял что все равно все сводится к добавлению в кэш,
ничего не будет если туда добавить 32000 определений итемсов?
друпал справится?

Аватар пользователя edhel edhel 12 декабря 2008 в 12:48

ниасилил причем тут кэш, у Вас тормозит из-за того, что 32 тыс. пунктов меню сделано вместо одного