drupal节点类型hook_insert()

时间:2011-10-21 15:45:03

标签: drupal drupal-hooks drupal-nodes

我在构建drupal自定义节点类型时遇到了一些麻烦。我创建了一个模块sj_highcharts,最终将使用highcharts api来提供数据图表。这个模块的目的是创建一个节点类型,它将显示一个表单,供人们与图表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);
  }
}

我一直在盯着这个工作日,但找不到问题。对此的任何指导都会很棒。谢谢布兰登

1 个答案:

答案 0 :(得分:0)

查看examples模块中的node_example子模块。它应该有助于指明你正确的方向。

你的帖子不清楚你正在使用哪种版本的drupal。在Drupal 6中,您可以直接向表单或表单项添加其他验证和提交函数。

例如:

  $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'),
    );