Index: wf_required_fields.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/wf_required_fields/wf_required_fields.inc,v retrieving revision 1.1.2.2 diff -u -r1.1.2.2 wf_required_fields.inc --- wf_required_fields.inc 3 Jan 2008 18:24:38 -0000 1.1.2.2 +++ wf_required_fields.inc 10 Jul 2009 19:55:38 -0000 @@ -31,7 +31,7 @@ */ function wf_required_fields_get_types_configured() { $settings = variable_get( - 'wf_required_fields', + 'wf_required_fields', array('types' => array('config' => array())) ); return $settings['types']['config']; @@ -130,7 +130,8 @@ foreach (array_keys($info['columns']) as $column) { $field = $node->$field_name; if (wf_required_fields_is_required($type, $field_name, $sid)) { - $value = $field[0][$column]; + $first_field_element = array_shift($field); + $value = $first_field_element[$column]; if (!in_array($value, $non_empty, true) && empty($value)) { $missing[$field_name] = $all_fields[$field_name]['widget']['label']; } @@ -146,13 +147,25 @@ * @param array $array The Forms API element */ function wf_required_fields_set_required(&$element) { - $element['#required'] = true; + foreach (element_children($element) as $key) { + if (isset($element[$key]) && $element[$key]) { + + // Recurse through all children elements. + wf_required_fields_set_required($element[$key]); + } + } + + $element['#required'] = '1'; switch ($element['#type']) { case 'select': $index = array_search(t(''), $element['#options']); if ($index !== false) { unset ($element['#options'][$index]); } + $index2 = array_search('---', $element['#options']); + if ($index2 !== false) { + unset ($element['#options'][$index2]); + } break; case 'radios': Index: wf_required_fields.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/wf_required_fields/wf_required_fields.info,v retrieving revision 1.1.2.1 diff -u -r1.1.2.1 wf_required_fields.info --- wf_required_fields.info 3 Jan 2008 16:35:27 -0000 1.1.2.1 +++ wf_required_fields.info 4 Jul 2009 00:19:42 -0000 @@ -2,4 +2,6 @@ name = Workflow required fields description = Sets CCK fields to "required" depending on the workflow state of the node package = Workflow -dependencies = content workflow \ No newline at end of file +dependencies[] = content +dependencies[] = workflow +core = 6.x \ No newline at end of file Index: wf_required_fields.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/wf_required_fields/wf_required_fields.module,v retrieving revision 1.1.2.1 diff -u -r1.1.2.1 wf_required_fields.module --- wf_required_fields.module 3 Jan 2008 18:24:38 -0000 1.1.2.1 +++ wf_required_fields.module 10 Jul 2009 19:54:48 -0000 @@ -2,8 +2,7 @@ // $Id: wf_required_fields.module,v 1.1.2.1 2008/01/03 18:24:38 traxer Exp $ -require_once(drupal_get_path('module', 'wf_required_fields') . '/wf_required_fields.inc'); -require_once(drupal_get_path('module', 'wf_required_fields') . '/wf_required_fields_table.inc'); +module_load_include('inc', 'wf_required_fields', 'wf_required_fields'); /** * Implementation of hook_menu(). @@ -13,20 +12,16 @@ * @param bool $may_cache Whether cachable menu items are requiested * @return array Array of menu items */ -function wf_required_fields_menu($may_cache) { +function wf_required_fields_menu() { $items = array(); - if ($may_cache) { - $items[] = array( - 'path' => 'admin/build/wf-required-fields', - 'title' => t('Workflow Required Fields'), - 'description' => t('Choose the content types that you want to have state dependant required fields. For each such content type and each state, configure the fields that you want to be required.'), - 'callback' => 'drupal_get_form', - 'callback arguments' => 'wf_required_fields_settings_form', - ); - } - else { - // No uncachable items at the moment - } + $items['admin/build/wf-required-fields'] = array( + 'title' => 'Workflow Required Fields', + 'description' => 'Choose the content types that you want to have state dependant required fields. For each such content type and each state, configure the fields that you want to be required.', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('wf_required_fields_settings_form'), + 'access callback' => 'user_access', + 'access arguments' => array('administer site configuration'), + ); return $items; } @@ -40,29 +35,39 @@ * @todo Eliminate (or disable) fields that are required on the cck field * configuration page */ -function wf_required_fields_form_alter($form_id, &$form) { - if ($form['#id'] !== 'node-form') { +function wf_required_fields_form_alter(&$form, &$form_state, $form_id) { + if ($form['#id'] !== 'node-form' || !isset($form['type']) || !isset($form['#node'])) { return; // wrong form } - - $node = $form['#node']; - $type = $node->type; + $type = $form['#node']->type; $types = wf_required_fields_get_types_configured(); - if (! isset($types[$type])) { - return; // node type is not configured to be handled by this module + if (isset($types[$type])) { + $form['#after_build'][] = '_wf_required_fields_after_build'; } + +} + +/** +* Custom after_build callback handler. +*/ +function _wf_required_fields_after_build($form, &$form_state) { + $sid = workflow_node_current_state($form['#node']); + $type = $form['#node']->type; $info = content_types($type); $fields_available = $info['fields']; + foreach (array_keys($fields_available) as $field) { if (wf_required_fields_is_required($type, $field, $sid)) { $array =& wf_required_fields_find_required($form, $field); if ($array !== null) { + // drupal_set_message("Setting field $field as required."); wf_required_fields_set_required($array); } } } + return $form; } /** @@ -113,52 +118,38 @@ '#collapsible' => true, '#collapsed' => false, ); - $form['wf_required_fields']['settings'][$type]['table'] = array( - '#type' => 'wf_required_fields_table', - '#header' => array( - '#type' => 'wf_required_fields_header', - 0 => array( - '#type' => 'wf_required_fields_cell', - 0 => array( - '#value' => t('Field') . '\\' . t('State'), - ) - ), - ), - ); - $cols = array(); + $table_header = ''. t('Field') . '\\' . t('State') . ''; foreach ($states as $sid => $sname) { - $form['wf_required_fields']['settings'][$type]['table']['#header'][$sid] = array( - '#type' => 'wf_required_fields_cell', - 0 => array( - '#value' => $sname, - ) - ); - $cols[] = $sid; + $table_header .= "$sname"; } + $table_header .= ''; + drupal_add_js('misc/tableheader.js'); + $form['wf_required_fields']['settings'][$type]['table'] = array( + '#prefix' => '', + '#value' => $table_header, + '#suffix' => '
' + ); $info = content_types($type); + ksort($info['fields']); + $row = 0; foreach ($info['fields'] as $field => $field_info) { $form['wf_required_fields']['settings'][$type]['table'][$field] = array( - '#type' => 'wf_required_fields_row', - 0 => array( - '#type' => 'wf_required_fields_cell', - '#head' => true, - 0 => array( - '#value' => $field_info['widget']['label'], - ), - ), + '#prefix' => '', + '#value' => '' . $field_info['widget']['label'] . ($field_info['required'] ? '
' . t('Already marked required in its !link', array('!link' => l('global settings', "admin/content/node-type/$type/fields/". $field_info['field_name']))) : ''), + '#suffix' => '', ); - foreach ($cols as $sid) { - $form['wf_required_fields']['settings'][$type]['table'][$field][$sid] = array( - '#type' => 'wf_required_fields_cell', - 'required' => array( - '#type' => 'checkbox', - '#default_value' => wf_required_fields_is_required($type, $field, $sid), - ), + foreach ($states as $sid => $sname) { + $form['wf_required_fields']['settings'][$type]['table'][$field][$sid]['required'] = array( + '#prefix' => '', + '#suffix' => '', + '#type' => 'checkbox', + '#title' => '', + '#default_value' => wf_required_fields_is_required($type, $field, $sid), + '#disabled' => $field_info['required'], ); } } } - return system_settings_form($form); } @@ -186,7 +177,7 @@ $state = workflow_get_state($new_sid); $list = ''; drupal_set_message(