view dnd_test/dnd_test.module @ 8:b9cd179a30a8

Use user session for the drupal_http_request requesting the library. By default, drupal_http_request runs in a sandbox environment, thus the request doesn't have any idea about the current user. This in turn means that the request on the library is performed as an anonymous user, who may not have appropriate credentials to access the library.
author Franck Deroche <franck@defr.org>
date Wed, 01 Apr 2009 15:49:44 +0200
parents c2eb995212bf
children 4626f7e31aa0
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',
    ),
  );
}

/**
 * Page call back 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'  => '<h3>'. t('Test library: Page @page', array('@page' => $page)) .'</h3>',
    'library' => $test_library['library'],
    'editor_representations' => $test_library['editor_representations'],
    '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 = 5) {
  $start = ($page * $limit) - ($limit); 
  $end   = $page * $limit;

  $library = '';
  $editor_representations = array();
  for ($i=$start + 1; $i < $end + 1; $i++) {
    $library .= theme('dnd_library_item', $i);
    $editor_representations += dnd_editor_items($i);
  }
  return array(
    'library' => $library,
    'editor_representations' => $editor_representations,
  );
}

/**
 * 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['item-'. $i .'-'. $size] = theme('dnd_editor_item', $i, $size);
  }
  return $item;
}

/**
 * Completely contrived edit item theme function
 */
function template_preprocess_dnd_library_item(&$variables) {
  $i = $variables['i'];
  $variables['image'] = theme('image', drupal_get_path('module', 'dnd_test') .'/img/item-'. $i .'-thumb.jpg');
  $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[] = l('<span>'. $size .'</span>', '', array( 
      'html'       => TRUE,
      'attributes' => array(
        'class' => 'drop size-'. $size, 
        'id' => 'item-'. $i .'-'. $size,
      ),
      'query' => array('dnd_id' => 'item-'. $i .'-'. $size),
    ));
  }
  $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']);
  $variables['image'] = theme('image', drupal_get_path('module', 'dnd_test') .'/img/item-'. $i .'-'. $size .'.jpg');
}