Contoh Modul Capture Keyboard Emulator RFID

Forums: 

Berikut merupakan contoh module rfid.module.

Module ini akan membuat sebuah block yang berisi form. RFID akan di-'capture' jika sesuai dengan RFID_PATTERN. Jika sesuai maka form akan otomatis di-'submit'.
Semoga membantu.


<?php
/**
* @file
* rfid.module
*/

/**
* RFID_PATTERN
* @var string Regex pattern for check RFID Input.
*/
define('RFID_PATTERN', '^[3|4]\d{9}$');

/**
* Hook Implementations.
*/

/**
* Implements of hook_block_info().
*/
function rfid_block_info() {
$blocks['rfid_capture'] = array(
'info' => t('RFID Attendance'),
'status' => TRUE,
'region' => 'sidebar_first',
'visibility' => BLOCK_VISIBILITY_LISTED,
'pages' => '',
'cache' => DRUPAL_NO_CACHE,
);
return $blocks;
}

/**
* Implements of hook_block_view().
*/
function rfid_block_view($delta = '') {
switch ($delta) {
case 'rfid_capture':
$block['subject'] = t('RFID Attendance');
$block['content'] = drupal_get_form('rfid_attendance_block');
return $block;
}
}

/**
* Callback Functions.
*/

/**
* Function rfid_attendance_block().
*/
function rfid_attendance_block() {
// Define javascript for detecting RFID.
$script = '
var rfid = "";
var timeout = 0;
var capture = true;
function rfid_check(id) {
pattern = /' . RFID_PATTERN . '/;
return pattern.test(id);
}
function rfid_off() {
capture = false;
rfid = "";
}
function rfid_on() {
capture = true;
rfid = "";
}
jQuery(document).ready(function () {
jQuery(":input").focusin(function () {
rfid_off();
});
jQuery(":input").focusout(function () {
rfid_on();
});
jQuery(window).keypress(function (e) {
if (capture) {
if (e.which == 13) {
e.preventDefault();
clearTimeout(timeout);
if (rfid_check(rfid)) {
jQuery(":input[name=lancer_rfid]").val(rfid);
jQuery("#rfid-attendance-form").submit();
}
rfid_on();
}
else {
if (rfid == "") {
timeout = setTimeout(function () {rfid_on();},500);
}
chars = String.fromCharCode(e.which);
pattern = /^\d$/;
if (pattern.test(chars)) {
rfid += chars;
}
else {
rfid_on();
}
}
}
});
});
';
// Add javascript.
drupal_add_js(preg_replace('#\s+#', ' ', $script), 'inline');
// Form array definition.
$form['#action'] = url(current_path(), array('query' => drupal_get_destination(), 'external' => FALSE));
$form['#id'] = 'rfid-attendance-form';
$form['#validate'][] = 'rfid_attendance_validate';
$form['#submit'][] = 'rfid_attendance_submit';
$form['rfid_attendance'] = array(
'#type' => 'fieldset',
'#title' => NULL,
'#attributes' => array(
'style' => array('text-align: center;'),
),
);
// Hidden field for rfid;
$form['rfid_attendance']['lancer_rfid'] = array(
'#type' => 'hidden',
'#default_value' => '',
);
// Form operation and submit button.
$form['rfid_attendance']['actions'] = array('#type' => 'actions');
$form['rfid_attendance']['actions']['op'] = array(
'#type' => 'submit',
'#value' => t('CHECK'),
);
return $form;
}

/**
* Function rfid_attendance_validate().
*
* @param array $form
* Form array container.
*
* @param array $form_state
* Form state array container.
*/
function rfid_attendance_validate($form, &$form_state = array()) {
// Check only for operation in and out.
if ($form_state['values']['op'] == t('CHECK')) {
if (isset($form_state['values']['lancer_rfid'])
&& preg_match('#' . RFID_PATTERN . '#', $form_state['values']['lancer_rfid'])
) {
return;
}
}
else {
form_set_error('op', t('Unknown operation.'));
}
// Other condition, is invalid.
form_set_error('rfid_attendance', t('Invalid/Inactive/Blocked EUIS/RF ID! Please contact our staff.'));
}

/**
* Function rfid_attendance_submit().
*
* @param array $form
* Form array container.
*
* @param array $form_state
* Form state array container.
*/
function rfid_attendance_submit($form, &$form_state = array()) {
// Check form operation.
if ($form_state['values']['op'] == t('CHECK')) {
// Show message: IN|OUT late|on schedule?
drupal_set_message(t('OK CHECK: @rfid [@datetime]', array(
'@rfid' => $form_state['values']['lancer_rfid'],
'@datetime' => date('r'),
)));
}
}

">Honeypot