Mercurial > defr > drupal > scald > mee
changeset 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 | 7bb375e191b1 |
| files | css/mee.css mee.install mee.js mee.module |
| diffstat | 4 files changed, 221 insertions(+), 44 deletions(-) [+] |
line wrap: on
line diff
--- a/css/mee.css Mon Jun 08 18:33:19 2009 +0200 +++ b/css/mee.css Fri Sep 18 15:18:53 2009 +0200 @@ -2,10 +2,10 @@ float: left; width: 100%; } -.mee-wrap-editor-library .form-item, table.mee-ressource-manager, .mee-filter-form { +.mee-wrap-editor-library .form-item, table.mee-ressource-manager, .mee-filter-form, .dnd-fields-wrapper { width: 73%; } -.mee-filter-form .form-item { +.mee-filter-form .form-item, .mee-wrap-editor-library .dnd-fields-wrapper { width: 100%; } .mee-filter-form .form-item .tips li { @@ -22,7 +22,7 @@ display: inline; white-space: normal; } -.mee-wrap-editor-library .dnd-library-wrapper { +.dnd-library-wrapper { float: right; width: 25%; } @@ -170,6 +170,15 @@ font-size: .875em; margin-bottom: .5em; } +.sdl-preview-item dt { + font-weight: bold; +} +.sdl-preview-item dd { + margin-left: 1em; +} +.sdl-preview-item div.image { + float: left; +} /* Fix for Garland */ #center .dnd-library-wrapper form { margin: 0;
--- a/mee.install Mon Jun 08 18:33:19 2009 +0200 +++ b/mee.install Fri Sep 18 15:18:53 2009 +0200 @@ -8,6 +8,7 @@ function mee_install() { drupal_load('module', 'content'); content_notify('install', 'mee'); + drupal_install_schema('mee'); } /** @@ -16,6 +17,7 @@ function mee_uninstall() { drupal_load('module', 'content'); content_notify('uninstall', 'mee'); + drupal_uninstall_schema('mee'); } /** @@ -25,3 +27,36 @@ drupal_load('module', 'content'); content_notify('disable', 'mee'); } + +/** + * Add separate column for the required status + */ +function mee_update_6001() { + $ret = array(); + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + $ret[] = update_sql("ALTER TABLE {mee_ressources} ADD required INT NOT NULL DEFAULT 0"); + break; + } + return $ret; +} + + +/** + * Implementation of hook_schema(). + */ + function mee_schema() { + $schema['mee_ressources'] = array( + 'fields' => array( + 'content_nid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0), + 'atom_sid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0), + 'field' => array('type' => 'varchar', 'length' => 31, 'not null' => TRUE, 'default' => ''), + 'weight' => array('type' => 'int', 'not null' => TRUE, 'default' => 0), + 'required' => array('type' => 'int', 'not null' => TRUE, 'default' => 0), + ), + 'primary key' => array('content_nid', 'atom_sid'), + ); + + return $schema; + }
--- a/mee.js Mon Jun 08 18:33:19 2009 +0200 +++ b/mee.js Fri Sep 18 15:18:53 2009 +0200 @@ -26,7 +26,8 @@ .find('table.mee-ressource-manager') .each(function(i) { $(this).append(Drupal.mee.generate( - rep.title, + data.representation_id, + rep, Drupal.tableDrag[this.id] )); }); @@ -37,17 +38,29 @@ detach: function(e, data) { }, - generate: function(title, tableDrag) { - var $select = $("<select />"), $tr = $('<tr />'), $td = $("<td />"), parity; + generate: function(id, representation, tableDrag) { + var $weight = $("<select />"), $tr = $('<tr />'), $td = $("<td />"), parity; + var separator = $(tableDrag.table).find('div.mee-rm-separator select')[0]; + var wn = separator.name.replace(/\[0\]\[weight\]$/, '[' + id +'][weight]'); + var $required = $("<select />") + .attr('name', wn.replace(/\[weight\]$/, '[required]')) + .append("<option value='0'>"+ Drupal.t('Optional') +"</option>") + .append("<option value='1'>"+ Drupal.t('Required') +"</option>") + .val(representation.meta.action); + // If this ressource is already in the Ressource Manager, don't add a line + if ($('select[name="'+ wn +'"]', tableDrag.table).length) { + return ''; + } $tr .addClass('draggable') .append($('<td></td>')) - .append($('<td></td>').append(title)); + .append($('<td></td>').append(representation.title)) + .append($('<td></td>').append($required)); for (var i = -10; i <= 10; i++) { - $select.append("<option>"+ i +"</option>"); + $weight.append("<option>"+ i +"</option>"); } - $select.val(0).addClass('mee-rm-weight'); - $td.append($select); + $weight.val(0).addClass('mee-rm-weight').attr('name', wn); + $td.append($weight); $tr.append($td); parity = $(tableDrag.table).find('tr').size() % 2 ? 'odd' : 'even'; $tr.addClass(parity);
--- 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); +} /*******************************************************************************
