У меня возникли проблемы с созданием собственного типа узла Drupal. Я создал модуль sj_highcharts, который в конечном итоге будет использовать API highcharts для предоставления диаграммы данных. Цель этого модуля — создать тип узла, который будет отображать форму, позволяющую людям взаимодействовать с API диаграммы, сохранять данные в некоторых таблицах базы данных и затем, наконец, выводить диаграмму.
Проблема в том, что моя функцияook_insert или даже функцияook_validate не вызывается после отправки формы и ничего не сохраняется в базе данных. Я добавил оператор die, чтобы убедиться, что они не сработают.
/*
* 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);
}
}
Я смотрю на это целый рабочий день и не могу найти проблему. Любое руководство по этому поводу было бы здорово. Спасибо, Брэндон
У меня возникли проблемы с созданием собственного типа узла Drupal. Я создал модуль sj_highcharts, который в конечном итоге будет использовать API highcharts для предоставления диаграммы данных. Цель этого модуля — создать тип узла, который будет отображать форму, позволяющую людям взаимодействовать с API диаграммы, сохранять данные в некоторых таблицах базы данных и затем, наконец, выводить диаграмму.
Проблема в том, что моя функцияook_insert или даже функцияook_validate не вызывается после отправки формы и ничего не сохраняется в базе данных. Я добавил оператор die, чтобы убедиться, что они не сработают.
Код:
[code] /* * 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, );
/** * 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();
//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); }
//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); } } [/code]
Я смотрю на это целый рабочий день и не могу найти проблему. Любое руководство по этому поводу было бы здорово. Спасибо, Брэндон