тип узла drupal hook_insert()

У меня возникли проблемы с созданием пользовательского типа узла drupal. Я создал модуль sj_highcharts, который в конечном итоге будет использовать API highcharts для предоставления диаграммы данных. Цель этого модуля — создать тип узла, который будет отображать форму для взаимодействия с API диаграммы, сохранять данные в некоторых таблицах базы данных и затем, наконец, выводить диаграмму.

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

Код:

  /*
 * Implementation of hook_node_info().
 */
function sj_highcharts_node_info() {
  //defining one node type: 'sj highchart'.
  return array(
    'sj_highcharts_element' => array(
      'name'  => t('Highchart Element'),
      'module' => 'sj_highcharts',
      'description' => t("An element that creates a dynamic chart from specified data."),
      'has_title' => FALSE,
      'has_body' => FALSE,
      'locked' => TRUE,
    )
  );
  //In order to make this an element type, we will have to check the "is element" field in the content type administration page.
}

/**
 * Implementation of hook_form().
 */
function sj_highcharts_form($node) {

  $type = node_get_types('type', $node);
  $form['delimiter'] = array(
      '#type' => 'radios',
      '#title' => t('Data Delimiter'),
      '#description' => t('The character in which the data is delimited.'),
      '#options' => array(t('Tab'), t('Space'), t('Comma')),
      '#default_value' => '',
    );

  $form['x_label'] = array(
      '#type' => 'textfield',
      '#title' => t('x-axis label'),
      '#description' => t('The label to be set and displayed for the x axis.'),
      '#required' => TRUE,
      '#default_value' => '',
    );

  $form['x_data'] = array(
      '#type' => 'textarea',
      '#title' => t('x-axis data'),
      '#description' => t('The x-axis data to be populated on the chart'),
      '#default_value' => '',
      '#rows' => 10,
      '#required' => TRUE,
    );

  $form['y_label'] = array(
      '#type' => 'textfield',
      '#title' => t('x-axis label'),
      '#description' => t('The label to be set and displayed for the y axis.'),
      '#required' => TRUE,
      '#default_value' => '',
    );

  $form['y_data'] = array(
      '#type' => 'textarea',
      '#title' => t('y-axis data'),
      '#description' => t('The y-axis data to be populated on the chart'),
      '#default_value' => '',
      '#rows' => 10,
      '#required' => TRUE,
    );

  $form['type'] = array(
      '#type' => 'select',
      '#title' => t('Select a chart type'),
      '#default_value' => 'Bar',
      '#description' => t('Select a chart type to display data.'),
      '#options' => array(
      '1' => t('Pie'),
      '2' => t('Line'),
      '3' => t('Area'),
      '4' => t('Scatter'),
      '5' => t('Bar'),
    ),
  );

  $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Create Chart')
  );

  return $form;
}

/**
 * Implentation of hook_validate().
 */
function sj_highcharts_validate($node) {
  //watchdog('sj_highcharts', 'in validate function');
  die();

  if(isset($node->delimiter)){

    //if we are dealing with tab delimited input
    if($node->delimiter == 'tab'){

      //check to see if data sets are the same size
      if(isset($node->x_data) && isset($node->y_data)) {
        if(substr(' ', $node->x_data) && substr(' ', $node->y_data)){
          $xdata_parts = explode('  ', $node->x_data);
          $ydata_parts = explode('  ', $node->y_data);
        }
        else{
          form_set_error('delimiter', t('The data delimiter must match the data string entered.'));
        }

        if(sizeof($xdata_parts) != sizeof($ydata_parts)){
          form_set_error('x_data', t('The number of data points in each, x and y axes, must match.'));
        }
      }

      //change all delimited input to the format we want
      $node->x_data = str_replace(' ', ',', $node->x_data);
      $node->y_data = str_replace(' ', ',', $node->y_data);
    }

    //if we are dealing with space delimited input
    if($node->delimiter == 'space'){

      //check to see if data sets are the same size
      if(isset($node->x_data) && isset($node->y_data)) {
        if(substr(' ', $node->x_data) && substr(' ', $node->y_data)){
          $xdata_parts = explode(' ', $node->x_data);
          $ydata_parts = explode(' ', $node->y_data);
        }
        else{
          form_set_error('delimiter', t('The data delimiter must match the data string entered.'));
        }

        if(sizeof($xdata_parts) != sizeof($ydata_parts)){
          form_set_error('x_data', t('The number of data points in each, x and y axes, must match.'));
        }
      }

      //change all delimited input to the format we want
      $node->x_data = str_replace(' ', ',', $node->x_data);
      $node->y_data = str_replace(' ', ',', $node->y_data);
    }

    //if we are dealing with comma delimited input
    if($node->delimiter == 'comma'){

      //check to see if data sets are the same size
      if(isset($node->x_data) && isset($node->y_data)) {
        if(substr(',', $node->x_data) && substr(',', $node->y_data)){
          $xdata_parts = explode(',', $node->x_data);
          $ydata_parts = explode(',', $node->y_data);
        }
        else{
          form_set_error('delimiter', t('The data delimiter must match the data string entered.'));
        }

        if(sizeof($xdata_parts) != sizeof($ydata_parts)){
          form_set_error('x_data', t('The number of data points in each, x and y axes, must match.'));
        }
      }

      //change all delimited input to the format we want
      $node->x_data = str_replace(' ', ',', $node->x_data);
      $node->y_data = str_replace(' ', ',', $node->y_data);

    }
  }
}


/**
 * Implementation of hook_form_submit().
 */
function sj_highcharts_insert($node) {
  //watchdog('sj_highcharts', 'in submit function');
  die();

  drupal_write_record('highcharts_chart', $node);

  $x_data_parts = explode(',', $node->x_data);
  $axis = 'x';
  for($i = 0;$i < sizeof($x_data_parts);$i++){
    $data_point = $x_data_parts[$i];

    //not sure if i should use write_record or not, just know that i need to separate individual data fields
    db_query("INSERT into {higcharts_data} (chart_id, data, axis) VALUES (%d, %d, '%s')", $node->nid, $data_point, $axis);
  }

  $y_data_parts = explode(',', $node->y_data);
  $axis = 'y';
  for($i = 0;$i < sizeof($y_data_parts);$i++){
    $data_point = $y_data_parts[$i];

    //not sure if i should use write_record or not, just know that i need to make sure the chart_id matches other table
    db_query("INSERT into {higcharts_data} (chart_id, data, axis) VALUES (%d, %d, '%s')", $node->nid, $data_point, $axis);
  }
}

Я смотрю на это весь рабочий день и не могу найти проблему. Любое руководство по этому поводу было бы здорово. Спасибо, Брэндон.


person BDUB    schedule 21.10.2011    source источник
comment
Вы очищали кеш Drupal после того, как внедрили hook_insert и hook_validate? Некоторые реализации ловушек кэшируются и поэтому будут недоступны, если у вас нет   -  person Clive    schedule 21.10.2011
comment
да, кэш почистил. С друпалом дошло до того, что я очищаю кеш после всего, что делаю.   -  person BDUB    schedule 21.10.2011


Ответы (1)


Ознакомьтесь с подмодулем node_example в модуле examples. Это должно помочь указать вам правильное направление.

Из вашего сообщения неясно, какую версию drupal вы используете. В Drupal 6 вы можете добавить дополнительные функции проверки и отправки непосредственно в форму или элемент формы.

ex:

  $form['delimiter'] = array(
      '#type' => 'radios',
      '#title' => t('Data Delimiter'),
      '#description' => t('The character in which the data is delimited.'),
      '#options' => array(t('Tab'), t('Space'), t('Comma')),
      '#default_value' => '',
      '#validate' => array('_name_of_custom_validation_function'),
      '#submit' => array('_name_of_custom_submit_function'),
    );
person daggerhart    schedule 23.10.2011