Drupal modules for browsing and managing Fedora-based digital repositories.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

289 lines
9.1 KiB

<?php
// $Id$
// this is a bit of a hack. It iterates through the
// form and assigns a dummy value to any field in the $post
// data that is marked as #required. This is so that the
// AHAH method can still function with required fields that
// are first passed to the core form validation function.
function _dummy_post_info($form, $post, $key = '') {
$children = element_children($form);
if (count($children) > 0) {
foreach ($children as $key) {
$post = _dummy_post_info($form[$key], $post, $key);
}
}
if ($key!='' && isset($form['#required']) && $form['#required'] == TRUE && trim($post[$key]) == '') {
$post[$key] = 'not empty';
}
return $post;
}
function _ife_find_people_element($form, &$keys = array()) {
if (isset($form['#type']) && $form['#type'] == 'people') {
return $form['people'];
}
$children = element_children($form);
foreach ($children as $key) {
$found = _ife_find_people_element($form[$key], $keys);
if ($found !== FALSE) {
$keys[] = $key;
return $found;
}
}
return FALSE;
}
function ife_people_ahah() {
if (!isset($_POST['form_build_id']))
return;
$form_state = array('storage' => NULL, 'submitted' => FALSE);
$form_build_id = $_POST['form_build_id'];
$form = form_get_cache($form_build_id, $form_state);
$args = $form['#parameters'];
$form_id = array_shift($args);
$form['#post'] = $_POST;
$form['#redirect'] = FALSE;
$form['#programmed'] = FALSE;
$_POST = _dummy_post_info($form, $_POST);
$form_state['post'] = $_POST;
$form['#post'] = $_POST;
drupal_process_form($form_id, $form, $form_state);
// ob_start(); echo '<pre>'; echo $_POST['form_build_id']."\n"; var_dump($form_state); echo '</pre>'; $dump = ob_get_contents(); ob_end_clean();
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
$qt_form = _ife_find_people_element($form);
unset($qt_form['#prefix'], $qt_form['#suffix']); // Prevent duplicate wrappers.
$javascript = drupal_add_js(NULL, NULL, 'header');
drupal_json(array(
'status' => TRUE,
'data' => $dump . theme('status_messages') . drupal_render($qt_form),
'settings' => call_user_func_array('array_merge_recursive', $javascript['setting']),
));
}
/**
* Submit handler for the "Remove Person" button.
*/
function ife_remove_person_submit($form, &$form_state) {
// Get the tab delta for the clicked button.
$delta = $form_state['clicked_button']['#parents'][2];
$keys=array();
$qt_form = _ife_find_people_element($form, $keys);
$peopleVals = &$form_state['values'];
while (count($keys) > 0) {
$key = array_pop($keys);
if (isset($peopleVals[$key])) {
$peopleVals = &$peopleVals[$key];
}
}
$people = array();
$i = 0;
foreach ($peopleVals['people'] as $key => $val) {
if ($key != $delta) {
$people[] = $val;
}
$i++;
}
// ob_start(); var_dump($form_state['clicked_button']['#parents'][1]); var_dump($people); $dump = ob_get_contents(); ob_end_clean();
// watchdog('people_field','<pre>'.$dump.'</pre>',array(),WATCHDOG_NOTICE);
unset($form_state['submit_handlers']);
form_execute_handlers('submit', $form, $form_state);
$form_state['storage']['people'] = $people;
//$form_state['rebuild'] = TRUE;
}
/**
* Submit handler for the "Add Person" button.
*/
function ife_add_person_submit($form, &$form_state) {
$people = array();
$keys = array();
$qt_form = _ife_find_people_element($form, $keys);
$peopleVals = &$form_state['values'];
while (count($keys) > 0) {
$key = array_pop($keys);
if (isset($peopleVals[$key])) {
$peopleVals = &$peopleVals[$key];
}
}
if (!is_array($peopleVals['people']))
$peopleVals['people'] = array();
foreach ($peopleVals['people'] as $val) {
$people[] = $val;
}
//only add new person if we are not adding from repository.
if (!isset($form_state['post']['add_from_repository']) || trim($form_state['post']['add_from_repository']) == '') {
$people[] = array('name' => '', 'date'=>'', 'role' => '', 'subject' => '');
}
unset($form_state['submit_handlers']);
form_execute_handlers('submit', $form, $form_state);
$form_state['storage']['people'] = $people;
// $form_state['rebuild'] = TRUE;
}
/**
* Submit handler for the "Add Person" button.
*/
function ife_add_org_submit($form, &$form_state) {
$people = array();
$keys = array();
$qt_form = _ife_find_people_element($form, $keys);
$peopleVals = &$form_state['values'];
while (count($keys) > 0) {
$key = array_pop($keys);
if (isset($peopleVals[$key])) {
$peopleVals = &$peopleVals[$key];
}
}
if (!is_array($peopleVals['people']))
$peopleVals['people'] = array();
foreach ($peopleVals['people'] as $val) {
$people[]=$val;
}
$people[] = array('role' => '', 'organization' => '');
unset($form_state['submit_handlers']);
form_execute_handlers('submit', $form, $form_state);
$form_state['storage']['people'] = $people;
//$form_state['rebuild'] = TRUE;
}
/**
* Submit handler for the "Add Person" button.
*/
function ife_add_conf_submit($form, &$form_state) {
$people = array();
$keys=array();
$qt_form = _ife_find_people_element($form, $keys);
$peopleVals = &$form_state['values'];
while (count($keys) > 0) {
$key = array_pop($keys);
if (isset($peopleVals[$key])) {
$peopleVals=&$peopleVals[$key];
}
}
if (!is_array($peopleVals['people']))
$peopleVals['people'] = array();
foreach ($peopleVals['people'] as $val) {
$people[] = $val;
}
$people[] = array('role' => '', 'conference' => '', 'subject' => '');
unset($form_state['submit_handlers']);
form_execute_handlers('submit', $form, $form_state);
$form_state['storage']['people'] = $people;
//$form_state['rebuild'] = TRUE;
}
function theme_people($element) {
drupal_add_js(drupal_get_path('module', 'islandora_form_elements') .'/js/people_ahah.js');
if (!empty($element['#collapsible'])) {
drupal_add_js('misc/collapse.js');
if (!isset($element['#attributes']['class'])) {
$element['#attributes']['class'] = '';
}
$element['#attributes']['class'] .= ' collapsible';
if (!empty($element['#collapsed'])) {
$element['#attributes']['class'] .= ' collapsed';
}
}
return '<fieldset'. drupal_attributes($element['#attributes']) .'>'. ($element['#title'] ? '<legend>'. $element['#title'] .'</legend>' : '') . (isset($element['#description']) && $element['#description'] ? '<div class="description">'. $element['#description'] .'</div>' : '') . (!empty($element['#children']) ? $element['#children'] : '') . "</fieldset>\n";
}
function theme_people_items($form) {
$rows = array();
$headers = array(
t('Entity Name'),
t('Role'),
t('Operations'),
);
foreach (element_children($form) as $key) {
if (isset($form[$key]['organization'])) {
$form[$key]['weight']['#attributes']['class'] = 'ife-people-weight';
// Build the table row.
$row = array(
'data' => array(
array('data' => drupal_render($form[$key]['organization']), 'class' => 'ife-person-name container-inline'),
array('data' => drupal_render($form[$key]['role']).drupal_render($form[$key]['subject']), 'class' => 'ife-person-role'),
array('data' => drupal_render($form[$key]['remove']), 'class' => 'ife-person-remove'),
),
);
}
elseif (isset($form[$key]['conference'])) {
$form[$key]['weight']['#attributes']['class'] = 'ife-people-weight';
// Build the table row.
$row = array(
'data' => array(
array('data' => drupal_render($form[$key]['conference']).'<br clear="all"/>'. drupal_render($form[$key]['date']), 'class' => 'ife-person-name container-inline' ),
array('data' => drupal_render($form[$key]['role']).drupal_render($form[$key]['subject']), 'class' => 'ife-person-role'),
array('data' => drupal_render($form[$key]['remove']), 'class' => 'ife-person-remove'),
),
);
}
else {
$form[$key]['weight']['#attributes']['class'] = 'ife-people-weight';
// Build the table row.
$row = array(
'data' => array(
array('data' => drupal_render($form[$key]['name']) .'<br clear="all"/>'. drupal_render($form[$key]['date']), 'class' => 'ife-person-name container-inline'),
array('data' => drupal_render($form[$key]['role']).drupal_render($form[$key]['subject']), 'class' => 'ife-person-role'),
array('data' => drupal_render($form[$key]['remove']), 'class' => 'ife-person-remove'),
),
);
}
// Add additional attributes to the row, such as a class for this row.
if (isset($form[$key]['#attributes'])) {
$row = array_merge($row, $form[$key]['#attributes']);
}
$rows[] = $row;
}
$output = theme('table', $headers, $rows, array('id' => 'ife-peoplelist-table'));
$output .= drupal_render($form);
// Add our JS file, which has some Drupal core JS overrides, and ensures ahah behaviours get re-attached
drupal_add_css(drupal_get_path('module', 'islandora_form_elements') .'/css/people.css');
return $output;
}