view dnd_test/dnd_test.module @ 24:4f58fa0a9a6d

Cleaned up some library behavior, changed editor representation cache to track a title and a body for representations, to allow a little more dynamic composition.
author David Eads <eads@chicagotech.org>
date Wed, 11 Mar 2009 01:47:57 -0500
parents a72403cfa9a8
children
line wrap: on
line source
<?php

/**
 * Implementation of hook_menu().
 */
function dnd_test_menu() {
  $items = array();
  $items['dnd-test/library'] = array(
    'title' => 'Drag and drop test library',
    'page callback' => 'dnd_test_library',
    'access arguments' => array('access dnd test library'),
  );
  return $items;
}

/**
 * Implementation of hook_perm().
 */
function dnd_test_perm() {
  return array('access dnd test library');
}

/**
 * Implementation of hook_form_alter().
 *
 * This demonstrates how to attach Drag and Drop to a given textarea.
 */
function dnd_test_form_alter(&$form, &$form_state) {
  if ($form['#id'] == 'node-form' && $form['type']['#value'] == 'page') {
    drupal_add_css(drupal_get_path('module', 'dnd_test') .'/dnd_test.css');
    $form['body_field']['body']['#dnd-enabled'] = TRUE;
    $form['body_field']['body']['#dnd-settings'] = array(
      'drop_selector' => '#edit-body-dnd-library .drop',
      'url' => 'dnd-test/library',
    );
    $form['body_field']['body']['#rows'] = 28;
  }
}

/**
 * Implementation of hook_theme().
 */
function dnd_test_theme() {
  return array(
    'dnd_editor_item'  => array(
      'arguments' => array('i' => NULL, 'size' => NULL),
      'template'  => 'dnd-editor-item',
    ),
    'dnd_library_item' => array(
      'arguments' => array('i' => NULL), 
      'template'  => 'dnd-library-item',
    ),
    'dnd_library_preview' => array(
      'arguments' => array('i' => NULL),
      'template'  => 'dnd-library-preview',
    ),
    'dnd_library_header' => array(
      'arguments' => array('page' => NULL),
      'template'  => 'dnd-library-header',
    ),
  );
}

/**
 * Page callback that returns some JSON
 */
function dnd_test_library() {
  $page = ($_GET['page']) ? $_GET['page'] : 1;
  $test_library = dnd_test_generate_library($page);
  return drupal_json(array(
    'header'  => theme('dnd_library_header', $page),
    'library' => $test_library['library'],
    'editor_representations' => $test_library['editor_representations'],
    'library_previews' => $test_library['library_previews'],
    'footer'  => '<div class="pager">'. l(t('1'), 'dnd-test/library') . ' '. l(t('2'), 'dnd-test/library', array('query' => array('page' => 2))) .'</div>',
  ));
}

/**
 * Create contrived output
 */
function dnd_test_generate_library($page = 1, $limit = 8) {
  $start = ($page * $limit) - ($limit); 
  $end   = $page * $limit;

  $library = '';
  $editor_representations = array();
  $library_previews = array();
  for ($i=$start + 1; $i < $end + 1; $i++) {
    $library .= theme('dnd_library_item', $i);
    $editor_representations += dnd_editor_items($i);
    $library_previews['dnd-test-'. $i] = theme('dnd_library_preview', $i);
  }
  return array(
    'library' => $library,
    'editor_representations' => $editor_representations,
    'library_previews' => $library_previews,
  );
}

/**
 * Theme wrapper that spins out multiple library representations for a given
 * editor representation.  This is because we want to demonstrate how to allow
 * for multiple versions (i.e. different sizes) of a single item
 */
function dnd_editor_items($i) {
  $item = array();
  foreach(array(t('S'), t('M'), t('L')) as $size) {
    $item[$i .'-'. $size] = array(
      'body' => theme('dnd_editor_item', $i, $size),
      'title' => 'Item '. $i .'-S',
    );
  }
  return $item;
}

/**
 * Completely contrived library preview theme function
 */
function template_preprocess_dnd_library_preview(&$variables) {
  template_preprocess_dnd_library_item($variables);

  $variables['id'] = 'dnd-preview-'. $variables['i'];
  $variables['image'] = '<img src="http://'. $_SERVER['HTTP_HOST'] . base_path() . drupal_get_path('module', 'dnd_test') .'/img/item-'. $variables['img_num'] .'-S.jpg" class="drop" width="125" height="94" />';

  $variables['description'] = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.';
}


/**
 * Completely contrived edit item theme function
 */
function template_preprocess_dnd_library_item(&$variables) {
  global $_SERVER;

  $i = $variables['i'];

  if ($i % 3 == 0) {
    $img = 3;
  }
  else if ($i % 2 == 0) {
    $img = 2;
  }
  else {
    $img = 1;
  }

  $variables['img_num'] = $img;
  $variables['id'] = 'dnd-test-'. $i;
  $variables['image'] = '<img src="http://'. $_SERVER['HTTP_HOST'] . base_path() . drupal_get_path('module', 'dnd_test') .'/img/item-'. $img .'-thumb.jpg?dnd_id='. $i .'-M" class="drop" />';
  $variables['title'] = t('Lorem Ipsum @count', array('@count' => $i));
  $variables['date'] = 'Feb 18 2009';
  $variables['author'] = 'David Eads';
  foreach(array(t('S'), t('M'), t('L')) as $size) {
    $sizes[] = '<img src="http://'. $_SERVER['HTTP_HOST'] . base_path() . drupal_get_path('module', 'dnd_test') .'/img/icon/'. $size .'.png?dnd_id='. $i .'-'. $size .'" class="drop" />';
  }
  $variables['sizes'] = '<ul><li>'. implode('</li><li>', $sizes) .'</li></ul>';
}

function template_preprocess_dnd_editor_item(&$variables) {
  list($i, $size) = array($variables['i'], $variables['size']);

  if ($i % 3 == 0) {
    $img = 3;
  }
  else if ($i % 2 == 0) {
    $img = 2;
  }
  else {
    $img = 1;
  }
  $variables['image'] = theme('image', drupal_get_path('module', 'dnd_test') .'/img/item-'. $img .'-'. $size .'.jpg', '', '', array('class' => 'dnd-dropped', 'id' => 'dnd-id-'. $i));
}

function template_preprocess_dnd_library_header(&$variables) {}