'. t('Create dynamic translation languages lists') .'
'; return $output; } } /** * Implementation of hook_node_info(). */ function languageform_node_info() { return array( 'languageform' => array( 'name' => t('Languageform'), 'module' => 'languageform', 'description' => t('A list of translation languages.'), 'title_label' => t('Languageform title'), 'has_body' => FALSE, ) ); } /** * hook_menu - incremental update needs its own entry point */ function languageform_menu($may_cache) { $items = array(); if ($may_cache) { $items[] = array( 'path' => 'languageform/languageform_update_js', 'callback' => '_languageform_update_js', 'access' => user_access('create translation languages lists'), 'type' => MENU_CALLBACK, ); } return $items; } /** * Implementation of hook_access(). */ function languageform_access($op, $node) { global $user; if ($op == 'create') { return user_access('create translation languages lists'); } if ($op == 'update' || $op == 'delete') { return (user_access('edit translation languages lists') && ($user->uid == $node->uid)); } } /** * Implementation of hook_perm(). */ function languageform_perm() { return array('create translation languages lists', 'edit translation languages lists'); } function languageform_form ($node) { // drupal_set_message( "poll_form: node: " . count($node) . ", form_values: " . count( $form_values ) ); $type = node_get_types('type', $node); $form['title'] = array( '#type' => 'textfield', '#title' => check_plain($type->title_label), '#required' => TRUE, '#default_value' => $node->title, '#weight' => -1, ); // items wrapper $form['items'] = array ( '#type' => 'item', '#theme' => 'languageform_items_subform', '#ahah_bindings' => array( array ( 'selector' => 'input.languageform_item_remove', 'event' => 'click', 'wrapper' => 'languageform_items_wrapper', 'path' => 'languageform/languageform_update_js', ), array ( 'selector' => 'select.languageform_item_weight', 'event' => 'change', 'wrapper' => 'languageform_items_wrapper', 'path' => 'languageform/languageform_update_js', ), ), ); $form['#redirect'] = 'usernode'; if( module_exists ('ahah_forms') ) { $form['items'] += dynamic_subform_get_embedded('languageform_node_form', 'languageform_items_subform', $node); } else { // for non-ahah $form['items'] += languageform_items_subform ($node); } return $form; } /** * @node: initial values coming in from db * @form_values: sanitized posted form values * @pass: set by dynamic_subform_get: * validate_pass: building to sanitize $_POST - never use #value. * render_pass: building to render to html - ok to use #value. */ function languageform_items_subform($node, $form_values=null, $pass=null) { if( is_array( $node ) ) drupal_set_message( "languageform_items_subform: missing node!"); if( !empty($form_values) && !is_array($form_values)) drupal_set_message( "languageform_items_subform: bad form_values" ); // get the pre-existing items - can be in either $edit or $node $items = _languageform_extract_items($form_values, $node); // drupal_set_message( "Extracted item Count: " . count($items) ); // process add and remove commands - modifies $items $items = _languageform_process_commands($form_values, $items); // drupal_set_message( "After commands item Count: " . count($items) ); // expand the $items array into form elements - modifies $element $languageform = _languageform_expand_items($items); // add a control block for adding new items - modifies $element // drupal_set_message( "Add controls " . print_r( $form_values, true ) .' : '. print_r( $multistep, true )); $languageform += _languageform_add_control($form_values, $pass); return $languageform; } /** * Extract the items from the form_values array or * If post is empty, we may be doing an edit -> load into node * Or fresh add with no languageforms */ function _languageform_extract_items(&$edit, $node) { $items = array(); if( is_array( $edit['items'] ) ) { $items = $edit['items']; } elseif( is_array($node->items) ) { // languageforms have been loaded into node (by apinode:load) $items = $node->items; $edit['next_id'] = $node->next_id; } return $items; } /** * Modify the items array based on commands in the $edit */ function _languageform_process_commands( &$edit, $items ) { if( is_array($edit) && count($edit) > 0 ) { // process the potention addition // Text displayed inside Button (must be the same as on line 289 !!!) if( $edit['op'] == t( 'Add New Languages' ) ) { $new_item = $edit['new_item']; /* start of modified OE */ if( $new_item['lang1'] && $new_item['lang2'] ) { // we are good to do add /* end of modified OE */ $item_id = $edit['next_id']; // get distinct id for item $edit['next_id'] = $edit['next_id'] + 1; $items[$item_id] = $new_item; // remove from params, so it doesn't show up on the form (consume), but only on successful add unset( $edit['new_item'] ); } } // now process the removes foreach( $items as $item_id => $item ) { // drupal_set_message( "ckecking item $item_id : ". $item['remove'] ); if( isset( $item['remove'] ) && $item['remove'] == 1 ) { unset( $items[$item_id] ); } } } return $items; } /** * Expand the items into form elements */ function _languageform_expand_items( $items ) { $element['items'] = array ( '#tree' => TRUE, '#id' => 'languageform_items', '#theme' => 'languageform_items', ); foreach( $items as $item_id => $item ) { $element['items'][$item_id] = array( '#tree' => TRUE, ); $element['items'][$item_id]['lang1'] = array( '#type' => 'textfield', '#default_value' => $item['lang1'], ); $element['items'][$item_id]['lang2'] = array( '#type' => 'textfield', '#default_value' => $item['lang2'], ); $element['items'][$item_id]['remove'] = array( '#type' => 'checkbox', '#default_value' => $item['remove'], '#attributes' => array( 'class' => 'languageform_item_remove' ), ); } return $element; } /** * control to add item to languageforms * @param $edit: values posted from the form * @param $pass: * validate_pass: building to sanitize $_POST - never use #value, only #default_value. * render_pass: building to render to html - ok to use #value. */ function _languageform_add_control($edit, $pass=null) { $element['new_item'] = array ( '#type' => 'fieldset', '#title' => t( 'Add Item' ), '#theme' => 'languageform_new_item_control', '#tree' => TRUE, ); $element['new_item']['lang1'] = array ( '#type' => 'textfield', // Title displayed on top of textfield '#title' => t( 'Source Language' ), '#size' => 40, '#maxlength' => 128, ); $element['new_item']['lang2'] = array ( '#type' => 'textfield', '#title' => t( 'Destination language' ), '#size' => 40, '#maxlength' => 128, ); if ($pass=='render_pass') { $element['new_item']['lang1']['#value'] = $edit['new_item']['lang1']; $element['new_item']['lang2']['#value'] = $edit['new_item']['lang2']; } $element['new_item']['add_item_button'] = array ( '#type' => 'button', '#value' => t( 'Add New Languages' ), '#id' => 'languageform_add_item_button', '#ahah_bindings' => array ( array( 'wrapper' => 'languageform_items_wrapper', 'event' => 'click', 'path' => 'languageform/languageform_update_js', ), ), ); $element['next_id'] = array( '#type' => 'hidden', '#value' => isset( $edit['next_id'] ) ? $edit['next_id'] : 0, ); return $element; } /** * Implementation of hook_init() * Check if the user already had created a node of type languageform. If yes, then link to the edit form instead. */ function languageform_init() { if ($_GET['q'] == 'node/add/'.variable_get('languageform_nodetype', 'languageform')) { if (($nid = languageform_foruser()) && user_access('create translation languages lists') ) { drupal_goto('node/'.$nid.'/edit'); } } } /** * Return node id of the languageform for a given user * * FALSE if user has no languageform node */ function languageform_foruser($uid = NULL){ if (is_null($uid)){ global $user; $uid = $user->uid; } return db_result(db_query("SELECT nid FROM {node} WHERE uid = %d AND type = '%s'", $uid, variable_get('languageform_nodetype', 'languageform'))); } /** * Implementation of hook_enable(). */ function languageform_enable() { if (module_exists('nodefamily')) { nodefamily_content_type_set_max('languageform', 1); } } // ************************************************************************************ // DATABASE INTERACTION FUNCTIONS // ************************************************************************************ function languageform_load($node) { // $ids = array(); $additions['items'] = array(); $result = db_query( 'SELECT item_id, lang1, lang2, torder ' . 'FROM {languagepairs} ' . 'WHERE nid = %d '. 'ORDER BY torder', $node->nid); while ($row = db_fetch_array($result)) { $item_id = $row['item_id']; $ids[] = $item_id; $additions['items'][$item_id] = array ( 'lang1' => $row['lang1'], 'lang2' => $row['lang2'], 'weight' => $row['torder'], ); } $additions['next_id'] = !empty($ids) ? max( $ids ) + 1 : 0; return $additions; } function languageform_update($node) { languageform_delete($node); languageform_insert($node); } function languageform_sort($a, $b) { if ($a['weight'] == $b['weight']) { return strcmp( $a['lang1'], $b['lang1'] ); return strcmp( $a['lang2'], $b['lang2'] ); } return ($a['weight'] < $b['weight']) ? -1 : 1; } function languageform_insert($node) { if( !empty( $node->items ) ) { uasort( $node->items, 'languageform_sort' ); foreach ($node->items as $item_id => $item) { if ( !empty($item['lang1']) && !empty($item['lang2'])) { db_query( "INSERT INTO {languagepairs} (nid, item_id, lang1, lang2, torder) ". "VALUES (%d, %d, '%s', '%s', %d)", $node->nid, $item_id, $item['lang1'], $item['lang2'], $i++); } } } } function languageform_delete($node) { db_query("DELETE FROM {languagepairs} WHERE nid = %d", $node->nid); } /** * Implementation of hook_nodeapi() * * - validate languageform node form to make sure that the user doesn't already * have one */ function languageform_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { if ($node->type != variable_get('languageform_nodetype', 'languageform')) return; switch ($op) { case 'validate': // This user already has a languageform node and this isn't it $account = user_load(array('name' => $node->name)); $nid = languageform_for_user($account->uid); if ($nid && ($nid != $node->nid)) { form_set_error('name', t('This user already has a @languageform. Edit it here or assign this entry to another user.', array('@languageform' => node_get_types('name', $node), '@link' => url('node/'.$nid.'/edit')))); } break; } } // ************************************************************************************ // THEMING FUNCTIONS // ************************************************************************************ function languageform_view(&$node, $teaser, $page, $block) { $output .= theme( 'languageform_items_view', $node->items ); $node->content['body'] = array( '#value' => $output, ); return $node; } /** Theme of the rendered table */ function theme_languageform_items_view($items) { if( !empty( $items ) ) { uasort( $items, 'languageform_sort' ); foreach ($items as $item_id => $item) { $row = array(); $row[] = $item['lang1']; $row[] = $item['lang2']; $rows[] = array( 'data' => $row, 'class' => 'sortableitem' ); } if( count($rows) > 0 ) { $header = array(t('Source Language'), t('Target Language')); $output .= theme('table', $header, $rows, array( 'class' => 'sortable' ) ); } return $output; } } function theme_languageform_items_subform($form) { $group = '