2011-10-21 6 views
1

Drupalカスタムノードタイプの構築に何らかの問題があります。最終的にハイチャートのAPIを使用してデータのチャートを提供するモジュールsj_highchartsを作成しました。このモジュールのポイントは、人々がチャートapiとインターフェイスし、いくつかのデータベーステーブルにデータを格納し、最後にグラフを出力するためのフォームを表示するノードタイプを作成することです。drupalノードタイプhook_insert()

問題は、私の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); 
    } 
} 

アイブ氏はフル稼働日のために、このを凝視して、問題を見つけることができません。これについてのガイダンスは素晴らしいでしょう。ありがとうBrandon

+0

はあなたがDrupalののキャッシュをクリアすることがありますか?いくつかのフック実装はキャッシュされているので、 – Clive

+1

があり、キャッシュがクリアされていなければ利用できません。それはdrupalとのポイントになった、私はすべての後にキャッシュをクリアすること。 – BDUB

答えて

0

examplesモジュールのnode_exampleサブモジュールをチェックしてください。それは正しい方向にあなたを指すのに役立つはずです。

ご使用のdrupalのバージョンがあなたの投稿で不明です。 Drupal 6では、フォームまたはフォーム項目に直接検証機能と送信機能を追加することができます。

例:あなたは `hook_insert`と` hook_validate`を実装するので

$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'), 
    ); 
関連する問題