diff --git a/wf_required_fields.css b/wf_required_fields.css new file mode 100644 index 0000000..d9b4f47 --- /dev/null +++ b/wf_required_fields.css @@ -0,0 +1,8 @@ +.form-requiring-states { + color: #f90; +} + +.form-requiring-states .labels { + font-weight: normal; + font-size: 0.85em; +} \ No newline at end of file diff --git a/wf_required_fields.inc b/wf_required_fields.inc index f9cd4f5..cdb5284 100644 --- a/wf_required_fields.inc +++ b/wf_required_fields.inc @@ -173,4 +173,29 @@ function wf_required_fields_set_required(&$element) { case 'radios': unset ($element['#options']['']); } +} + +/** + * Sets which states would require the field + * + * @param array $element The Forms API element + * @param array $other_requiring_states The non-current states which would require the field + */ +function wf_required_fields_set_requiring_states(&$element, $other_requiring_states) { + $element['#other_requiring_states'] = $other_requiring_states; + $element['#post_render'][] = 'wf_required_fields_render_requiring_states'; +} + +function wf_required_fields_render_requiring_states($content, $element) { + $addition = theme('wf_requiring_states', $element['#other_requiring_states']); + $content = preg_replace('/<\/label>/', $addition . '', $content, 1); + return $content; +} + +function theme_wf_requiring_states($states) { + drupal_add_css(drupal_get_path('module', 'wf_required_fields') .'/wf_required_fields.css', 'module', 'all', FALSE); + return + '' . + '* ' . implode(', ', $states) . '' . + ''; } \ No newline at end of file diff --git a/wf_required_fields.module b/wf_required_fields.module index bdb7607..4ac7664 100644 --- a/wf_required_fields.module +++ b/wf_required_fields.module @@ -51,16 +51,33 @@ function wf_required_fields_form_alter(&$form, &$form_state, $form_id) { * 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; + $workflow = workflow_get_workflow_for_type($type); + $states = workflow_get_states($workflow); + $sids = array_keys($states); + $current_sid = workflow_node_current_state($form['#node']); $info = content_types($type); $fields_available = $info['fields']; foreach (array_keys($fields_available) as $field) { - if (wf_required_fields_is_required($type, $field, $sid)) { + $other_requiring_states = array(); + foreach($sids as $sid) { + if (wf_required_fields_is_required($type, $field, $sid)) { + if ($sid == $current_sid) { + $array =& wf_required_fields_find_required($form, $field); + if ($array !== null) { + wf_required_fields_set_required($array); + } + } + else { + $other_requiring_states[] = $states[$sid]; + } + } + } + if (!empty($other_requiring_states)) { $array =& wf_required_fields_find_required($form, $field); if ($array !== null) { - wf_required_fields_set_required($array); + wf_required_fields_set_requiring_states($array, $other_requiring_states); } } } @@ -194,3 +211,14 @@ function wf_required_fields_workflow($op, $old_sid, $new_sid, $node) { return; } } + +/** + * Implementation of hook_theme(). + */ +function wf_required_fields_theme() { + return array( + 'wf_requiring_states' => array( + 'arguments' => array('states' => array()), + ), + ); +} \ No newline at end of file