Record helper
When dealing with a single database record, stored in a table such as:
CREATE TABLE prefix_table_name (
id int(11) NOT NULL AUTO_INCREMENT,
name tinytext NOT NULL,
created datetime NOT NULL,
edited datetime NOT NULL,
deleted datetime NOT NULL,
PRIMARY KEY (id)
);
The record helper can be loaded with the function call:
$record = record_get(DB_PREFIX . 'table_name', $item_id, array(
'name',
));
Or with a config array:
$record = record_get(array(
'table' => DB_PREFIX . 'table_name',
'where_id' => $item_id,
'fields' => array('name'),
// 'deleted' => array('type' => 'record'),
// 'log_table' => DB_PREFIX . 'log',
// 'log_values' => array(
// 'item_type' => 'record',
// 'item_id' => $item_id,
// 'admin_id' => ADMIN_ID,
// ),
));
You can return the record values (or field information) with:
debug($record->values_get());
debug($record->value_get('name'));
debug($record->fields_get());
debug($record->field_get('name'));
And either use the form helper (below), delete records (below), or simply set values with:
$record->save(array(
'field' => 'value',
));
// OR
$record->values_set(array(
'field' => 'value',
));
$record->save();
This setup works really well with the form helper (described below).
Deleted records
The record helper assumes that the table will have a deleted DATETIME field.
As NULL represent a missing record, this should default to "0000-00-00 00:00:00".
Then if set to a particular date/time, the user is automatically shown a 'deleted' page instead - this is done with the error_send() function.
This 'deleted' page can be customised by creating:
/app/view/error/deleted.ctp
<?php
debug($type);
debug($timestamp->format('jS F Y, \a\t g:ia'));
debug($record['values']);
debug($record['config']);
?>
Log table
If you want to record every edit that is made (e.g. for auditing purposes), then you can either specify the table and extra values every time:
$record = record_get(array(
// ...
'log_table' => DB_PREFIX . 'log',
'log_values' => array(
'item_type' => 'record',
'item_id' => $item_id,
'admin_id' => ADMIN_ID,
),
));
Or extend the record class, for every record edited via this helper:
/app/library/class/record.php
<?php
class record extends record_base {
protected function where_set_done($update) {
$this->log_table_set_sql(DB_PREFIX . 'log', 'item_id', [
'item_type' => $this->table_get_short(),
'admin_id' => ADMIN_ID,
]);
}
}
?>
Then create the 'log_table', such as:
CREATE TABLE prefix_log (
item_id int(11) NOT NULL,
item_type varchar(50) NOT NULL,
field varchar(50) NOT NULL,
old_value text NOT NULL,
new_value text NOT NULL,
admin_id int(11) NOT NULL,
created datetime NOT NULL,
KEY item_id (item_id,item_type,field)
) ;
A record will be added to this table every time a field is changed.
Form helper
It plays well with the form helper, such as:
//--------------------------------------------------
// Details
$action_edit = ($item_id != 0);
$record = record_get(DB_PREFIX . 'table_name', $item_id, array(
'name',
));
if ($action_edit) {
if ($row = $record->values_get()) {
$item_name = $row['name'];
} else {
exit_with_error('Cannot find record id "' . $item_id . '"');
}
}
//--------------------------------------------------
// Form setup
$form = new form();
$form->form_class_set('basic_form');
$form->db_record_set($record);
$field_name = new form_field_text($form, 'Name');
$field_name->db_field_set('name');
$field_name->min_length_set('The name is required.');
$field_name->max_length_set('The name cannot be longer than XXX characters.');
//--------------------------------------------------
// Form submitted
if ($form->submitted()) {
//--------------------------------------------------
// Validation
//--------------------------------------------------
// Form valid
if ($form->valid()) {
//--------------------------------------------------
// Save
if ($action_edit) {
$form->db_save();
} else {
$item_id = $form->db_insert();
}
//--------------------------------------------------
// Next page
$form->dest_redirect(url(array('id' => $item_id)));
}
}