2008-12-22 19:38:31 +00:00
< ? php
// $Id$
/**
* @ file
* Processor functions for the aggregator module .
*/
2009-05-16 17:58:30 +00:00
/**
* Denotes that a feed ' s items should never expire .
*/
define ( 'AGGREGATOR_CLEAR_NEVER' , 0 );
2008-12-22 19:38:31 +00:00
/**
* Implementation of hook_aggregator_process_info () .
*/
function aggregator_aggregator_process_info () {
return array (
'title' => t ( 'Default processor' ),
'description' => t ( 'Creates lightweight records from feed items.' ),
);
}
/**
* Implementation of hook_aggregator_process () .
*/
function aggregator_aggregator_process ( $feed ) {
if ( is_object ( $feed )) {
if ( is_array ( $feed -> items )) {
foreach ( $feed -> items as $item ) {
// Save this item. Try to avoid duplicate entries as much as possible. If
// we find a duplicate entry, we resolve it and pass along its ID is such
// that we can update it if needed.
2009-05-18 09:41:40 +00:00
if ( ! empty ( $item [ 'guid' ])) {
$entry = db_query ( " SELECT iid, timestamp FROM { aggregator_item} WHERE fid = :fid AND guid = :guid " , array ( ':fid' => $feed -> fid , ':guid' => $item [ 'guid' ])) -> fetchObject ();
2008-12-22 19:38:31 +00:00
}
2009-05-18 09:41:40 +00:00
elseif ( $item [ 'link' ] && $item [ 'link' ] != $feed -> link && $item [ 'link' ] != $feed -> url ) {
$entry = db_query ( " SELECT iid, timestamp FROM { aggregator_item} WHERE fid = :fid AND link = :link " , array ( ':fid' => $feed -> fid , ':link' => $item [ 'link' ])) -> fetchObject ();
2008-12-22 19:38:31 +00:00
}
else {
2009-05-18 09:41:40 +00:00
$entry = db_query ( " SELECT iid, timestamp FROM { aggregator_item} WHERE fid = :fid AND title = :title " , array ( ':fid' => $feed -> fid , ':title' => $item [ 'title' ])) -> fetchObject ();
2008-12-22 19:38:31 +00:00
}
2009-05-18 09:41:40 +00:00
if ( ! $item [ 'timestamp' ]) {
$item [ 'timestamp' ] = isset ( $entry -> timestamp ) ? $entry -> timestamp : REQUEST_TIME ;
2008-12-22 19:38:31 +00:00
}
2009-05-18 09:41:40 +00:00
aggregator_save_item ( array ( 'iid' => ( isset ( $entry -> iid ) ? $entry -> iid : '' ), 'fid' => $feed -> fid , 'timestamp' => $item [ 'timestamp' ], 'title' => $item [ 'title' ], 'link' => $item [ 'link' ], 'author' => $item [ 'author' ], 'description' => $item [ 'description' ], 'guid' => $item [ 'guid' ]));
2008-12-22 19:38:31 +00:00
}
}
}
}
/**
* Implementation of hook_aggregator_remove () .
*/
function aggregator_aggregator_remove ( $feed ) {
$iids = db_query ( 'SELECT iid FROM {aggregator_item} WHERE fid = :fid' , array ( ':fid' => $feed -> fid )) -> fetchCol ();
if ( $iids ) {
db_delete ( 'aggregator_category_item' )
-> condition ( 'iid' , $iids , 'IN' )
-> execute ();
}
db_delete ( 'aggregator_item' )
-> condition ( 'fid' , $feed -> fid )
-> execute ();
2009-01-26 14:08:44 +00:00
2008-12-22 19:38:31 +00:00
drupal_set_message ( t ( 'The news items from %site have been removed.' , array ( '%site' => $feed -> title )));
}
/**
* Implementation of hook_form_aggregator_admin_form_alter () .
2009-01-26 14:08:44 +00:00
*
2008-12-22 19:38:31 +00:00
* Form alter aggregator module ' s own form to keep processor functionality
* separate from aggregator API functionality .
*/
function aggregator_form_aggregator_admin_form_alter ( & $form , $form_state ) {
if ( in_array ( 'aggregator' , variable_get ( 'aggregator_processors' , array ( 'aggregator' )))) {
$info = module_invoke ( 'aggregator' , 'aggregator_process' , 'info' );
$items = array ( 0 => t ( 'none' )) + drupal_map_assoc ( array ( 3 , 5 , 10 , 15 , 20 , 25 ), '_aggregator_items' );
$period = drupal_map_assoc ( array ( 3600 , 10800 , 21600 , 32400 , 43200 , 86400 , 172800 , 259200 , 604800 , 1209600 , 2419200 , 4838400 , 9676800 ), 'format_interval' );
2009-05-16 17:58:30 +00:00
$period [ AGGREGATOR_CLEAR_NEVER ] = t ( 'Never' );
2008-12-22 19:38:31 +00:00
// Only wrap into a collapsible fieldset if there is a basic configuration.
if ( isset ( $form [ 'basic_conf' ])) {
$form [ 'modules' ][ 'aggregator' ] = array (
'#type' => 'fieldset' ,
'#title' => t ( 'Default processor settings' ),
'#description' => $info [ 'description' ],
'#collapsible' => TRUE ,
'#collapsed' => ! in_array ( 'aggregator' , variable_get ( 'aggregator_processors' , array ( 'aggregator' ))),
);
}
else {
$form [ 'modules' ][ 'aggregator' ] = array ();
}
2009-01-26 14:08:44 +00:00
2008-12-22 19:38:31 +00:00
$form [ 'modules' ][ 'aggregator' ][ 'aggregator_summary_items' ] = array (
2009-01-26 14:08:44 +00:00
'#type' => 'select' ,
2008-12-22 19:38:31 +00:00
'#title' => t ( 'Items shown in sources and categories pages' ) ,
2009-01-26 14:08:44 +00:00
'#default_value' => variable_get ( 'aggregator_summary_items' , 3 ),
2008-12-22 19:38:31 +00:00
'#options' => $items ,
'#description' => t ( 'Number of feed items displayed in feed and category summary pages.' ),
);
$form [ 'modules' ][ 'aggregator' ][ 'aggregator_clear' ] = array (
2009-01-26 14:08:44 +00:00
'#type' => 'select' ,
2008-12-22 19:38:31 +00:00
'#title' => t ( 'Discard items older than' ),
2009-01-26 14:08:44 +00:00
'#default_value' => variable_get ( 'aggregator_clear' , 9676800 ),
2008-12-22 19:38:31 +00:00
'#options' => $period ,
'#description' => t ( 'The length of time to retain feed items before discarding. (Requires a correctly configured <a href="@cron">cron maintenance task</a>.)' , array ( '@cron' => url ( 'admin/reports/status' ))),
);
$form [ 'modules' ][ 'aggregator' ][ 'aggregator_category_selector' ] = array (
2009-01-26 14:08:44 +00:00
'#type' => 'radios' ,
'#title' => t ( 'Category selection type' ),
2008-12-22 19:38:31 +00:00
'#default_value' => variable_get ( 'aggregator_category_selector' , 'checkboxes' ),
2009-01-26 14:08:44 +00:00
'#options' => array ( 'checkboxes' => t ( 'checkboxes' ),
2008-12-22 19:38:31 +00:00
'select' => t ( 'multiple selector' )),
'#description' => t ( 'The type of category selection widget displayed on categorization pages. (For a small number of categories, checkboxes are easier to use, while a multiple selector works well with large numbers of categories.)' ),
);
}
}
/**
* Add / edit / delete an aggregator item .
*
* @ param $edit
* An associative array describing the item to be added / edited / deleted .
*/
function aggregator_save_item ( $edit ) {
if ( $edit [ 'title' ] && empty ( $edit [ 'iid' ])) {
$edit [ 'iid' ] = db_insert ( 'aggregator_item' )
-> fields ( array (
'title' => $edit [ 'title' ],
'link' => $edit [ 'link' ],
'author' => $edit [ 'author' ],
'description' => $edit [ 'description' ],
'guid' => $edit [ 'guid' ],
'timestamp' => $edit [ 'timestamp' ],
'fid' => $edit [ 'fid' ],
))
-> execute ();
}
if ( $edit [ 'iid' ] && ! $edit [ 'title' ]) {
db_delete ( 'aggregator_item' )
-> condition ( 'iid' , $edit [ 'iid' ])
-> execute ();
db_delete ( 'aggregator_category_item' )
-> condition ( 'iid' , $edit [ 'iid' ])
-> execute ();
}
elseif ( $edit [ 'title' ] && $edit [ 'link' ]) {
// file the items in the categories indicated by the feed
$result = db_query ( 'SELECT cid FROM {aggregator_category_feed} WHERE fid = :fid' , array ( ':fid' => $edit [ 'fid' ]));
foreach ( $result as $category ) {
db_merge ( 'aggregator_category_item' )
2009-01-22 12:59:32 +00:00
-> key ( array ( 'iid' => $edit [ 'iid' ]))
2008-12-22 19:38:31 +00:00
-> fields ( array (
'cid' => $category -> cid ,
))
-> execute ();
}
}
}
/**
* Expire feed items on $feed that are older than aggregator_clear .
2009-01-26 14:08:44 +00:00
*
2008-12-22 19:38:31 +00:00
* @ param $feed
* Object describing feed .
*/
function aggregator_expire ( $feed ) {
2009-05-16 17:58:30 +00:00
$aggregator_clear = variable_get ( 'aggregator_clear' , 9676800 );
if ( $aggregator_clear != AGGREGATOR_CLEAR_NEVER ) {
// Remove all items that are older than flush item timer.
$age = REQUEST_TIME - $aggregator_clear ;
$iids = db_query ( 'SELECT iid FROM {aggregator_item} WHERE fid = :fid AND timestamp < :timestamp' , array (
':fid' => $feed -> fid ,
':timestamp' => $age ,
))
-> fetchCol ();
if ( $iids ) {
db_delete ( 'aggregator_category_item' )
-> condition ( 'iid' , $iids , 'IN' )
-> execute ();
db_delete ( 'aggregator_item' )
-> condition ( 'iid' , $iids , 'IN' )
-> execute ();
}
2008-12-22 19:38:31 +00:00
}
}