Доброго времени суток! Все как обычно в друпал новичек...
Поставлена задача создать фильтрацию данных определенной таблицы с веселыми подвязками, но для теста хотел набросать простую фильтрацию нод, но возникает рекурсия, не могу понять почему? Возможно я лишне набросал аргументов и ссылок с одной функции на другую, но модуль предполагается большой и хотелось бы разделить на файлы *.admin.inc в будущем.
Вроде как все по минимуму старался писать, что успел "нагуглить" и прочесть за все время.. попал на крайне интересную статью фильтрация без views Drupal 6.x но никак на 7-м не смог реализовать.
Подскажите, где мой косяк? Буду крайне благодарен
простой пример:
<?php
/**
* Реализация hook_menu()
*/
function callcenter_poisk_menu()
{
$items['nodefilter'] = array(
'title' => 'Node filter',
'description' => 'Node filter',
'page callback' => 'callcenter_poisk_page_callback',
'page arguments' => array(1),
'access arguments' => array('access content'),
'type' => MENU_LOCAL_TASK,
);
return
$items;
}
/**
* Callback page в будущем вынести в отдельный файл
* что-то здесь я делаю не так
*/
function callcenter_poisk_page_callback($forms) {
$id = isset($forms->id) ? $forms->id :'';
$output = drupal_render(drupal_get_form('callcenter_poisk_filter_form')); //выводи форму
$output.= callcenter_poisk_table($id); //выводим таблицу с данными, даем ей айди ноды после сабмита
return $output;
}
/**
* Форма фильтра
*/
function callcenter_poisk_filter_form($form, &$form_state, $forms = array())
{
$form['id'] = array(
'#title' => 'ID',
'#type' => 'textfield',
'#default_value' => isset($forms->id) ? $forms->id :'',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Фильтр',
);
$form['#redirect'] = FALSE;
return
$form;
}
function
callcenter_poisk_filter_form_submit($form, &$form_state) {
$form_state['#redirect'] = FALSE;
$forms = array();
$forms['id'] = $form_state['values']['id'];
$forms = (object)$forms;
if (isset(
$form_state['values']['id']))
callcenter_poisk_page_callback($forms->id);
}
/**
* Возвращает таблицу
*/
function callcenter_poisk_table($id) {
$query = db_select('node', 'n');
$query->condition('n.nid', $id);
$query->fields('n', array('nid', 'created'));
$nodes = $query->execute();
$tableHeader = array('Заголовок', 'Дата создания');
$tableData = array();
foreach (
$nodes as $node) {
$tableData[] = array(
l($node->nid, 'node/' . $node->nid),
format_date($node->created)
);
}
return
theme('table', array('header' => $tableHeader, 'rows' => $tableData, 'empty' => 'Not found'));
}
?>
в итоге получаем печальку "Fatal error: Maximum function nesting level of '100'..."
Комментарии
Решил еще раз прогнать все по кругу... в общем, рабочий вариант для Drupal 7.x
<?php
/**
* Реализация hook_menu()
*/
function callcenter_poisk_menu()
{
$items['nodefilter'] = array(
'title' => 'Node filter',
'description' => 'Node filter',
'page callback' => 'callcenter_poisk_page_callback',
'access arguments' => array('access content'),
);
return
$items;} /**
* Callback menu
*/
function callcenter_poisk_page_callback()
{
$output = drupal_render(drupal_get_form('callcenter_poisk_filter_form')) . '<br />';
$output .= callcenter_poisk_table();
return
$output;} /**
* Описание формы
*/
function callcenter_poisk_filter_form($form, &$form_state)
{
$form['filter'] = array(
'#title' => 'Часть заголовка',
'#type' => 'textfield',
'#required' => true,
);
'#type' => 'submit',
'#value' => 'Фильтр',
);
return
$form;}
function
callcenter_poisk_filter_form_submit ($form, &$form_state) {// не мало важно
$form_state['redirect'] = FALSE;
} /**
* Возвращает таблицу
*/
function callcenter_poisk_table()
{
// Вся соль
if (isset($_POST['filter'])) {
$filter = $_POST['filter'];
} else {
$filter = '';
}
$query->condition('n.nid', $filter);
$query->fields('n', array('title','nid', 'created'));
$nodes = $query->execute();
$tableData = array();
foreach (
$nodes as $node){
$tableData[] = array(
l($node->title, 'node/' . $node->nid),
format_date($node->created)
);
}
return
theme('table', array('header' => $tableHeader, 'rows' => $tableData, 'empty' => t('Empty result')));}
?>
P.S.: не работайте часто ночью , толку ноль