[РЕШЕНО] Создать фильтрацию без views Drupal 7.x

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

Аватар пользователя grizli2007 grizli2007 26 февраля 2014 в 5:43

Доброго времени суток! Все как обычно в друпал новичек...

Поставлена задача создать фильтрацию данных определенной таблицы с веселыми подвязками, но для теста хотел набросать простую фильтрацию нод, но возникает рекурсия, не могу понять почему? Возможно я лишне набросал аргументов и ссылок с одной функции на другую, но модуль предполагается большой и хотелось бы разделить на файлы *.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'));
}
?>

в итоге получаем печальку Smile "Fatal error: Maximum function nesting level of '100'..."

Комментарии

Аватар пользователя grizli2007 grizli2007 26 февраля 2014 в 19:29

Решил еще раз прогнать все по кругу... в общем, рабочий вариант для Drupal 7.x Smile


<?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,
  );

  

$form['submit'] = array(
    
'#type' => 'submit',
    
'#value' => 'Фильтр',
  );

  

$form['#redirect'] = false;

  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 db_select('node''n');
  
$query->condition('n.nid'$filter);
  
$query->fields('n', array('title','nid''created'));
  
$nodes $query->execute();

  

$tableHeader = array('Заголовок''Дата создания');
  
$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.: не работайте часто ночью , толку ноль Smile