'editablefields_html',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
'title' => 'ajax form',
);
$items['editablefields_submit'] = array(
'page callback' => 'editablefields_submit',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
'title' => 'ajax submit',
);
return $items;
}
/**
* Implementation of hook_theme().
*/
function editablefields_theme() {
return array(
'editablefields_formatter_editable' => array(
'arguments' => array('element' => NULL),
'function' => 'theme_editablefields_formatter_editable',
),
'editablefields_formatter_clicktoedit' => array(
'arguments' => array('element' => NULL),
'function' => 'theme_editablefields_formatter_editable',
),
);
}
/**
* Implementation of hook_field_formatter_info().
*/
function editablefields_field_formatter_info() {
return array(
'editable' => array(
'label' => t('Editable'),
'field types' => array_keys(_content_field_types()),
),
'clicktoedit' => array(
'label' => t('Click to Edit'),
'field types' => array_keys(_content_field_types()),
),
);
}
/**
* Theme the editable field.
*/
function theme_editablefields_formatter_editable($element) {
static $js_ready;
$field_name = $element['#field_name'];
$field = content_fields($field_name);
$node = node_load($element['#node']->nid);
$delta = $element['#item']['#delta'];
if (content_handle('widget', 'multiple values', $field) == CONTENT_HANDLE_CORE) {
}
// See if access to this form element is restricted,
// if so, skip widget processing and just set the value.
if (!node_access('update',$node) || !content_access('edit', $field)) {
// can't edit
$formatter_name = 'default';
if ($formatter = _content_get_formatter($formatter_name, $field['type'])) {
$theme = $formatter['module'] .'_formatter_'. $formatter_name;
return theme($theme, $element);
}
}
else {
$formatter_name = 'default';
if ($formatter = _content_get_formatter($formatter_name, $field['type'])) {
if (!isset($js_ready)) {
$js_ready = TRUE;
drupal_add_js('misc/jquery.form.js');
drupal_add_js(drupal_get_path('module', 'editablefields') .'/editablefields.js');
drupal_add_css(drupal_get_path('module', 'editablefields') .'/editablefields.css');
$settings = array(
'url_html' => url('editablefields_html', array('absolute' => TRUE)),
'url_submit' => url('editablefields_submit', array('absolute' => TRUE)),
'clicktoedit_message' => '
'. t('[edit]') .'
',
);
drupal_add_js(array('editablefields' => $settings), 'setting');
}
$theme = $formatter['module'] .'_formatter_'. $formatter_name;
$class="editablefields";
if ($element['#formatter'] == 'clicktoedit') {
$class .=" clicktoedit";
}
// CORE handling shoudl have a div on each,
// MODULE handling should have a div surounding all elements (treat it as
// one field) (So, we'll arrainge for the JS to remove the rest!)
if (content_handle('widget', 'multiple values', $field) != CONTENT_HANDLE_CORE) {
if ($delta!=0) {
$class="editablefields editablefields_REMOVE";
}
}
$pre='';
$post='
';
return $pre . theme($theme, $element) . $post;
}
}
}
/**
* Implementation of hook_forms().
*/
function editablefields_forms() {
$forms = array();
$forms['editablefields_form'] = array(
'callback' => 'editablefields_form_builder',
// 'callback arguments' => array('node', 'field_name'),
);
return $forms;
}
/**
* Form builder callback.
*/
function editablefields_form_builder(&$form_state, $node, $field_name, $delta) {
$field = content_fields($field_name);
$form = array('#node' => $node);
// $form_state = array('values' => array($field['field_name'] => $default_value));
module_load_include('inc', 'content', 'includes/content.node_form');
$form['#field_info'] = array($field['field_name'] => $field);
$form = content_field_form($form, $form_state, $field, $delta);
unset($form[$field_name]['#title']);
if (is_array($form[$field_name][0]) && !is_array($form[$field_name][1])) {
unset($form[$field_name][0]['#title']);
}
$form['#field_info'] = array($field['field_name'] => $field);
return $form;
}
/**
* Menu callback: ajax form.
*/
function editablefields_html() {
$nid = arg(1);
$field_name = arg(2);
$delta=arg(3);
$node = node_load($nid);
if (node_access('update', $node)) {
// $html = _editablefields_create_form($node, $field_name);
$html = drupal_get_form('editablefields_form', $node, $field_name, $delta);
$object = new stdClass();
$object->content = $html;
// Register the JavaScript callback for this module.
$object->__callbacks = array();
// Allow other modules to extend the data returned.
drupal_alter('ajax_data', $object, 'editablefields', $html);
drupal_json($object);
}
else {
drupal_not_found();
}
exit();
}
/**
* Menu callback: ajax submit.
*/
function editablefields_submit() {
$nid = $_POST['nid'];
$field_name = $_POST['field'];
$delta=$_POST['delta'];
$node = node_load($nid);
if (node_access('update', $node)) {
if (!isset($_POST[$field_name])) {
$_POST[$field_name] = array();
}
$form_state = array('values' => $_POST);
if (is_array($node->{$field_name})) {
drupal_execute('editablefields_form', $form_state, $node, $field_name, $delta);
$err=drupal_get_messages();
if (count($err)>0) {
drupal_set_header('HTTP/1.1 404 Not Found');
// format the error message suitable for a popup window in simple text.
foreach ($err as $type=>$messages) {
foreach ($messages as $message) {
print $type .' : '. $message ."\n";
}
}
exit();
}
$field = content_fields($field_name);
if (content_handle('widget', 'multiple values', $field) == CONTENT_HANDLE_CORE) {
if ($node->{$field_name}[$delta]!=$form_state['values'][$field_name][0]) {
$node->{$field_name}[$delta]=$form_state['values'][$field_name][0];
node_save($node);
}
} else {
if ($node->{$field_name}!=$form_state['values'][$field_name]) {
$node->{$field_name}=$form_state['values'][$field_name];
node_save($node);
}
}
// make sure sensible headers etc are sent...
drupal_set_header('Content-Type: text; charset=utf-8');
}
else {
drupal_set_header('HTTP/1.1 404 Not Found');
print t('No field found, of name: %field', array('%field' => $field_name));
}
}
else {
drupal_set_header('HTTP/1.1 404 Not Found');
print t('No write permissions for %field', array('%field' => $field_name));
}
exit();
}