I have drupal 6 module which implements hook_nodeapi(). I have to convert it to drupal 7. Need suggestions. Any help would be great.
- "alter": the $node->content array has been rendered, so the node body or teaser is filtered and now contains HTML. This op should only be used when text substitution, filtering, or other raw text operations are necessary.
- "delete": The node is being deleted.
- "delete revision": The revision of the node is deleted. You can delete data associated with that revision.
- "insert": The node has just been created (inserted in the database).
- "load": The node is about to be loaded from the database. This hook can be used to load additional data at this time.
- "prepare": The node is about to be shown on the add/edit form.
- "prepare translation": The node is being cloned for translation. Load additional data or copy values from $node->translation_source.
- "print": Prepare a node view for printing. Used for printer-friendly view in book_module
- "rss item": An RSS feed is generated. The module can return properties to be added to the RSS item generated for this node. See comment_nodeapi() and upload_nodeapi() for examples. The $node passed can also be modified to add or remove contents to the feed item.
- "search result": The node is displayed as a search result. If you want to display extra information with the result, return it.
- "presave": The node passed validation and is about to be saved. Modules may use this to make changes to the node before it is saved to the database.
- "update": The node has just been updated in the database.
- "update index": The node is being indexed. If you want additional information to be indexed which is not already visible through nodeapi "view", then you should return it here.
- "validate": The user has just finished editing the node and is trying to preview or submit it. This hook can be used to check the node data. Errors should be set with form_set_error().
"view": The node content is being assembled before rendering. The module may add elements $node->content prior to rendering. This hook will be called after hook_view(). The format of $node->content is the same as used by Forms API.
function px_nodeapi(&$node, $op, $teaser, $page) { // px_logger(PX_INFO, 'nodeapi', $op, $node); switch ($op) { case 'delete_revision': switch ($node->type) { case 'case': case 'case_slide': case 'case_fov': px_case_delete_revision($node); break; default: break; } break; case 'insert': // apply uploadpath logic to images case 'update': if ($node->type == 'image') { //px_logger(PX_INFO, 'uploadpath', $op, $node); if (isset($node->images) && user_access('upload files') && $node->new_file == 1) { px_set_tokens($node); foreach ($node->images as $size => $src_file) { if (!isset($src_file) or empty($src_file)) { continue; } $fid = db_result(db_query("SELECT fid FROM {image} WHERE nid=%d and image_size='%s' LIMIT 1", $node->nid, $size)); $base_file_name = basename($src_file); //px_logger(PX_INFO, 'uploadpath', '$base_file_name='.$base_file_name); //get the token path pattern $pattern = variable_get('uploadpath_prefix_'.$node->type, 'px/users/[case-owner]/[case-handle]/images'); if(variable_get('uploadpath_clean_filenames', false)){ //get path info of file $file_info = pathinfo($src_file); px_logger(PX_INFO, 'uploadpath', '$file_info=', $file_info); /*crop lowercase node title to max replace anything except numbers and letters with underscore add 10 digit unique id and file extension*/ $file_name = substr($file_info['filename'], 0, 50); //replace anything except numbers and letters with an underscore //$file_name = preg_replace("/([^a-z0-9])/", '_', strtolower($file_name)); $file_name = preg_replace("/([^a-zA-Z0-9])/", '_', $file_name); //replace multiple underscores with a single one $file_name = preg_replace("/_+/", '_', $file_name); //$file_name .= '_'. substr(uniqid(rand(), true),0,5). '.'. $file_info['extension']; $file_name .= '.' . $file_info['extension']; // apply new, prefixed file name by token replacing the path pattern $file_path = token_replace($pattern . '/', 'node', $node); $file_name = $file_path . $file_name; }else{ // apply new, prefixed file name by token replacing the path pattern $file_name = str_replace(array(' ', "\n", "\t"), '_', token_replace($pattern . '/', 'node', $node)) . $base_file_name; } //px_logger(PX_INFO, 'uploadpath', 'new path is '.$file_name); // SECURITY NOTE: // Tokens include user supplied information and could provide an attack vector. // The current method of creating directories prevents the use of .. or other malicious // paths, but future developers should keep this in mind when modifying the following code // Create the directory if it doesn't exist yet. $dirs = explode('/', dirname($file_name)); $directory = file_directory_path(); $file_name = $directory.'/'.$file_name; while (count($dirs)) { $directory .= '/' . array_shift($dirs); file_check_directory($directory, FILE_CREATE_DIRECTORY); } px_logger(PX_INFO, 'uploadpath', 'about to move file from '.$src_file.' to '.$file_name); //move file to new subfolder if (file_move($src_file, $file_name, FILE_EXISTS_RENAME)) { //update node file array with new path, if needed $node->images[$size] = $file_name; // update file record in database db_query("UPDATE {files} SET filepath = '%s' WHERE fid = %d", $file_name, $fid); } //px_logger(PX_INFO, 'uploadpath', 'node', $node); } } } break; case 'presave': // if ($node->type == 'case_slide') { // $node->title = $test_type; // } break; case 'view': if (($node->type == 'case' or $node->type == 'case_slide' or $node->type == 'case_fov') and $teaser and !$node->iid) { $node->content['image_attach'] = array( '#value' => theme("image_attach_teaser", $node), '#weight' => variable_get("image_attach_weight_teaser_{$node->type}", 0), ); } if ($node->type == 'group' and !$teaser) { $num_members = db_result(db_query('SELECT COUNT(*) FROM {og_uid} WHERE is_active = 1 and nid = %d', $node->nid)); $num_cases = db_result(db_query('SELECT COUNT(*) FROM {og_ancestry} WHERE group_nid = %d', $node->nid)); unset($node->content['og_mission']); $case_user = user_load(array('uid' => $node->uid)); $node->content['group_details'] = array( '#value' => ' <div id="group_desc"> <!--div class="value">'.$node->og_description.'</div--> </div>', '#weight' => -10, ); if (!empty($node->body)) { $node->content['group_details']['#value'] = '<div id="group_body">'.$node->body.'</div>' . $node->content['group_details']['#value']; } $node->content['group_details']['#value'] = '<div id="group_created">Created on '.px_case_format_date($node->created).' by '.theme('username', $case_user).'</div>' . $node->content['group_details']['#value']; $group_members = '<ul>'; $ml = 5; $result = db_query('SELECT uid, created FROM {og_uid} WHERE is_active = 1 and nid = %d ORDER BY created DESC LIMIT '.$ml, $node->nid); while ($row = db_fetch_array($result)) { $member = user_load(array('uid' => $row['uid'])); $group_members .= '<li>'.theme('username', $member).'</li>'; } $group_members .= '</ul>'; $node->content['group_members'] = array( '#value' => ' <div id="group_recent_members"> <span class="stats"><a href="/og/users/'.$node->nid.'">All members ('.$num_members.')</a></span> <span class="label">Recent members</span> <div class="value">'.$group_members.'</div> </div>', '#weight' => -8, ); $node->content['view']['#value'] = ' <div id="group_recent_cases"> <span class="stats"><a href="/node/'.$node->nid.'/cases">All cases ('.$num_cases.')</a></span> <span class="label">Recent cases</span> <div class="value">'.$node->content['view']['#value'].'</div> </div>'; // px_logger(PX_INFO, 'nodeapi', 'node is', $node); } default: // px_logger(PX_INFO, 'nodeapi', 'op is '.$op.' type is '.$node->type); break; }
}