'Module builder', 'description' => t('Builds scaffolding for custom modules.'), 'page callback' => 'drupal_get_form', 'page arguments' => array('module_builder_page'), 'file' => 'includes/module_builder.pages.inc', 'access arguments' => array('access module builder'), 'type' => MENU_NORMAL_ITEM, ); $items['admin/settings/module_builder'] = array( 'title' => 'Module builder', 'description' => t('Set default header and footer, api download location, defaults for detail and download and force the api to be re-downloaded.'), 'page callback' => 'drupal_get_form', 'page arguments' => array('module_builder_admin_settings'), 'file' => 'includes/module_builder.admin.inc', 'access arguments' => array('access module builder'), 'type' => MENU_NORMAL_ITEM, ); $items['admin/settings/module_builder/settings'] = array( 'title' => 'Settings', 'description' => t('Set default header and footer, folder locations, and defaults for detail.'), 'page callback' => 'drupal_get_form', 'page arguments' => array('module_builder_admin_settings'), 'file' => 'includes/module_builder.admin.inc', 'access arguments' => array('access module builder'), 'type' => MENU_DEFAULT_LOCAL_TASK, ); $items['admin/settings/module_builder/update'] = array( 'title' => 'Update hooks', 'description' => t('Download hook documentation.'), 'page callback' => 'drupal_get_form', 'page arguments' => array('module_builder_admin_update'), 'file' => 'includes/module_builder.admin.inc', 'access arguments' => array('access module builder'), 'type' => MENU_LOCAL_TASK, ); return $items; } /** * Implementation of hook_theme. */ function module_builder_theme($existing, $type, $theme, $path) { return array( 'module_builder_hook_list' => array( 'arguments' => array('form' => array()), ), ); } ############################# old code below here /** * This still needs some work. Set a bunch of check boxes, forward, back, uncheck * the boxes, forward and back and the boxes get turned back on for some reason. * Otherwise this seems pretty good. */ function _module_builder_save_old_form_values($form, $form_values, $indent='') { static $excludes; if (!isset($excludes)) { $excludes = array('op', 'form_build_id', 'form_token', 'form_id', 'generate_module', 'module_code', 'module_info'); } if (isset($form['#multistep_excludes']) && is_array($form['#multistep_excludes'])) { $excludes = array_merge($excludes, $form['#multistep_excludes']); } if (isset($form_values)) { foreach ($form_values as $key => $value) { //print_r($indent . $key .' => '. $value ."\n"); $include = !in_array($key, $excludes); if ($include) { if (is_array($value)) { if (!isset($form[$key])) { $form[$key] = array(); } $form[$key] = _module_builder_save_old_form_values($form[$key], $value, $indent .' '); $form[$key]['#tree'] = TRUE; } else { if (isset($form[$key])) { $form[$key]['#value'] = $value; } else { $form[$key] = array( '#type' => 'hidden', '#value' => $value, ); } } } } } return $form; } /** * Module form: 'input' step. Collect module data. */ function Xmodule_builder_page_input($form, $form_values) { _module_builder_check_settings(); // Include CSS for formatting drupal_add_css(drupal_get_path('module', 'module_builder') . '/theme/module_builder.css'); // Module properties $form['module_root_name'] = array( '#type' => 'textfield', '#title' => t('Machine-readable name'), '#description' => t('This string is used to name the module files and to prefix all of your functions. This must only contain letters, numbers, and underscores, and may not start with a number.'), '#required' => TRUE, '#default_value' => 'mymodule', ); $form['module_readable_name'] = array( '#type' => 'textfield', '#title' => t('Name'), '#description' => t('Name of your module as it will appear on the module admin page.'), '#required' => TRUE, '#default_value' => 'My Module', ); $form['module_short_description'] = array( '#type' => 'textfield', '#title' => t('Description'), '#description' => t('This text will appear in the module listing at %administer >> %build >> %modules.', array('!listing' => url('admin/build/modules'), '%administer' => 'Administer', '%build' => 'Site building', '%modules' => 'Modules')), '#required' => TRUE, '#default_value' => 'Does awesome things. Makes tea. Washes up. Favours of a personal nature.', ); $form['module_help_text'] = array( '#type' => 'textarea', '#title' => t('Help text'), '#description' => t('Help text (HTML) to appear in %administer >> %help >> module_name page.', array('!help' => url('admin/help'), '%administer' => 'Administer', '%help' => 'Help')), ); $form['module_dependencies'] = array( '#type' => 'textfield', '#title' => t('Dependencies'), '#description' => t('Space seperated list of other modules that your module requires.'), ); $form['module_package'] = array( '#type' => 'textfield', '#title' => t('Package'), '#description' => t('If your module comes with other modules or is meant to be used exclusively with other modules, enter the package name here. Suggested package names: Audio, Bot, CCK, Chat, E-Commerce, Event, Feed parser, Organic groups, Station, Video, Views and Voting.'), ); // Check for custom hook_groups file, else use default $path = drupal_get_path('module', 'module_builder'); if (file_exists($path . MODULE_BUILDER_CUSTOM_HOOK_GROUPS_TEMPLATE_PATH)) { $template_file = file_get_contents($path . MODULE_BUILDER_CUSTOM_HOOK_GROUPS_TEMPLATE_PATH); } else { $template_file = file_get_contents($path . MODULE_BUILDER_HOOK_GROUPS_TEMPLATE_PATH); } $form['hook_groups'] = array( '#type' => 'fieldset', '#title' => t('Hook groupings'), '#description' => t('Selecting one or more of these features will automatically select appropriate hooks for you.'), ); drupal_add_js($path . '/theme/module_builder.js'); // Get list of hook groups from installed template. // Include generating component file. module_builder_include('process'); $hook_groups = module_builder_parse_template($template_file); foreach ($hook_groups as $hook_group_name => $hook_group) { $hooks = explode("\n", $hook_group['template']); $hook_array = array(); foreach ($hooks as $hook) { $hook = trim($hook); if (!empty($hook)) { $hook_array[] = "'$hook'"; } } $form['hook_groups']['groups-'. $hook_group_name] = array( '#type' => 'checkbox', '#title' => $hook_group_name, '#attributes' => array( 'onclick' => 'check_hooks(this, ['. implode(', ', $hook_array) .'])', ), //'#description' => $hook_groups[$i]['data'], // TODO: For some reason this gives me some wacky error under PHP 5: // Fatal error: Cannot use string offset as an array //'#default_value' => $edit['hook_groups'][$i], ); } // Get list of hooks from downloaded documentation, organized in fieldsets. $hook_groups = module_builder_get_hook_data(); if (!is_array($hook_groups) || !count($hook_groups)) { form_set_error('hooks', t('No hooks were found. Please check the documentation path specified in the %administer >> %settings >> %modulebuilder page.', array('!settings' => url('admin/settings/module_builder/update'), '%administer' => 'Administer', '%settings' => 'Site configuration', '%modulebuilder' => "Module builder"))); } else { // Build hooks list $form['hooks'] = array( '#type' => 'checkboxes', '#title' => t('Use the following specific hooks'), ); foreach ($hook_groups as $hook_group => $hooks) { $form['hooks'][$hook_group] = array( '#type' => 'fieldset', '#title' => $hook_group .' hooks', '#collapsible' => TRUE, '#collapsed' => TRUE, '#theme' => 'module_builder_hook_list', ); foreach ($hooks as $hook) { $name = $hook['name']; $desc = $hook['description']; $form['hooks'][$hook_group][$name] = array( '#type' => 'checkbox', '#title' => str_replace('hook_', '', $name), '#description' => $desc, // TODO: For some reason this gives me some wacky error under PHP 5: // Fatal error: Cannot use string offset as an array //'#default_value' => $edit['hooks'][$hook_group][$hook], // TODO: I would *like* to do something like the following, so some of the long // descriptions don't totally mangle the page output, but need a way to do like // a "onmouseover" effect to display the full thing. Note that 'title' is not // a valid attribute for divs. :\ //'#description' => truncate_utf8($desc, 40, TRUE, TRUE), ); // Set some default hooks if ($name == 'hook_menu') { $form['hooks'][$hook_group][$name]['#default_value'] = 1; } } // Sort list alphabetically ksort($form['hooks'][$hook_group]); } /* $form['download'] = array( '#type' => 'checkbox', '#title' => t('Automatically generate module file for download?'), '#description' => t('When checked, this will automatically generate your module file for you and prompt your browser to download it.'), '#default_value' => variable_get('module_builder_download', 1), ); */ $form['generate_module'] = array( '#type' => 'submit', '#name' => 'op', '#value' => t('Generate'), ); } return $form; } /** * Module form: 'module' step. Generate the module code. */ function Xmodule_builder_page_module($form, $form_values) { // Include link in breadcrumb to go back to main module builder form /* $breadcrumb = drupal_get_breadcrumb(); $breadcrumb[] = l(t('Module builder'), 'module_builder'); drupal_set_breadcrumb($breadcrumb); */ $code = $form_values['module_code'] ? $form_values['module_code'] : module_builder_generate_module($form_values); $info = $form_values['module_info'] ? $form_values['module_info'] : module_builder_generate_info($form_values) ; // damn I miss perl at times like this. fugly syntax. $form['back'] = array( '#type' => 'submit', '#name' => 'op', '#value' => t('Back'), ); $form['code_instructions'] = array( '#value' => t('Please copy and paste the following text into a file called !module.', array('!module' => $form_values['module_root_name'] .'.module')), '#prefix' => '