View source
<?php
define("FIELD_ROLE_AUTHOR", -1);
define("FIELD_ROLE_USERREFERENCE", -2);
function workflow_fields_help($section) {
switch ($section) {
case 'admin/modules#description':
return t('Add per-state CCK field settings to workflows. <em>Note: Requires both workflow.module and content.module</em>.');
}
}
function workflow_fields_form_alter($form_id, &$form) {
if (isset($form['type']) && $form['type']['#value'] . '_node_form' == $form_id) {
workflow_fields_node_form_alter($form_id, $form);
}
elseif ('workflow_state_add_form' == $form_id) {
workflow_fields_state_form_alter($form_id, $form);
}
}
function workflow_fields_state_form_alter($form_id, &$form) {
$wid = $form['wid']['#value'];
$sid = $form['sid']['#value'];
$types = db_query("SELECT type FROM {workflow_type_map} WHERE wid=%d", $wid);
if (empty($types)) {
return;
}
if (WORKFLOW_CREATION == db_result(db_query("SELECT sysid FROM {workflow_states} WHERE sid = %d", $sid))) {
$form['sysid'] = array(
'#type' => 'value',
'#value' => WORKFLOW_CREATION,
);
$form['weight'] = array(
'#type' => 'value',
'#value' => WORKFLOW_CREATION_DEFAULT_WEIGHT,
);
$form['state'] = array(
'#type' => 'value',
'#value' => t('(creation)'),
);
}
$form['#submit']['workflow_fields_state_form_submit'] = array();
$form['fields']['#theme'] = 'workflow_fields_state';
$form['fields']['#tree'] = TRUE;
$form['fields']['types'] = array(
'#type' => 'value',
'#value' => array(),
);
$rids = array(
FIELD_ROLE_AUTHOR => t('author'),
);
$result = db_query("SELECT r.rid, r.name FROM {role} r ORDER BY r.name");
while ($obj = db_fetch_object($result)) {
$rids[$obj->rid] = $obj->name;
}
while ($values = db_fetch_array($types)) {
$type = $values['type'];
if ($content = content_types($type)) {
array_push($form['fields']['types']['#value'], $type);
$userrefs = array();
foreach ($content['fields'] as $userref) {
if ($userref['type'] == 'userreference') {
$userrefs[$userref['field_name']] = $userref['widget']['label'];
}
}
$fields = module_invoke_all('workflow_fields', $type) + $content['fields'];
foreach ($fields as $field) {
$visible = array();
$editable = array();
$result = db_query("SELECT rid, visible, editable, visible_userref, editable_userref FROM {workflow_fields} WHERE sid=%d AND name='%s'", intval($sid), $field['field_name']);
while ($access = db_fetch_array($result)) {
if ($access['visible']) {
$visible[] = $access['rid'];
}
if ($access['editable']) {
$editable[] = $access['rid'];
}
}
$form['fields'][$type][$field['field_name']]['visible'] = array(
'#type' => 'checkboxes',
'#options' => $rids,
'#default_value' => $visible,
);
$form['fields'][$type][$field['field_name']]['editable'] = array(
'#type' => 'checkboxes',
'#options' => $rids,
'#default_value' => $editable,
);
if (!empty($userrefs)) {
$form['fields'][$type][$field['field_name']]['visible_ref'] = array(
'#type' => 'checkbox',
'#title' => t('user reference: '),
'#default_value' => in_array(FIELD_ROLE_USERREFERENCE, $visible),
);
$form['fields'][$type][$field['field_name']]['visible_refs'] = array(
'#type' => 'select',
'#options' => $userrefs,
'#default_value' => $access['visible_userref'],
);
$form['fields'][$type][$field['field_name']]['editable_ref'] = array(
'#type' => 'checkbox',
'#title' => t('user reference: '),
'#default_value' => in_array(FIELD_ROLE_USERREFERENCE, $editable),
);
$form['fields'][$type][$field['field_name']]['editable_refs'] = array(
'#type' => 'select',
'#options' => $userrefs,
'#default_value' => $access['editable_userref'],
);
}
}
}
else {
watchdog('workflow fields', t('The content type "%type" does not provide metadata information.', array(
'%type' => $type,
)));
}
}
$form['submit']['#weight'] = 99;
}
function workflow_fields_workflow_fields($type) {
$content = content_types($type);
$fields = array();
if ($content['has_title']) {
$fields['title'] = array(
'field_name' => 'title',
'widget' => array(
'label' => $content['title_label'],
),
);
}
if ($content['has_body']) {
$fields['body'] = array(
'field_name' => 'body',
'widget' => array(
'label' => $content['body_label'],
),
);
}
return $fields;
}
function theme_workflow_fields_state($form) {
$header = array(
t('Content type'),
t('Field name'),
t('Visible'),
t('Editable'),
);
$rows = array();
foreach ($form['types']['#value'] as $type) {
$content = content_types($type);
$fields = module_invoke_all('workflow_fields', $type) + $content['fields'];
foreach ($fields as $field) {
$rows[] = array(
$type,
$field['widget']['label'] . ' (' . $field['field_name'] . ')',
drupal_render($form[$type][$field['field_name']]['visible']) . drupal_render($form[$type][$field['field_name']]['visible_ref']) . drupal_render($form[$type][$field['field_name']]['visible_refs']),
drupal_render($form[$type][$field['field_name']]['editable']) . drupal_render($form[$type][$field['field_name']]['editable_ref']) . drupal_render($form[$type][$field['field_name']]['editable_refs']),
);
}
}
$output = theme('table', $header, $rows) . '<p />';
return $output;
}
function workflow_fields_state_form_submit($form_id, $form_values) {
if (isset($form_values['fields'])) {
if (!isset($form_state['values']['sid'])) {
$form_values['sid'] = db_result(db_query("SELECT sid FROM {workflow_states} WHERE wid=%d AND state='%s'", $form_values['wid'], $form_values['state']));
}
db_query("DELETE FROM {workflow_fields} WHERE sid = %d", intval($form_values['sid']));
foreach ($form_values['fields'] as $type => $fields) {
if ($type == 'types') {
continue;
}
foreach ($fields as $key => $field) {
foreach ($field['visible'] as $rid => $checked) {
db_query("INSERT INTO {workflow_fields} (sid, rid, name, type, visible, editable) VALUES (%d, %d, '%s', '%s', %d, %d)", $form_values['sid'], $rid, $key, $type, (bool) $checked, (bool) $field['editable'][$rid]);
}
db_query("INSERT INTO {workflow_fields} (sid, rid, name, type, visible, editable, visible_userref, editable_userref) VALUES (%d, %d, '%s', '%s', %d, %d, '%s', '%s')", $form_values['sid'], FIELD_ROLE_USERREFERENCE, $key, $type, (bool) $field['visible_ref'], (bool) $field['editable_ref'], $field['visible_refs'], $field['editable_refs']);
}
}
}
}
function workflow_fields_node_form_alter($form_id, &$form) {
$node = $form['#node'];
$sid = workflow_node_current_state($node);
if (!is_numeric($sid)) {
$wid = db_result(db_query("SELECT wid FROM {workflow_type_map} WHERE type = '%s'", $form['type']['#value']));
$sid = db_result(db_query("SELECT sid FROM {workflow_states} WHERE sysid = %d AND wid = %d", WORKFLOW_CREATION, $wid));
}
if ($content = content_types($node->type)) {
$form['sid'] = array(
'#type' => 'value',
'#value' => $sid,
);
list($visibles, $editables) = _workflow_fields_get_fields($sid, $node->type, $node);
if (!isset($visibles)) {
return;
}
$fields = module_invoke_all('workflow_fields', $node->type) + $content['fields'];
foreach ($visibles as $key => $visible) {
$editable = $editables[$key];
if ($visible && $editable) {
continue;
}
if (!($element =& _workflow_fields_find_element($key, $form))) {
watchdog('workflow fields', t('Could not find field "%name" while altering the form. Proceeding to delete it from database.', array(
'%name' => $key,
)));
db_query("DELETE FROM {workflow_fields} WHERE type = '%s' AND name = '%s'", $node->type, $key);
continue;
}
$field = $fields[$key];
if (!$visible || variable_get('workflow_fields_hide_read_only_when_editing', FALSE)) {
if (isset($content['fields'][$key])) {
$element['#prefix'] = '<div style="display: none">';
$element['#suffix'] = '</div>';
}
else {
$element['#type'] = 'value';
}
}
elseif (!$editable) {
if (isset($content['fields'][$key])) {
$weight = $element['#weight'];
$node_field = isset($node->{$key}) ? $node->{$key} : array();
$form[$key . '_view'] = array(
'#type' => 'markup',
'#value' => _workflow_fields_node_view($node, $field, $node_field),
'#weight' => $weight,
);
$element['#prefix'] = '<div style="display: none">';
$element['#suffix'] = '</div>';
}
else {
$element['#disabled'] = TRUE;
}
}
if ($field['type'] == 'file') {
unset($form[$key . '-attach-url']);
}
}
}
}
function _workflow_fields_compute_groups($node = NULL) {
global $user;
$groups = array_keys($user->roles);
if (isset($node) && $user->uid == $node->uid) {
array_push($groups, FIELD_ROLE_AUTHOR);
}
return $groups;
}
function workflow_fields_workflow_operations($mode, $wid, $sid = 0) {
switch ($mode) {
case 'workflow':
break;
case 'state':
if (WORKFLOW_CREATION == db_result(db_query("SELECT sysid FROM {workflow_states} WHERE wid = %d AND sid = %d", $wid, $sid))) {
return array(
'workflow_creation_edit' => array(
'title' => t('Edit'),
'href' => "admin/build/workflow/state/{$wid}/{$sid}",
),
);
}
break;
}
}
function _workflow_fields_node_view($node, $field, $node_field) {
$field_types = _content_field_types();
$teaser = FALSE;
$page = FALSE;
$context = 'full';
$formatter = isset($field['display_settings'][$context]['format']) ? $field['display_settings'][$context]['format'] : 'default';
$value = '';
if ($formatter != 'hidden') {
if (content_handle('field', 'view', $field) == CONTENT_CALLBACK_CUSTOM) {
$module = $field_types[$field['type']]['module'];
$function = $module . '_field';
if (function_exists($function)) {
$value = $function('view', $node, $field, $node_field, $teaser, $page);
}
}
else {
foreach ($node_field as $delta => $item) {
$node_field[$delta]['view'] = content_format($field, $item, $formatter, $node);
}
$value = theme('field', $node, $field, $node_field, $teaser, $page);
}
}
return $value;
}
function workflow_fields_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if ($op == 'view') {
$sid = workflow_node_current_state($node);
list($visibles, $editables) = _workflow_fields_get_fields($sid, $node->type, $node);
if (!isset($visibles)) {
return;
}
foreach ($visibles as $key => $visible) {
if (!$visible) {
$node->content[$key]['#access'] = FALSE;
}
}
}
}
function workflow_fields_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
'path' => 'admin/settings/workflow_fields',
'title' => t('Workflow Fields settings'),
'description' => t('Global settings for the behaviour of Workflow Fields.'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'_workflow_fields_settings',
),
'access' => user_access('administer workflow'),
);
}
return $items;
}
function _workflow_fields_settings() {
$form['workflow_fields_hide_read_only_when_editing'] = array(
'#type' => 'checkbox',
'#title' => t('Hide read-only fields when editing'),
'#default_value' => variable_get('workflow_fields_hide_read_only_when_editing', FALSE),
'#description' => t('Check this box to hide read-only fields from the editing form.'),
);
return system_settings_form($form);
}
function theme__workflow_fields_settings($form) {
$output = '';
$output .= drupal_render($form);
$output .= '<p class="cvs-version">$Id$</p>';
return $output;
}
function _workflow_fields_get_fields($sid, $type, $node) {
global $user;
$result = db_query("SELECT * FROM {workflow_fields} WHERE sid = %d AND type = '%s' AND rid IN (%d, %s)", $sid, $type, FIELD_ROLE_USERREFERENCE, implode(_workflow_fields_compute_groups($node), ','));
while ($row = db_fetch_array($result)) {
if ($row['rid'] != FIELD_ROLE_USERREFERENCE) {
$visibles[$row['name']] |= $row['visible'];
$editables[$row['name']] |= $row['editable'];
}
else {
$visibles[$row['name']] |= $row['visible'] && isset($node->{$row['visible_userref']}) && $node->{$row['visible_userref']}[0]['uid'] == $user->uid;
$editables[$row['name']] |= $row['editable'] && isset($node->{$row['editable_userref']}) && $node->{$row['editable_userref']}[0]['uid'] == $user->uid;
}
}
return array(
$visibles,
$editables,
);
}
function &_workflow_fields_find_element($key, &$form) {
if (array_key_exists($key, $form)) {
$ret =& $form[$key];
return $ret;
}
foreach ($form as $k => $v) {
if (is_array($v)) {
$ret =& _workflow_fields_find_element($key, $form[$k]);
if ($ret) {
return $ret;
}
}
}
return FALSE;
}