File Coverage

blib/lib/Drupal/Module/Starter/4_7_3.pm
Criterion Covered Total %
statement 6 8 75.0
branch n/a
condition n/a
subroutine 2 3 66.6
pod 2 2 100.0
total 10 13 76.9


line stmt bran cond sub pod time code
1             package Drupal::Module::Starter::4_7_3;
2              
3             # 4_7_3_ hooks
4             #
5             #
6              
7 4     4   26993 use strict;
  4         8  
  4         4014  
8              
9              
10             our $stubs = {
11             hook_access => q!function MODULENAME_access($op, $node) {
12             global $user;
13              
14             if ($op == 'create') {
15             return user_access('create stories');
16             }
17              
18             if ($op == 'update' || $op == 'delete') {
19             if (user_access('edit own stories') && ($user->uid == $node->uid)) {
20             return TRUE;
21             }
22             }
23             } !,
24            
25              
26             hook_auth => q!function MODULENAME_auth($username, $password, $server) {
27             $message = new xmlrpcmsg('drupal.login', array(new xmlrpcval($username,
28             'string'), new xmlrpcval($password, 'string')));
29              
30             $client = new xmlrpc_client('/xmlrpc.php', $server, 80);
31             $result = $client->send($message, 5);
32             if ($result && \!$result->faultCode()) {
33             $value = $result->value();
34             $login = $value->scalarval();
35             }
36              
37             return $login;
38             } !,
39            
40              
41             hook_block => q!function MODULENAME_block($op = 'list', $delta = 0, $edit = array()) {
42             if ($op == 'list') {
43             $blocks[0] = array('info' => t('Mymodule block #1 shows ...'),
44             'weight' => 0, 'enabled' => 1, 'region' => 'left');
45             $blocks[1] = array('info' => t('Mymodule block #2 describes ...'),
46             'weight' => 0, 'enabled' => 0, 'region' => 'right');
47             return $blocks;
48             }
49             else if ($op == 'configure' && $delta == 0) {
50             $form['items'] = array(
51             '#type' => 'select',
52             '#title' => t('Number of items'),
53             '#default_value' => variable_get('mymodule_block_items', 0),
54             '#options' => array('1', '2', '3'),
55             );
56             return $form;
57             }
58             else if ($op == 'save' && $delta == 0) {
59             variable_set('mymodule_block_items', $edit['items']);
60             }
61             else if ($op == 'view') {
62             switch($delta) {
63             case 0:
64             $block = array('subject' => t('Title of block #1'),
65             'content' => mymodule_display_block_1());
66             break;
67             case 1:
68             $block = array('subject' => t('Title of block #2'),
69             'content' => mymodule_display_block_2());
70             break;
71             }
72             return $block;
73             }
74             } !,
75            
76              
77             hook_comment => q!function MODULENAME_comment($comment, $op) {
78             if ($op == 'insert' || $op == 'update') {
79             $nid = $comment['nid'];
80             }
81              
82             cache_clear_all_like(drupal_url(array('id' => $nid)));
83             } !,
84            
85              
86             hook_cron => q!function MODULENAME_cron() {
87             $result = db_query('SELECT * FROM {site} WHERE checked = 0 OR checked
88             + refresh < %d', time());
89              
90             while ($site = db_fetch_array($result)) {
91             cloud_update($site);
92             }
93             } !,
94            
95              
96             hook_db_rewrite_sql => q!function MODULENAME_db_rewrite_sql($query, $primary_table, $primary_field, $args) {
97             switch ($primary_field) {
98             case 'nid':
99             // this query deals with node objects
100             $return = array();
101             if ($primary_table \!= 'n') {
102             $return['join'] = "LEFT JOIN {node} n ON $primary_table.nid = n.nid";
103             }
104             $return['where'] = 'created >' . mktime(0, 0, 0, 1, 1, 2005);
105             return $return;
106             break;
107             case 'tid':
108             // this query deals with taxonomy objects
109             break;
110             case 'vid':
111             // this query deals with vocabulary objects
112             break;
113             }
114             } !,
115            
116              
117             hook_delete => q!function MODULENAME_delete(&$node) {
118             db_query('DELETE FROM {mytable} WHERE nid = %d', $node->nid);
119             } !,
120            
121              
122             hook_elements => q!function MODULENAME_elements() {
123             $type['filter_format'] = array('#input' => TRUE);
124             return $type;
125             } !,
126            
127              
128             hook_exit => q!function MODULENAME_exit($destination = NULL) {
129             db_query('UPDATE {counter} SET hits = hits + 1 WHERE type = 1');
130             } !,
131            
132              
133             hook_file_download => q!function MODULENAME_file_download($file) {
134             if (user_access('access content')) {
135             if ($filemime = db_result(db_query("SELECT filemime FROM {fileupload} WHERE filepath = '%s'", file_create_path($file)))) {
136             return array('Content-type:' . $filemime);
137             }
138             }
139             else {
140             return -1;
141             }
142             } !,
143            
144              
145             hook_filter => q!function MODULENAME_filter($op, $delta = 0, $format = -1, $text = '') {
146             switch ($op) {
147             case 'list':
148             return array(0 => t('Code filter'));
149              
150             case 'description':
151             return t('Allows users to post code verbatim using <code> and <?php ?> tags.');
152              
153             case 'prepare':
154             // Note: we use the bytes 0xFE and 0xFF to replace < > during the filtering process.
155             // These bytes are not valid in UTF-8 data and thus least likely to cause problems.
156             $text = preg_replace('@(.+?)@se', "'\xFEcode\xFF'. codefilter_escape('\\1') .'\xFE/code\xFF'", $text);
157             $text = preg_replace('@<(\?(php)?|%)(.+?)(\?|%)>@se', "'\xFEphp\xFF'. codefilter_escape('\\3') .'\xFE/php\xFF'", $text);
158             return $text;
159              
160             case "process":
161             $text = preg_replace('@\xFEcode\xFF(.+?)\xFE/code\xFF@se', "codefilter_process_code('$1')", $text);
162             $text = preg_replace('@\xFEphp\xFF(.+?)\xFE/php\xFF@se', "codefilter_process_php('$1')", $text);
163             return $text;
164              
165             default:
166             return $text;
167             }
168             } !,
169            
170              
171             hook_filter_tips => q!function MODULENAME_filter_tips($delta, $format, $long = false) {
172             if ($long) {
173             return t('To post pieces of code, surround them with <code>...</code> tags. For PHP code, you can use <?php ... ?>, which will also colour it based on syntax.');
174             }
175             else {
176             return t('You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.');
177             }
178             } !,
179            
180              
181             hook_footer => q!function MODULENAME_footer($main = 0) {
182             if (variable_get('dev_query', 0)) {
183             print '
'. devel_query_table() .'
';
184             }
185             } !,
186            
187              
188             hook_form => q!function MODULENAME_form(&$node, &$param) {
189             $form['title'] = array(
190             '#type'=> 'textfield',
191             '#title' => t('Title'),
192             '#required' => TRUE,
193             );
194             $form['body'] = array(
195             '#type' => 'textatea',
196             '#title' => t('Description'),
197             '#rows' => 20,
198             '#required' => TRUE,
199             );
200             $form['field1'] = array(
201             '#type' => 'textfield',
202             '#title' => t('Custom field'),
203             '#default_value' => $node->field1,
204             '#maxlength' => 127,
205             );
206             $form['selectbox'] = array(
207             '#type' => 'select',
208             '#title' => t('Select box'),
209             '#default_value' => $node->selectbox,
210             '#options' => array(
211             1 => 'Option A',
212             2 => 'Option B',
213             3 => 'Option C',
214             ),
215             '#description' => t('Please choose an option.'),
216             );
217              
218             return $form;
219             } !,
220            
221              
222             hook_form_alter => q!function MODULENAME_form_alter($form_id, &$form) {
223             if (isset($form['type']) && $form['type']['#value'] .'_node_settings' == $form_id) {
224             $form['workflow']['upload_'. $form['type']['#value']] = array(
225             '#type' => 'radios',
226             '#title' => t('Attachments'),
227             '#default_value' => variable_get('upload_'. $form['type']['#value'], 1),
228             '#options' => array(t('Disabled'), t('Enabled')),
229             );
230             }
231             } !,
232            
233              
234             hook_help => q!function MODULENAME_help($section) {
235             switch ($section) {
236             case 'admin/help#block':
237             return t('

Blocks are the boxes visible in the sidebar(s)

238             of your web site. These are usually generated automatically by
239             modules (e.g. recent forum topics), but you can also create your
240             own blocks using either static HTML or dynamic PHP content.

');
241             break;
242             case 'admin/modules#description':
243             return t('Controls the boxes that are displayed around the main content.');
244             break;
245             }
246             } !,
247            
248              
249             hook_info => q!function MODULENAME_info($field = 0) {
250             $info['name'] = 'Drupal';
251             $info['protocol'] = 'XML-RPC';
252              
253             if ($field) {
254             return $info[$field];
255             }
256             else {
257             return $info;
258             }
259             } !,
260            
261              
262             hook_init => q!function MODULENAME_init() {
263             global $recent_activity;
264              
265             if ((variable_get('statistics_enable_auto_throttle', 0)) &&
266             (\!rand(0, variable_get('statistics_probability_limiter', 9)))) {
267              
268             $throttle = throttle_status();
269             // if we're at throttle level 5, we don't do anything
270             if ($throttle < 5) {
271             $multiplier = variable_get('statistics_throttle_multiplier', 60);
272             // count all hits in past sixty seconds
273             $result = db_query('SELECT COUNT(timestamp) AS hits FROM
274             {accesslog} WHERE timestamp >= %d', (time() - 60));
275             $recent_activity = db_fetch_array($result);
276             throttle_update($recent_activity['hits']);
277             }
278             }
279             } !,
280            
281              
282             hook_insert => q!function MODULENAME_insert($node) {
283             db_query("INSERT INTO {mytable} (nid, extra)
284             VALUES (%d, '%s')", $node->nid, $node->extra);
285             } !,
286            
287              
288             hook_install => q!function MODULENAME_install() {
289             switch ($GLOBALS['db_type']) {
290             case 'mysql':
291             case 'mysqli':
292             db_query("CREATE TABLE {event} (
293             nid int(10) unsigned NOT NULL default '0',
294             event_start int(10) unsigned NOT NULL default '0',
295             event_end int(10) unsigned NOT NULL default '0',
296             timezone int(10) NOT NULL default '0',
297             PRIMARY KEY (nid),
298             KEY event_start (event_start)
299             ) TYPE=MyISAM /*\!40100 DEFAULT CHARACTER SET utf8 */;"
300             );
301             break;
302              
303             case 'pgsql':
304             db_query("CREATE TABLE {event} (
305             nid int NOT NULL default '0',
306             event_start int NOT NULL default '0',
307             event_end int NOT NULL default '0',
308             timezone int NOT NULL default '0',
309             PRIMARY KEY (nid)
310             );"
311             );
312             break;
313             }
314             } !,
315            
316              
317             hook_link => q!function MODULENAME_link($type, $node = NULL, $teaser = FALSE) {
318             $links = array();
319              
320             if ($type == 'node' && $node->type == 'book') {
321             if (book_access('update', $node)) {
322             $links[] = l(t('edit this page'), "node/$node->nid/edit",
323             array('title' => t('Suggest an update for this book page.')));
324             }
325             if (\!$teaser) {
326             $links[] = l(t('printer-friendly version'), "book/print/$node->nid",
327             array('title' => t('Show a printer-friendly version of this book page
328             and its sub-pages.')));
329             }
330             }
331              
332             return $links;
333             } !,
334            
335              
336             hook_load => q!function MODULENAME_load($node) {
337             $additions = db_fetch_object(db_query('SELECT * FROM {mytable} WHERE nid = %s', $node->nid));
338             return $additions;
339             } !,
340            
341              
342             hook_menu => q!function MODULENAME_menu($may_cache) {
343             global $user;
344             $items = array();
345              
346             if ($may_cache) {
347            
348             $items[] = array(
349             'path' => 'your/path',
350             'title' => t('my path'),
351             'access' => user_access('my custom permission'),
352             'type' => MENU_NORMAL_ITEM);
353            
354            
355             $items[] = array(
356             'path' => 'your/other/path',
357             'title' => t('my other path'),
358             'callback' => '_myFunction',
359             'access' => user_access('my custom permission'),
360             'type' => MENU_CALLBACK);
361             }
362             return $items;
363             } !,
364            
365              
366             hook_nodeapi => q!function MODULENAME_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
367             switch ($op) {
368             case 'validate':
369             if ($node->nid && $node->moderate) {
370             // Reset votes when node is updated:
371             $node->score = 0;
372             $node->users = '';
373             $node->votes = 0;
374             }
375             break;
376             case 'insert':
377             case 'update':
378             if ($node->moderate && user_access('access submission queue')) {
379             drupal_set_message(t('The post is queued for approval'));
380             }
381             elseif ($node->moderate) {
382             drupal_set_message(t('The post is queued for approval. The editors will decide whether it should be published.'));
383             }
384             break;
385             }
386             } !,
387            
388              
389             hook_node_grants => q!function MODULENAME_node_grants($user, $op) {
390             $grants = array();
391             if ($op == 'view') {
392             if (user_access('access content')) {
393             $grants[] = 0;
394             }
395             if (user_access('access private content')) {
396             $grants[] = 1;
397             }
398             }
399             if ($op == 'update' || $op == 'delete') {
400             if (user_access('edit content')) {
401             $grants[] = 0;
402             }
403             if (user_access('edit private content')) {
404             $grants[] = 1;
405             }
406             }
407             return array('example' => $grants);
408             } !,
409            
410              
411             hook_node_info => q!function MODULENAME_node_info() {
412             return array(
413             'project_project' => array('name' => t('project'), 'base' => 'project_project'),
414             'project_issue' => array('name' => t('issue'), 'base' => 'project_issue')
415             );
416             } !,
417            
418              
419             hook_perm => q!function MODULENAME_perm() {
420             return array('administer my module');
421             } !,
422            
423              
424             hook_ping => q!function MODULENAME_ping($name = '', $url = '') {
425             $feed = url('node/feed');
426              
427             $client = new xmlrpc_client('/RPC2', 'rpc.weblogs.com', 80);
428              
429             $message = new xmlrpcmsg('weblogUpdates.ping',
430             array(new xmlrpcval($name), new xmlrpcval($url)));
431              
432             $result = $client->send($message);
433              
434             if (\!$result || $result->faultCode()) {
435             watchdog('error', 'failed to notify "weblogs.com" (site)');
436             }
437              
438             unset($client);
439             } !,
440            
441              
442             hook_prepare => q!function MODULENAME_prepare(&$node) {
443             if ($file = file_check_upload($field_name)) {
444             $file = file_save_upload($field_name, _image_filename($file->filename, NULL, TRUE));
445             if ($file) {
446             if (\!image_get_info($file->filepath)) {
447             form_set_error($field_name, t('Uploaded file is not a valid image'));
448             return;
449             }
450             }
451             else {
452             return;
453             }
454             $node->images['_original'] = $file->filepath;
455             _image_build_derivatives($node, true);
456             $node->new_file = TRUE;
457             }
458             } !,
459            
460              
461             hook_search => q!function MODULENAME_search($op = 'search', $keys = null) {
462             switch ($op) {
463             case 'name':
464             return t('content');
465             case 'reset':
466             variable_del('node_cron_last');
467             return;
468             case 'search':
469             $find = do_search($keys, 'node', 'INNER JOIN {node} n ON n.nid = i.sid '. node_access_join_sql() .' INNER JOIN {users} u ON n.uid = u.uid', 'n.status = 1 AND '. node_access_where_sql());
470             $results = array();
471             foreach ($find as $item) {
472             $node = node_load(array('nid' => $item));
473             $extra = node_invoke_nodeapi($node, 'search result');
474             $results[] = array('link' => url('node/'. $item),
475             'type' => node_invoke($node, 'node_name'),
476             'title' => $node->title,
477             'user' => theme('username', $node),
478             'date' => $node->changed,
479             'extra' => $extra,
480             'snippet' => search_excerpt($keys, check_output($node->body, $node->format)));
481             }
482             return $results;
483             }
484             } !,
485            
486              
487             hook_search_item => q!function MODULENAME_search_item($item) {
488             $output .= ' 489             .'">'. $item['title'] .'
';
490             $output .= ' ' . $item['description'] . '';
491             $output .= '

';
492              
493             return $output;
494             } !,
495            
496              
497             hook_search_preprocess => q!function MODULENAME_search_preprocess($text) {
498             // Do processing on $text
499             return $text;
500             } !,
501            
502              
503             hook_settings => q!function MODULENAME_settings() {
504             $form['example_a'] = array(
505             '#type' => 'textfield',
506             '#title' => t('Setting A'),
507             '#default_value' => variable_get('example_a', 'Default setting'),
508             '#size' => 20,
509             '#maxlength' => 255,
510             '#description' => t('A description of this setting.'),
511             );
512             $form['example_b'] = array(
513             '#type' => 'checkbox',
514             '#title' => t('Setting B'),
515             '#default_value' => variable_get('example_b', 0),
516             '#description' => t('A description of this setting.'),
517             );
518              
519             return $form;
520             } !,
521            
522              
523             hook_submit => q!function MODULENAME_submit(&$node) {
524             // if a file was uploaded, move it to the files directory
525             if ($file = file_check_upload('file')) {
526             $node->file = file_save_upload($file, file_directory_path(), false);
527             }
528             } !,
529            
530              
531             hook_taxonomy => q!function MODULENAME_taxonomy($op, $type, $object) {
532             if ($type == 'vocabulary' && ($op == 'insert' || $op == 'update')) {
533             if (variable_get('forum_nav_vocabulary', '') == ''
534             && in_array('forum', $object['nodes'])) {
535             // since none is already set, silently set this vocabulary as the navigation vocabulary
536             variable_set('forum_nav_vocabulary', $object['vid']);
537             }
538             }
539             } !,
540            
541              
542             hook_update => q!function MODULENAME_update($node) {
543             db_query("UPDATE {mytable} SET extra = '%s' WHERE nid = %d",
544             $node->extra, $node->nid);
545             } !,
546            
547              
548             hook_update_index => q!function MODULENAME_update_index() {
549             $last = variable_get('node_cron_last', 0);
550             $limit = (int)variable_get('search_cron_limit', 100);
551              
552             $result = db_query_range('SELECT n.nid, c.last_comment_timestamp FROM {node} n LEFT JOIN {node_comment_statistics} c ON n.nid = c.nid WHERE n.status = 1 AND n.moderate = 0 AND (n.created > %d OR n.changed > %d OR c.last_comment_timestamp > %d) ORDER BY GREATEST(n.created, n.changed, c.last_comment_timestamp) ASC', $last, $last, $last, 0, $limit);
553              
554             while ($node = db_fetch_object($result)) {
555             $last_comment = $node->last_comment_timestamp;
556             $node = node_load(array('nid' => $node->nid));
557              
558             // We update this variable per node in case cron times out, or if the node
559             // cannot be indexed (PHP nodes which call drupal_goto, for example).
560             // In rare cases this can mean a node is only partially indexed, but the
561             // chances of this happening are very small.
562             variable_set('node_cron_last', max($last_comment, $node->changed, $node->created));
563              
564             // Get node output (filtered and with module-specific fields).
565             if (node_hook($node, 'view')) {
566             node_invoke($node, 'view', false, false);
567             }
568             else {
569             $node = node_prepare($node, false);
570             }
571             // Allow modules to change $node->body before viewing.
572             node_invoke_nodeapi($node, 'view', false, false);
573              
574             $text = '

'. drupal_specialchars($node->title) .'

'. $node->body;
575              
576             // Fetch extra data normally not visible
577             $extra = node_invoke_nodeapi($node, 'update index');
578             foreach ($extra as $t) {
579             $text .= $t;
580             }
581              
582             // Update index
583             search_index($node->nid, 'node', $text);
584             }
585             } !,
586            
587              
588             hook_update_N => q!function MODULENAME_update_N() {
589             $ret = array();
590              
591             switch ($GLOBALS['db_type']) {
592             case 'pgsql':
593             db_add_column($ret, 'contact', 'weight', 'smallint', array('not null' => TRUE, 'default' => 0));
594             db_add_column($ret, 'contact', 'selected', 'smallint', array('not null' => TRUE, 'default' => 0));
595             break;
596              
597             case 'mysql':
598             case 'mysqli':
599             $ret[] = update_sql("ALTER TABLE {contact} ADD COLUMN weight tinyint(3) NOT NULL DEFAULT 0");
600             $ret[] = update_sql("ALTER TABLE {contact} ADD COLUMN selected tinyint(1) NOT NULL DEFAULT 0");
601             break;
602             }
603              
604             return $ret;
605             } !,
606            
607              
608             hook_user => q!function MODULENAME_user($op, &$edit, &$account, $category = NULL) {
609             if ($op == 'form' && $category == 'account') {
610             $form['comment_settings'] = array(
611             '#type' => 'fieldset',
612             '#title' => t('Comment settings'),
613             '#collapsible' => TRUE,
614             '#weight' => 4);
615             $form['comment_settings']['signature'] = array(
616             '#type' => 'textarea',
617             '#title' => t('Signature'),
618             '#default_value' => $edit['signature'],
619             '#description' => t('Your signature will be publicly displayed at the end of your comments.'));
620             return $form;
621             }
622             } !,
623            
624              
625             hook_validate => q!function MODULENAME_validate(&$node) {
626             if ($node) {
627             if ($node->end && $node->start) {
628             if ($node->start > $node->end) {
629             form_set_error('time', t('An event may not end before it starts.'));
630             }
631             }
632             }
633             } !,
634            
635              
636             hook_view => q!function MODULENAME_view(&$node, $teaser = FALSE, $page = FALSE) {
637             if ($page) {
638             $breadcrumb = array();
639             $breadcrumb[] = array('path' => 'example', 'title' => t('example'));
640             $breadcrumb[] = array('path' => 'example/'. $node->field1,
641             'title' => t('%category', array('%category' => $node->field1)));
642             $breadcrumb[] = array('path' => 'node/'. $node->nid);
643             menu_set_location($breadcrumb);
644             }
645              
646             $node = node_prepare($node, $teaser);
647             } !,
648            
649              
650             hook_xmlrpc => q!function MODULENAME_xmlrpc() {
651             return array(
652             'drupal.login' => 'drupal_login',
653             array(
654             'drupal.site.ping',
655             'drupal_directory_ping',
656             array('boolean', 'string', 'string', 'string', 'string', 'string'),
657             t('Handling ping request'))
658             );
659             } !,
660              
661             };
662              
663              
664              
665             =head1 SYNOPSIS
666              
667             4_7_2 stubs
668              
669             =head1 FUNCTIONS
670              
671             =head2 new - constructor - no paramaters required
672              
673             =cut
674              
675             sub new {
676 2     2 1 8 my ($self,$class) = ({},shift);
677 2         7 bless $stubs,$class;
678 2         8 return $stubs;
679             }
680              
681             =head2 stub - return a php function stub for the named parameter
682              
683             =cut
684              
685             sub stub {
686 0     0 1   my $self = shift;
687 0           return $self->{stubs}->{shift};
688             }
689              
690             =head1 AUTHOR
691              
692             Steve McNabb, C<< >>
693             IT Director, F5 Site Design - http://www.f5sitedesign.com
694             Open Source Internet Application Development
695              
696             =cut
697             1;
698              
699            
700