Hej!
Jag är en Drupal-nybörjare som håller på och bygger på en modul som ska låta användarna skapa enkla små auktioner, där varje auktion är en nod. Funktionaliteten behöver inte vara särskilt avancerad då det ska användas i utbildningssyfte och inte kommersiellt. Jag har stött på problem med implementeringen av hook_validate, det verkar som om $node inte fått några nodtyp-specifika värden alls när funktionen körs. Inte heller verkar submit-handler-funktionen köras. Här är delar av koden för formuläret:
<?php
// Implementation of hook_form
function simpleauction_form(&$node, $form_state) {
// ... title & body ...
// Input auction start date/time and expiry date/time
$format = 'Y-m-d H:i';
$now = time() + 300; // get current time in UNIX timestamp format (integer) + 5 minutes
$date_now = date($format, $now); // make it a string in format above
$date_then = date($format, $now + 86400); // 86400 seconds = 1 day
// ...
$form['duration']['date_start'] = array(
'#type' => 'date_select',
'#title' => t('starting date'),
'#required' => TRUE,
'#default_value' => isset($node->date_start) ? date($format, $node->date_start) : $date_now,
'#date_format' => $format,
'#date_year_range' => '0:+1'
);
$form['duration']['date_end'] = array(
'#type' => 'date_select',
'#title' => t('end date'),
'#required' => TRUE,
'#default_value' => isset($node->date_end) ? date($format, $node->date_end) : $date_then,
'#date_format' => $format,
'#date_year_range' => '0:+1',
'#date_increment' => 15
);
// ...
$form['pricing']['price_start'] = array(
'#type' => 'textfield',
'#title' => t('Starting price'),
'#required' => TRUE,
// ...
);
$form['pricing']['bid_diff'] = array(
'#type' => 'textfield',
'#title' => t('Minimum bid difference'),
'#required' => TRUE,
// ...
);
// Set the type of auction
$_types = array(SIMPLEAUCTION_ENGLISH => t('English')); // TODO: add dutch, vickrey etc.
$form['auction_type'] = array(
'#type' => 'radios',
'#title' => t('Auction type'),
'#default_value' => SIMPLEAUCTION_ENGLISH,
'#options' => $_types,
'#description' => t('The type of auction affects the auction rules.')
);
// Is the auction active or not? Option available if the user has the right privileges
$_active = array(0 => t('Closed'), 1 => t('Active'));
if ($can_edit) {
// ...
$form['auction_settings']['active'] = array(
'#type' => 'radios',
'#title' => t('Auction status'),
'#default_value' => isset($node->active) ? $node->active : 1,
'#options' => $_active,
'#description' => t('When an auction is closed, no one can bid on it.')
);
}
// Submit handler function, for date-to-timestamp conversion
$form['#submit'] = array('simpleauction_node_form_submit');
return $form;
}
?>Och här är koden för submit-handlern som aldrig verkar köras, och hook_validate:
<?php
// Custom node form submission handler function
function simpleauction_node_form_submit(&$form, &$form_state) {
// Convert from ISO dates to UNIX timestamps for database insertion
$form_state['values']['date_start'] = date_convert($form_state['values']['date_start'], DATE_ISO, DATE_UNIX);
$form_state['values']['date_end'] = date_convert($form_state['values']['date_end'], DATE_ISO, DATE_UNIX);
}
// Implementation of hook_validate
function simpleauction_validate($node, &$form) {
if (isset($node->title)) {
// <--- Här har $node inte fått några värden specifika för modulen än?
if ($node->date_start < time()) {
form_set_error('date_start', t('Starting date is in the past'));
}
if ($node->date_end <= ($node->date_start + 900)) { // 900s = 15 min
form_set_error('date_end', t('End date must be at least 15 minutes after start date'));
}
// ...
}
}
?>Anledningen till trixandet med datum är att jag vill ha det som timestamp i databasen men samtidigt kunna välja datum enkelt i formuläret med date_select.
Har någon en bättre idé är jag öppen för förslag :)
Comments
CCK & Rules
När man är ny på Drupal väljer man olika vägar för att lösa problem. Om man har erfarenhet av programmering väljer man ofta att söka en kodlösning och skriva moduler för allt möjligt. Jag har själv varit där, det är kul att skriva moduler!
Att göra på det viset kan verka vettigt initialt men är ingen hållbar lösning då man riskerar att måla in en i ett hörn. Jag tror inte du behöver skapa en modul för detta utan kan använda dig av CCK och sedan Rules för att hantera logiken. De här modulerna är mycket mer kraftfulla än man först kan tro och innebär att du slipper underhålla en modul eller samling moduler som behöver uppdateras allt eftersom Drupals API utvecklas.
Koda mindre, konfigurera mer! som vi säger på NodeOne.
Jakob Persson – Leancept – Results-only digital and marketing consultants – Personal blog