Mercurial > defr > drupal > scald > mee
diff mee.module @ 14:50a57b1517cb
Fully working MEE, with Ressource Manager & all
| author | Franck Deroche <franck@defr.org> |
|---|---|
| date | Fri, 18 Sep 2009 15:18:53 +0200 |
| parents | 842d89897cb4 |
| children | a3d780c2979a |
line wrap: on
line diff
--- a/mee.module Mon Jun 08 18:33:19 2009 +0200 +++ b/mee.module Fri Sep 18 15:18:53 2009 +0200 @@ -24,11 +24,13 @@ ); $scald_config = variable_get('scald_config', 0); - foreach ($scald_config->contexts as $context => $details) { - $theme['mee_formatter_'. $context] = array( - 'arguments' => array('element' => NULL), - 'function' => 'theme_mee_context_formatter', - ); + if(!empty($scald_config->contexts)) { + foreach ($scald_config->contexts as $context => $details) { + $theme['mee_formatter_'. $context] = array( + 'arguments' => array('element' => NULL), + 'function' => 'theme_mee_context_formatter', + ); + } } return $theme; } @@ -109,19 +111,25 @@ switch ($op) { case 'presave': foreach ($items as $delta => &$item) { - if (!empty($item['mee']['value'])) { - $item['mee']['value'] = scald_rendered_to_sas($item['mee']['value']); + // Put everything in the ['mee'] namespace back into the array. + // This let CCK store the value and short fields natively. + if (is_array($item['mee'])) { + foreach ($item['mee'] as $k => $v) { + $items[$delta][$k] = $v; + } + } + if (!empty($item['value']) && variable_get('mee_store_sas', FALSE)) { + $item['value'] = scald_rendered_to_sas($item['value']); } } break; // end 'submit' case 'insert': foreach ($items as $delta => $item) { - // Let CCK store the value and short fields - $items[$delta]['value'] = $item['mee']['value']; - $items[$delta]['short'] = $item['mee']['short']; // Process the value and generate an atom - $scald_included = scald_included($item['mee']['value']); + $sas = scald_rendered_to_sas($item['value']); + $scald_included = scald_included($sas); + $sids = array_unique($scald_included); $temp_atom = new stdClass; $temp_atom->type = 'composite'; @@ -131,25 +139,49 @@ $temp_atom->title = $node->title . ' - ' . $field['widget']['label'] . ' (#' . $delta . ')'; $temp_atom->authors = array(scald_uid_to_aid($node->uid)); $temp_atom->relationships = empty($scald_included) ? array() : array('includes' => $scald_included); - + $sid = scald_register_atom($temp_atom); - // Short content - $short = $item['mee']['short']; - // TODO: Store the short content value + // Ressource manager associations - foreach ($item['mee']['ressource_manager'] as $sid => $ressource) { - // TODO: Store the assocation + if (empty($item['ressource_manager'])) { + _mee_load_ressources($node, $field, $item); + } + $separator = $item['ressource_manager'][0]['weight']; + foreach ($sids as $sid) { + $ressource = $item['ressource_manager'][$sid]; + $weight = $ressource['weight'] - $separator; + $required = $ressource['required']; + $query = "INSERT into {mee_ressources} (content_nid, atom_sid, field, weight, required) VALUES (%d, %d, '%s', %d, %d)"; + db_query($query, $node->nid, $sid, $field['field_name'], $weight, $required); } } break; // end 'insert' case 'update': foreach ($items as $delta => $item) { - // Let CCK store the value and short fields - $items[$delta]['value'] = $item['mee']['value']; - $items[$delta]['short'] = $item['mee']['short']; // Process the value - $scald_included = scald_included($item['mee']['value']); + $sas = scald_rendered_to_sas($item['value']); + $scald_included = scald_included($sas); + $sids = array_unique($scald_included); + + // Update ressources weight + // In fact, we'll delete all the associations and recreate afterwards + // the needed one, to be sure that new ressources are correctly + // registered, and that no longer used one are removed. + if (!is_array($item['ressource_manager'])) { + _mee_load_ressources($node, $field, $item); + } + db_query("DELETE FROM {mee_ressources} WHERE content_nid=%d AND field='%s'", $node->nid, $field['field_name']); + // We'll normalize the weight, putting our separator at 0. + $separator = $item['ressource_manager'][0]['weight']; + foreach ($sids as $sid) { + $ressource = $item['ressource_manager'][$sid]; + $required = $ressource['required']; + $weight = $ressource['weight'] - $separator; + // insert in the table + $query = "INSERT into {mee_ressources} (content_nid, atom_sid, field, weight, required) VALUES (%d, %d, '%s', %d, %d)"; + db_query($query, $node->nid, $sid, $field['field_name'], $weight, $required); + } // @@@TODO: Handle failure of fetch $atom = scald_fetch(scald_search(array('base_id' => $node->nid . ':' . $delta), FALSE, TRUE)); @@ -166,16 +198,20 @@ foreach ($items as $delta => $item) { scald_unregister_atom(scald_search(array('base_id' => $node->nid . ':' . $delta), FALSE, TRUE)); } + + // Delete all ressources associations for this field + $query = "DELETE FROM {mee_ressources} WHERE content_nid = %d AND field = '%s'"; + db_query($query, $node->nid, $field['field_name']); break; // end 'delete' case 'sanitize': foreach ($items as $delta => $item) { if (!empty($field['mee_processing'])) { $check = is_null($node) || (isset($node->build_mode) && $node->build_mode == NODE_BUILD_PREVIEW); - $text = isset($item['mee']['value']) ? check_markup($item['mee']['value'], $item['format'], $check) : ''; + $text = isset($item['value']) ? check_markup($item['value'], $item['format'], $check) : ''; } else { - $text = check_plain($item['mee']['value']); + $text = check_plain($item['value']); } $items[$delta]['safe'] = $text; } @@ -187,7 +223,7 @@ * Implementation of hook_content_is_empty(). */ function mee_content_is_empty($item, $field) { - if (empty($item['mee']['value']) && (string)$item['mee']['value'] !== '0') { + if (empty($item['value']) && (string)$item['value'] !== '0') { return TRUE; } return FALSE; @@ -220,6 +256,30 @@ } function theme_mee_formatter_default($element) { + // What's stored is exactly what the user entered, and not the SAS + // representation. In general, that's that we want to output, *but* + // we should also check that the atom is still available... And replace + // it if it isn't. + if (!variable_get('mee_store_sas', FALSE)) { + $sas = scald_rendered_to_sas($element['#item']['value']); + $included = scald_included($sas); + $altered = FALSE; + foreach($included as $sid) { + $atom = scald_fetch($sid); + if (!scald_action_permitted($atom, 'view')) { + $altered = TRUE; + $replace = scald_scald_render($atom, 'no-access'); + $element['#item']['value'] = preg_replace( + "/<!--(\s*)scald=$sid(.*)END scald=$sid(\s*)-->/sU", + scald_scald_render($atom, 'no-access'), + $element['#item']['value'] + ); + } + } + if ($altered) { + $element['#item']['safe'] = check_markup($element['#item']['value']); + } + } return scald_sas_to_rendered($element['#item']['safe']); } @@ -359,7 +419,6 @@ function mee_textarea_process($element, $edit, $form_state, $form) { drupal_add_css(drupal_get_path('module', 'mee') .'/css/mee.css'); drupal_add_js(drupal_get_path('module', 'mee') .'/mee.js'); - $element['mee'] = array( '#type' => 'markup', '#prefix' => '<div class="mee-wrap-editor-library">', @@ -369,22 +428,68 @@ $field = $form['#field_info'][$element['#field_name']]; $field_key = $element['#columns'][0]; $element['mee']['ressource_manager'] = array( - '#type' => 'markup', + '#type' => 'markup', '#weight' => 0.5, - '#theme' => 'mee_ressource_manager' + '#theme' => 'mee_ressource_manager' ); + + + if (!isset($element['#value']['mee']['ressource_manager'])) { + $element['#value']['mee']['ressource_manager'] = array(); + // Restore/Generate the associated ressources in a proper order + $query = "SELECT * FROM {mee_ressources} WHERE content_nid=%d AND field='%s' ORDER BY weight ASC"; + $result = db_query($query, $form['nid']['#value'], $element['#field_name']); + while ($item = db_fetch_object($result)) { + $element['#value']['mee']['ressource_manager'][$item->atom_sid] = (array)$item; + } + $element['#value']['mee']['ressource_manager'][0] = array('weight' => 0); + } + + foreach($element['#value']['mee']['ressource_manager'] as $sid => $item) { + $atom = scald_fetch($sid); + $title = $atom->title; + + $element['mee']['ressource_manager'][$sid] = array( + 'title' => array( + '#type' => 'markup', + '#value' => $title, + ), + 'required' => array( + '#type' => 'select', + '#options' => array(t('Optional'), t('Required')), + '#default_value' => $item['required'] + ), + 'weight' => array( + '#type' => 'weight', + '#default_value' => $item['weight'], + ), + '#weight' => $item['weight'] + ); + } + + // And now we add the separator $element['mee']['ressource_manager'][0] = array( 'title' => array( '#type' => 'markup', - '#value' => 'Lorem ipsum' + '#value' => t('< Primaire / Secondaire >'), + ), + 'required' => array( + '#type' => 'markup', + '#value' => '-' ), 'weight' => array( - '#type' => 'weight', - ) + '#type' => 'weight', + '#prefix' => '<div class="mee-rm-separator">', + '#suffix' => '</div>' + ), + '#weight' => $element['#value']['mee']['ressource_manager'][0]['weight'] ); + if ($element['#value'][$field_key]) { + $element['#value']['mee'][$field_key] = $element['#value'][$field_key]; + } $element['mee'][$field_key] = array( '#type' => 'textarea', - '#default_value' => isset($element['#value'][$field_key]) ? $element['#value'][$field_key] : NULL, + '#default_value' => isset($element['#value']['mee'][$field_key]) ? $element['#value']['mee'][$field_key] : NULL, '#rows' => !empty($field['widget']['rows']) ? $field['widget']['rows'] : 10, '#weight' => 0, // The following values were set by the content module and need @@ -449,13 +554,14 @@ $id = 'mee-ressource-manager-'. $count; drupal_add_tabledrag($id, 'order', 'sibling', 'mee-rm-weight'); $count++; - $header = array('', t('Title'), t('Weight')); + $header = array('', t('Title'), t('Required'), t('Weight')); $rows = array(); foreach(element_children($form) as $key) { $form[$key]['weight']['#attributes']['class'] = 'mee-rm-weight'; $row = array(''); $row[] = drupal_render($form[$key]['title']); + $row[] = drupal_render($form[$key]['required']); $row[] = drupal_render($form[$key]['weight']); $rows[] = array('data' => $row, 'class' => 'draggable'); } @@ -469,8 +575,22 @@ return $output; } - - +function _mee_load_ressources($node, $field, &$item) { + $results = db_query(" + SELECT atom_sid, weight + FROM {mee_ressources} + WHERE content_nid=%d AND field='%s'", + array( + ':nid' => $node->nid, + ':field' => $field['field_name'] + ) + ); + $item['ressource_manager'] = array(); + while($r = db_fetch_object($results)) { + $item['ressource_manager'][$r->atom_sid] = array('weight' => $r->weight); + } + $item['ressource_manager'][0] = array('weight' => 0); +} /*******************************************************************************
