? cck/editable_view_fields_content_module.patch ? cck/editfields_cck.patch ? views/editfields_views.patch Index: cck/content.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/cck/content.module,v retrieving revision 1.90.2.42 diff -u -p -r1.90.2.42 content.module --- cck/content.module 26 Jun 2007 00:16:08 -0000 1.90.2.42 +++ cck/content.module 11 Jul 2007 08:02:27 -0000 @@ -1,5 +1,5 @@ type); + $types = content_types($type_name); + + $field=$types['fields'][$fieldname]; + $widget_types = _content_widget_types(); + + // Set form parameters so we can accept file uploads. + if (count($type['fields'])) { + $form['#attributes'] = array("enctype" => "multipart/form-data"); + } + + _content_widget_invoke_field('prepare form values', $node,$field,$widget_types); + $form = array_merge($form,_content_widget_invoke_field('form',$node,$field,$widget_types)); + + return $form; + +} + +/** * Create fields' form for a content type. * * Each field defines its own component of the content entry form, via its @@ -614,34 +641,50 @@ function _content_widget_invoke($op, &$n $return = array(); if (count($type['fields'])) { foreach ($type['fields'] as $field) { - $node_field = isset($node->$field['field_name']) ? $node->$field['field_name'] : array(); - - $module = $widget_types[$field['widget']['type']]['module']; - $function = $module .'_widget'; - if (function_exists($function)) { - // If we're building a node creation form, pre-fill with default values - if ($op == 'prepare form values' && empty($node->nid)) { - $node_field = array_merge($node_field, content_default_value($node, $field, $node_field)); - } + $return=array_merge($return, _content_widget_invoke_field($op, $node, $field, $widget_types)); + } + } + return $return; +} - $result = $function($op, $node, $field, $node_field); - if (is_array($result) && $op == 'form') { - $result[$field['field_name']]['#weight'] = $field['widget']['weight']; - } - if (is_array($result)) { - $return = array_merge($return, $result); - } - else if (isset($result)) { - $return[] = $result; - } - } - // test for values in $node_field in case modules added items - if (is_object($node) && (isset($node->$field['field_name']) || count($node_field))) { - $node->$field['field_name'] = $node_field; - } + +/** + * Invoke a widget hook for one field. + */ +function _content_widget_invoke_field($op, &$node, $field, $widget_types) +{ + $return = array(); + + $node_field = isset($node->$field['field_name']) ? $node->$field['field_name'] : array(); + + $module = $widget_types[$field['widget']['type']]['module']; + $function = $module .'_widget'; + + if (function_exists($function)) { + + // If we're building a node creation form, pre-fill with default values + if ($op == 'prepare form values' && empty($node->nid)) { + $node_field = array_merge($node_field, content_default_value($node, $field, $node_field)); + } + + $result = $function($op, $node, $field, $node_field); + if (is_array($result) && $op == 'form') { + $result[$field['field_name']]['#weight'] = $field['widget']['weight']; + } + if (is_array($result)) { + $return = array_merge($return, $result); + } + else if (isset($result)) { + $return[] = $result; } } + // test for values in $node_field in case modules added items + if (is_object($node) && (isset($node->$field['field_name']) || count($node_field))) { + $node->$field['field_name'] = $node_field; + } + return $return; + } /** Index: views/views.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/views/views.install,v retrieving revision 1.21.4.15 diff -u -p -r1.21.4.15 views.install --- views/views.install 5 May 2007 01:13:42 -0000 1.21.4.15 +++ views/views.install 11 Jul 2007 08:02:27 -0000 @@ -475,6 +475,15 @@ function views_update_15() { return $ret; } +function views_update_16() { + $ret = array(); + db_add_column($ret, 'view_tablefield', 'editable', 'int(1)'); + + views_make_cache_table($ret); + $ret[] = update_sql("DELETE FROM {cache_views}"); + return $ret; +} + /** * This should go in every update to ensure that it's there from a 4.7 -> 5.x * update. Index: views/views.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/views/views.module,v retrieving revision 1.166.2.42 diff -u -p -r1.166.2.42 views.module --- views/views.module 23 Jun 2007 06:54:52 -0000 1.166.2.42 +++ views/views.module 11 Jul 2007 08:02:28 -0000 @@ -1055,7 +1055,7 @@ function _views_save_view($view) { } foreach ($view->field as $i => $arg) { - db_query("INSERT INTO {view_tablefield} (vid, tablename, field, label, handler, sortable, defaultsort, options, position) VALUES (%d, '%s', '%s', '%s', '%s', %d, '%s', '%s', %d)", $view->vid, $arg['tablename'], $arg['field'], $arg['label'], $arg['handler'], $arg['sortable'], $arg['defaultsort'], $arg['options'], $i); + db_query("INSERT INTO {view_tablefield} (vid, tablename, field, label, handler, sortable, defaultsort, editable, options, position) VALUES (%d, '%s', '%s', '%s', '%s', %d, '%s', %d, '%s', %d)", $view->vid, $arg['tablename'], $arg['field'], $arg['label'], $arg['handler'], $arg['sortable'], $arg['defaultsort'], $arg['editable'], $arg['options'], $i); } foreach ($view->filter as $i => $arg) { @@ -1188,13 +1188,14 @@ function views_view_add_block(&$view, $t /** * Add field info to a view. */ -function views_view_add_field(&$view, $table, $field, $label, $sortable = FALSE, $default_sort = 0, $handler = '') { +function views_view_add_field(&$view, $table, $field, $label, $editable=FALSE, $default_sort = 0, $sortable = FALSE, $handler = '') { $view->field[] = array( 'tablename' => $table, 'field' => $field, 'label' => $label, 'sortable' => $sortable, 'defaultsort' => $default_sort, + 'editable' => $editable, 'handler' => $handler ); } @@ -1250,6 +1251,40 @@ function views_view_add_sort(&$view, $ta ); } +/** + * Helper function to make ID's unique (copied from editview module) + */ +function _make_form_ids_unique($form, $nid) { + // much of this code is from form_builder. we set input elements' #id to a + // unique id by postpending -$nid. + + if ((!empty($form['#type'])) && ($info = _element_info($form['#type']))) { + // overlay $info onto $form, retaining preexisting keys in $form + $form += $info; + } + + if (isset($form['#input']) && $form['#input']) { + $form['#id'] = (isset($form['#id'])) ? $form['#id'] : 'edit-' . implode('-', $form['#parents']); + $form['#id'] .= '-' . $nid; + } + + // recurse through sub-elements + foreach (element_children($form) as $key) { + // don't squash an existing tree value + if (!isset($form[$key]['#tree'])) { + $form[$key]['#tree'] = $form['#tree']; + } + + // don't squash existing parents value + if (!isset($form[$key]['#parents'])) { + // Check to see if a tree of child elements is present. If so, continue down the tree if required. + $form[$key]['#parents'] = $form[$key]['#tree'] && $form['#tree'] ? array_merge($form['#parents'], array($key)) : array($key); + } + $form[$key] = _make_form_ids_unique($form[$key], $nid); + } + return $form; +} + // --------------------------------------------------------------------------- // Themeable and support for themeables. @@ -1259,6 +1294,32 @@ function views_view_add_sort(&$view, $ta function theme_views_handle_field($fields, $field, $data) { $info = $fields[$field['fullname']]; + if ($field['editable']) { + if (function_exists("content_form_field")) { + + $node=node_load($data->nid); + if (node_access("update",$node)) { + if ($info['content_field']['field_name']) { + $form=array(); + $form=content_form_field($node, $info['content_field']['field_name']); + foreach (element_children($form) as $key) { + $form["editablefield_".$data->nid."_".$key]=$form[$key]; + unset($form[$key]); + } + + $form=_make_form_ids_unique($form,$data->nid); + $form=form_builder('editableviewfield',$form); + + return $form=drupal_render_form('editableviewfield',$form); + } else { + drupal_set_message("Can't edit non CCK types for field \"".$field["field"]."\""); + } + } // no access, so silently just print field out. + } else { + drupal_set_message("enable CCK if you wish to edit fields"); + } + } + if ($field['handler'] && function_exists($field['handler'])) { return $field['handler']($info, $field, $data->$field['queryname'], $data); } @@ -1410,11 +1471,56 @@ function theme_views_filters($form) { } /** + * handle editable field forms, and return back if there are editable fields + */ +function _handle_editfield_form_input($view, $nodes) { +// it's really hard to check for each field, as we would have to decode the info +// data, I guess we could, but I dont see the harm, we will revent people from +// writing to nodes they are not allowed to below anyway. + $editable=FALSE; + foreach ($view->field as $field) { + if ($field['editable']) { + $editable=TRUE; + } + } + if ($editable) { + $editable=FALSE; // this time check to make sure we have write access to the node + foreach ($nodes as $node) { + $node=node_load($node->nid); + if (node_access("update",$node)) { + $editable=TRUE; + + $nodeupdate=FALSE; + if ($_POST['op']) { + foreach ($_POST as $post => $value) { + if (sscanf($post, "editablefield_%d_%s",$nid,$fieldname) == 2) { + if ($nid == $node->nid) { + if ($node->$fieldname != $value) { + $node->$fieldname=$value; + $nodeupdate=TRUE; + } + } + } + } + } + if ($nodeupdate) { + node_validate($node); + node_save(node_submit($node)); + } + } + } + } + return $editable; +} + +/** * Display the nodes of a view as a list. */ function theme_views_view_list($view, $nodes, $type) { $fields = _views_get_fields(); + $editable=_handle_editfield_form_input($view, $nodes); + foreach ($nodes as $node) { $item = ''; foreach ($view->field as $field) { @@ -1428,7 +1534,16 @@ function theme_views_view_list($view, $n $items[] = "
name) ."'>$item
\n"; // l($node->title, "node/$node->nid"); } if ($items) { - return theme('item_list', $items); + $html=theme('item_list', $items); + + if ($editable) { + $form['editablefields']['submit']= array('#type' => 'submit', '#value' => t('Submit')); + $form['editablefields']['#value']=$html; + drupal_process_form('editablefields',$form); + return drupal_render($form); + } else { + return $html; + } } } @@ -1438,6 +1553,8 @@ function theme_views_view_list($view, $n function theme_views_view_table($view, $nodes, $type) { $fields = _views_get_fields(); + $editable=_handle_editfield_form_input($view, $nodes); + foreach ($nodes as $node) { $row = array(); foreach ($view->field as $field) { @@ -1449,7 +1566,15 @@ function theme_views_view_table($view, $ } $rows[] = $row; } - return theme('table', $view->table_header, $rows); + $html=theme('table', $view->table_header, $rows ); + if ($editable) { + $form['editablefields']['submit']= array('#type' => 'submit', '#value' => t('Submit')); + $form['editablefields']['#value']=$html; + drupal_process_form('editablefields',$form); + return drupal_render($form); + } else { + return $html; + } } /** Index: views/views_ui.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/views/views_ui.module,v retrieving revision 1.44.2.23 diff -u -p -r1.44.2.23 views_ui.module --- views/views_ui.module 8 Jun 2007 03:37:54 -0000 1.44.2.23 +++ views/views_ui.module 11 Jul 2007 08:02:29 -0000 @@ -1347,6 +1347,11 @@ function views_ui_add_field(&$form, $fie '#options' => array('0' => t('None'), 'ASC' => t('Ascending'), 'DESC' => t('Descending')), ); } + $form['editable'] = array( + '#type' => 'select', + '#default_value' => $field['editable'], + '#options' => array('0' => t('No'), '1' => t('Yes')), + ); if (isset($fieldinfo['help'])) { $form['help'] = array( '#type' => 'markup', @@ -1615,7 +1620,7 @@ function theme_views_edit_view($form) { // fields $collapsed = $allbut && $allbut != 'field'; - $group = views_ui_render_section($form['field'], array('name', 'label', 'handler', 'options', 'sortable', 'defaultsort'), array(t('Name'), t('Label'), t('Handler'), t('Option'), t('Sortable'), t('Default Sort')), 'fields', $collapsed); + $group = views_ui_render_section($form['field'], array('name', 'label', 'handler', 'options', 'sortable', 'defaultsort','editable'), array(t('Name'), t('Label'), t('Handler'), t('Option'), t('Sortable'), t('Default Sort'),t('Editable')), 'fields', $collapsed); $group .= views_ui_render_section_add($form['field']['add'], array('id', 'button'), t('Add Field')); $group .= '

'. t('Fields are only meaningful with List view and Table View; they allow you to choose which fields are presented and in what order.') .'

'; @@ -2001,6 +2006,9 @@ function views_create_view_code($vid) { if ($field['defaultsort']) { $output .= " 'defaultsort' => " . var_export($field['defaultsort'], true) . ",\n"; } + if ($field['editable']) { + $output .= " 'editable' => " . var_export($field['editable'], true) . ",\n"; + } if ($field['options']) { $output .= " 'options' => " . var_export($field['options'], true) . ",\n"; }