Вывести в блоке результат выборки из бд по сабмиту. Помогите пож.

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

Аватар пользователя Billy Billy 22 сентября 2009 в 12:18

Здравствуйте, помогите советом пож. Есть блок в котором текстфиелд и кнопка сабмит. В поле вводим номер ноды. Нужно вывести в блоке тизер, таймстамп и ид юзера. Не знаю как передать в блок результат выборки. С ретёрнами не разобрался :(. В друпале нуб.

<?php
// $Id$ Ivash Exp $

function ivash_block($op='list', $delta=0, $edit=array()){
switch  ($op){
        case 'list':
$blocks[0]['info']=t('info show');
return $blocks;
case 'view':
$blocks['subject']=drupal_get_form('ivash_block_form');
$blocks['content']=t($str);
return $blocks;
}
}

function ivash_block_form($form_state){
 $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Node ID'),
        '#size' =>10,
  );
   $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
        '#submit' => array('ivash_block_form_submit'),
  );
 return $form;
 }
 function ivash_block_form_submit($form_id, &$form_state){
 $nn = $form_state['values']['name'];
 $check = db_query("SELECT * FROM {node_revisions} WHERE nid = %d", $nn);
        $check1 = db_fetch_array($check);
        if ($nn != $check1['nid']){
                drupal_set_message(t('Cant find node'));
        }
        else
        {
        $result = db_query("SELECT *
                      FROM {node_revisions}
                      WHERE nid = %d
                      "
, $nn);
        $result1=db_fetch_array($result);
        $teas=$result1['teaser'];
        $user=$result1['uid'];
        $time=$result1['timestamp'];
        $str=($teas.' '.$user.' '.$time);
 }
return $str;
}

Комментарии

Аватар пользователя gorr gorr 22 сентября 2009 в 16:04

<?php
// $Id$ Ivash Exp $

function ivash_block($op='list', $delta=0, $edit=array()){
switch ($op){
case 'list':
$blocks[0]['info']=t('info show');
return $blocks;
case 'view':
$blocks[0]['subject'] = t('Search node by nid');
$blocks[0]['content'] = drupal_get_form('ivash_block_form');
return $blocks;
}
}

function ivash_block_form($form_state){
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Node ID'),
'#size' =>10,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form['output'] = array(
'#type' => 'markup',
'#value' => is_numeric($form_state['values']['name']) ? node_view(node_load($form_state['values']['name']), TRUE, FALSE, FALSE) : '',
);
return $form;
}
?>
Можно конечно не использовать node_view, node_load, а сделать своим запросом.

Аватар пользователя Billy Billy 22 сентября 2009 в 17:54

спасибо, но так не работает, получается что не проходит проверка is_numeric. И так не получится вывести таймстамп и ид юзера. Подскажите пожалуйста каким образом передать результат выборки в $form['values']['output']. Туда вроде нужно если я правильно понимаю

Аватар пользователя gorr gorr 22 сентября 2009 в 18:06

тогда так:
<?php
// $Id$ Ivash Exp $

function ivash_block($op='list', $delta=0, $edit=array()){
switch ($op){
case 'list':
$blocks[0]['info']=t('info show');
return $blocks;
case 'view':
$blocks[0]['subject'] = t('Search node by nid');
$blocks[0]['content'] = drupal_get_form('ivash_block_form');
return $blocks;
}
}

function ivash_block_form($form_state){
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Node ID'),
'#size' =>10,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form['output'] = array(
'#type' => 'markup',
'#value' => ((int)$form_state['values']['name']) ? node_view(node_load($form_state['values']['name']), TRUE, FALSE, FALSE) : '',
);
return $form;
}
?>

Аватар пользователя Billy Billy 22 сентября 2009 в 18:25

спасибо ещё раз, но толи у меня с руками чтото, толи не знаю, ввожу номер ноды в поле, и ничего не происходит, если убрать проверку то выводит "n/a". А вот ещё, форма отображается только если в строчках
$blocks[0]['subject'] = t('Search node by nid');
$blocks[0]['content'] = drupal_get_form('ivash_block_form');
убрать [0].

Аватар пользователя gorr gorr 22 сентября 2009 в 19:58

<?php
// $Id$ Ivash Exp $

function ivash_block($op='list', $delta=0, $edit=array()){
switch ($op){
case 'list':
$blocks[0]['info']=t('info show');
return $blocks;
case 'view':
if($delta == 0) {
$block['subject'] = t('Search node by nid');
$block['content'] = drupal_get_form('ivash_block_form');
return $block;
}
}
}

function ivash_block_form($form_state, $edit){
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Node ID'),
'#size' =>10,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form['output'] = array(
'#type' => 'markup',
'#value' => ((int)$edit['name']) ? node_view(node_load($edit['name']), TRUE, FALSE, FALSE) : '',
);
return $form;
}
?>
А так?

Аватар пользователя Billy Billy 22 сентября 2009 в 20:20

так вот ошибка "warning: Missing argument 2 for ivash_block_form() in X:\home\localhost\www\sites\all\modules\ivash\ivash.module on line 18." это где
function ivash_block_form($form_state, $edit){

А сделать выборку скл запросами и присвоить значение в
$form['output'] = array(
'#type' => 'markup',
'#value' =>
не получится? Я пытался сделать по нажатию нопки функцию, где результатом является строка с тизером, таймштампом и юзер идом, но не могу понять как эту переменную передать в форму или хотябы просто вывести в блоке

Аватар пользователя gorr gorr 22 сентября 2009 в 21:09

<?php
// $Id$ Ivash Exp $

function ivash_block($op='list', $delta=0, $edit=array()){
switch ($op){
case 'list':
$blocks[0]['info']=t('info show');
return $blocks;
case 'view':
if($delta == 0) {
$block['subject'] = t('Search node by nid');
$block['content'] = drupal_get_form('ivash_block_form');
return $block;
}
}
}

function ivash_block_form($form_state){
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Node ID'),
'#size' =>10,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form['output'] = array(
'#type' => 'markup',
'#value' => ((int)$form_state['post']['name']) ? node_view(node_load($form_state['post']['name']), TRUE, FALSE, FALSE) : '',
);
return $form;
}
?>
Так еще.
Да, в value можно все, что хочешь вставить, например var_export($form_state, TRUE) туда вставить и посмотреть, что там есть. А то так по памяти не помню...в 5-ке так ка до этого написал работало, теперь нет.

Аватар пользователя Billy Billy 22 сентября 2009 в 23:12

ничего не происходит:(, проверку не проходит. Спасиб за терпение), чтото никак работать не хочет.

Аватар пользователя gorr gorr 23 сентября 2009 в 10:35

<?php
function ivash_block_form($form_state){
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Node ID'),
'#size' =>10,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form['output'] = array(
'#type' => 'markup',
'#value' => var_export($form_state, TRUE),
);
return $form;
}
?>
Попробуйте выдать $form_state таким образом и посмотреть, потом можно $_POST также посмотреть.

Аватар пользователя Billy Billy 23 сентября 2009 в 10:58

ввожу значение, нажимаю на кнопку, выводится
array ( 'storage' => NULL, 'submitted' => false, 'post' => array ( ), )

если $_POST то
array ( )

почему то пустые.

Аватар пользователя Billy Billy 23 сентября 2009 в 11:35

тоже самое
array ( 'storage' => NULL, 'submitted' => false, 'post' => array ( ), )
даже если значение по умолчанию поставить.

Дело в том что мне нужно чтобы этот модуль ни от чего не зависел. Независимое решение нужно.

А через AHAH возможно это сделать?

Аватар пользователя Billy Billy 23 сентября 2009 в 11:43

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

<?php
// $Id$ Ivash Exp $
 
function ivash_block($op='list', $delta=0, $edit=array()){
switch    ($op){
    case 'list':
$blocks[0]['info']=t('info show');
return $blocks;
case 'view':
$blocks['subject'] = t('Search node by nid');
$blocks['content'] = drupal_get_form('ivash_block_form');
return $blocks;
}
}
 
function ivash_block_form($form_state,$form_values=NULL){

 $form_state['rebuild'] = TRUE;
 $form['#multistep'] = TRUE;
 $form['#redirect'] = FALSE;
 if (!isset($_SESSION['go'])){

 $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Node ID'),
    '#size' =>10,
  );

   $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
        '#submit'=>array('ivash_block_form_submit')
  );
  }
  else
  {
        $form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Node ID'),
    '#size' =>10,
  );
   $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
        '#submit'=>array('ivash_block_form_submit')
  );
  $form['output'] = array(
    '#type' => 'item',
        '#value' => ivash_block_form_submit($form_id, &$form_state, $form_values=array()),
  );
  }
 
 return $form;
 }
function ivash_block_form_submit($form_id, &$form_state, $form_values=array()){
 $nn=$form_state['values']['name'];
 $_SESSION['go']=$nn;
         $check = db_query("SELECT * FROM {node_revisions} WHERE nid = %d", $nn);
         $check1 = db_fetch_array($check);
        if ($nn != $check1['nid']){
                drupal_set_message(t('Cant find node'));
        }
        else
        {
        $result = db_query("SELECT teaser, uid, timestamp
                      FROM {node_revisions}
                      WHERE nid = %d
                      "
, $nn);
  while ($data = db_fetch_object($result)) {
  $row = array();
  $row[] = array('data' => $data->teaser);
  $row[] = array('data' => $data->uid);
  $row[] = array('data' => $data->timestamp);
  $rows[] = $row;
}

        $header = array(t('Teaser'), t('UID'),t('Timestamp'));
        $gogo=theme('table',$header,$rows);
        return $gogo;
        }
 }
 

Аватар пользователя gorr gorr 23 сентября 2009 в 13:17

<?php
// $Id$ Ivash Exp $

function ivash_block_block($op='list', $delta=0, $edit=array()){
switch ($op){
case 'list':
$blocks[0]['info']=t('info show');
return $blocks;
case 'view':
if($delta == 0) {
$block['subject'] = t('Search node by nid');
$block['content'] = drupal_get_form('ivash_block_form');
return $block;
}
}
}

function ivash_block_form($form_state){
$form['name'] = array(
'#type' => 'textfield',
'#default_value' => $_SESSION['name'] ? (int)$_SESSION['name'] : '',
'#title' => t('Node ID'),
'#size' =>10,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
if($node = node_load($_SESSION['name'])) {
$form['output'] = array(
'#type' => 'markup',
//'#value' => var_export($_SESSION['name'], TRUE),
'#value' => node_view($node, TRUE, FALSE, FALSE),
);
}
return $form;
}
function ivash_block_form_submit($form, &$form_state) {
//var_export($form_state['values']['name'], TRUE);
//form_set_error('',var_export($form_state['values']['name'], TRUE)); return false;
$_SESSION['name'] = $form_state['values']['name'];
}
?>
Так работает

Аватар пользователя gorr gorr 23 сентября 2009 в 13:39

Под 6-ку правильнее будет сохранять не в сессию, а в $form_state['storage'], вот так:
<?php
// $Id$ Ivash Exp $

function ivash_block_block($op='list', $delta=0, $edit=array()){
switch ($op){
case 'list':
$blocks[0]['info']=t('info show');
return $blocks;
case 'view':
if($delta == 0) {
$block['subject'] = t('Search node by nid');
$block['content'] = drupal_get_form('ivash_block_form');
return $block;
}
}
}

function ivash_block_form($form_state){
$form['name'] = array(
'#type' => 'textfield',
'#default_value' => $form_state['storage']['name'] ? (int)$form_state['storage']['name'] : '',
'#title' => t('Node ID'),
'#size' =>10,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
if($node = node_load($form_state['storage']['name'])) {
$form['output'] = array(
'#type' => 'markup',
//'#value' => var_export($_SESSION['name'], TRUE),
'#value' => node_view($node, TRUE, FALSE, FALSE),
);
}
return $form;
}
function ivash_block_form_submit($form, &$form_state) {
['name'], TRUE)); return false;
$form_state['storage']['name'] = $form_state['values']['name'];
}
?>