Using logrotate and drush for daily Drupal backups
If you've got Drush installed—and you really should—you can use the following recipe to setup a backup system that will maintain daily backups for the last two weeks. Most of the logrotate configuration is based on a Wikibooks book that I found.
Comparing a node's values with its previous version on save
There was a great question on Drupal developers mailing list the other day—one to which I've "rediscovered" the solution to a few times—so I wanted to make sure that everyone was aware of it.
The basic question is:
When a node is being saved, how can you see what values have changed?
The short answer is:
Use the 'presave' operation to load a copy of the node before it's saved, stick it back into the node object, and in your 'update' operation code compare the "before" and "after" versions:
<?php
/**
* Implementation of hook_nodeapi().
*/
function example_nodeapi(&$node, $op, $a3, $a4) {
// We want to compare nodes with their previous versions. Ignore new
// nodes with no nid since there's no previous version to load.
if ($op == 'presave' && !empty($node->nid)) {
// We don't want to collide with values set by other modules so we'll
// use the module name as a prefix and a long name to be save.
$node->example_presave_node = node_load($node->nid);
}
elseif ($op == 'update') {
// On update we pull the previous version out of the node and compare
// it to the newly saved one.
$presave = $node->example_presave_node;
// Pretend we're comparing a single value CCK number field here.
$field_name = 'field_example';
if ($node->$field_name != $presave->$field_name) {
drupal_set_message(
t("The node's value changed from %previous to %current.", array(
'%previous' => $presave->$field_name[0]['value'],
'%current' => $node->$field_name[0]['value'],
))
);
}
}
}
?>Simple loop to update nodes
For some reason I find myself rewriting this little bit of code every time I need to update a bunch of nodes on a site. Going to post it here to save myself some time. Be aware that this might time out if you've got a large number of nodes, designed for up to a couple hundred nodes:
<?php
// TODO: Set your basic criteria here:
$result = db_query("SELECT n.nid FROM {node} n WHERE n.type = '%s'", array('task'));
while ($row = db_fetch_array($result)) {
$node = node_load($row);
if ($node->nid) {
$node->date = $node->created;
// TODO: Test and set your own value here:
if (empty($node->field_task_status[0]['value'])) {
$node->field_task_status[0]['value'] = 'active';
$node = node_submit($node);
node_save($node);
drupal_set_message(t('Updated <a href="!url">%title</a>.', array('!url' => url('node/'. $node->nid), '%title' => $node->title)));
}
}
}
?>