хм.... странно.... а у меня advpoll (сори, в предыдущем посте немного с названием ошибся) стоИт...
dev-версия вполне сносно работает.
правда, прришлось ручками подправить одну ошибку (там длина прогресбара не совсем корректно иногда считается)
ну а если уж скриптом делать, то думаю можно сделать выборку айдишников нод определённого типа из базы и потом делать рэндом из этого массивчика. ну а дальше - как у Вас.
<?php$sql = "SELECT nid FROM {node} WHERE status = 1 AND type = 'poll' ORDER BY RAND() LIMIT 1"; $nid = db_result(db_query($sql)); $poll = node_load($nid); if ($poll->nid) { $poll = poll_view($poll, TRUE, FALSE, TRUE); } $block['content'] = drupal_render($poll->content); return $block['content'];?>
Способ не идеальный, в силу особенной работы мускуля, но рабочий
Чтобы это сделать, я немного изменил функцию poll_block в файле /modules/poll/poll.module
Вот эта функция (Drupal 6)
<?php /** * Implementation of hook_block(). * * Generates a block containing the latest poll. */ function poll_block($op = 'list', $delta = 0) { if (user_access('access content')) { if ($op == 'list') { $blocks[0]['info'] = t('Most recent poll'); return $blocks; } else if ($op == 'view') { // Retrieve the random poll.
// Возможно сначала узнать кол-во записей $num = db_result(db_query("SELECT COUNT(*) FROM {poll}"));
// Потом сгенерировать случайное число в диапазоне 0 — $num-1 $rnd = rand(0, $num-1);
// А потом на основе него выбрать запись: $sql = db_rewrite_sql("SELECT n.created FROM {node} n INNER JOIN {poll} p ON p.nid = n.nid ". "WHERE n.status = 1 AND p.active = 1 LIMIT $rnd,1");
// Стандартный запрос //$sql = db_rewrite_sql("SELECT MAX(n.created) FROM {node} n INNER JOIN {poll} p ON p.nid = n.nid ". // "WHERE n.status = 1 AND p.active = 1");
Комментарии
а модуль [module=advansed_poll] не подходит?
а он вроде только для пятого Drupal...
может можно как-нибудь самостоятельно сделать блок для вывода случайного опроса? Вопрос: как?
например, так:
<?
$poll = node_load(110);//110 - id опроса
if ($poll->nid)
{
$poll = poll_view($poll, TRUE, FALSE, TRUE);
}
$block['content'] = drupal_render($poll->content);
return $block['content'];
?>
можно вывести определенный опрос. А случайный-то как???
хм.... странно.... а у меня advpoll (сори, в предыдущем посте немного с названием ошибся) стоИт...
dev-версия вполне сносно работает.
правда, прришлось ручками подправить одну ошибку (там длина прогресбара не совсем корректно иногда считается)
ну а если уж скриптом делать, то думаю можно сделать выборку айдишников нод определённого типа из базы и потом делать рэндом из этого массивчика. ну а дальше - как у Вас.
Хотелось бы у знать у автора, смог ли он решить эту проблему...
так как у меня такая же проблема.
<?php$sql = "SELECT nid FROM {node} WHERE status = 1 AND type = 'poll' ORDER BY RAND() LIMIT 1";
$nid = db_result(db_query($sql));
$poll = node_load($nid);
if ($poll->nid)
{
$poll = poll_view($poll, TRUE, FALSE, TRUE);
}
$block['content'] = drupal_render($poll->content);
return $block['content'];?>
Способ не идеальный, в силу особенной работы мускуля, но рабочий
Чтобы это сделать, я немного изменил функцию poll_block в файле /modules/poll/poll.module
Вот эта функция (Drupal 6)
<?php
// Стандартный запрос
/**
* Implementation of hook_block().
*
* Generates a block containing the latest poll.
*/
function poll_block($op = 'list', $delta = 0) {
if (user_access('access content')) {
if ($op == 'list') {
$blocks[0]['info'] = t('Most recent poll');
return $blocks;
}
else if ($op == 'view') {
// Retrieve the random poll.
// Возможно сначала узнать кол-во записей
$num = db_result(db_query("SELECT COUNT(*) FROM {poll}"));
// Потом сгенерировать случайное число в диапазоне 0 — $num-1
$rnd = rand(0, $num-1);
// А потом на основе него выбрать запись:
$sql = db_rewrite_sql("SELECT n.created FROM {node} n INNER JOIN {poll} p ON p.nid = n.nid ".
"WHERE n.status = 1 AND p.active = 1 LIMIT $rnd,1");
//$sql = db_rewrite_sql("SELECT MAX(n.created) FROM {node} n INNER JOIN {poll} p ON p.nid = n.nid ".
// "WHERE n.status = 1 AND p.active = 1");
$timestamp = db_result(db_query($sql));
if ($timestamp) {
$poll = node_load(array('type' => 'poll', 'created' => $timestamp, 'status' => 1));
if (
$poll->nid) {$poll = poll_view($poll, TRUE, FALSE, TRUE);
}
}
$block['subject'] = t('Poll');
$block['content'] = drupal_render($poll->content);
return $block;
}
}
}
?>
Единственный минус, который я вижу в данном методе — это необходимость менять данную функцию при каждом обновлении модуля голосования.
Ребята а такой вопрос можно решить.
Если закрыть опросы то они не выводятся выводится пустой блок (т.е. ничего).
Можно как то сделать что бы выводились открытые опросы... / а то как то не айс... пустой блок...