xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Работаем с jQuery плагином Uploadify

Опубликовано в

Uploadify это jQuery плагин для закачки одного или нескольких файлов за раз, с прогрессбаром и различными рюшечками.

Основная сложность, при работе с плагином, заключается в том, что он не передаёт значение сессии при аплоаде файла. Поэтому Drupal думает что файл закачивает анонимный пользователь, со всеми вытекающими последствиями.

Чтобы этого не происходило, при загрузке файла нужно передавать идентификатор сессии в параметре scriptData, и на сервере делать проверку прав не в хуке hook_menu(), а в соответствующей callback функции. Покажу на примере.

Регистрируем адрес по которому будет осуществляться загрузка:

/**
 * Реализация hook_menu()
 */
function mymodule_menu()
{
    $items['uploadify'] = array(
        'title' => 'uploadify',
        'page callback' => 'mymodule_upload',
        'access callback' => true, // разрешаем загрузку файлов всем
        'type' => MENU_CALLBACK,
    );
 
    return $items;
}

Подключаем плагин, например при выводе формы добавления/редактирования ноды:

/**
 * Реализация hook_nodeapi()
 */
function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL)
{
    if ($op == 'prepare')
    {
        global $base_path;
 
        $modulePath = drupal_get_path('module', 'mymodule') . '/';
        $uploadifyPath = $modulePath . 'jquery.uploadify-v2.1.0/';
 
        // подключаем плагин Uploadify
        drupal_add_js($uploadifyPath . 'jquery.uploadify.v2.1.0.js');
 
        // подключаем SwfObject
        drupal_add_js($uploadifyPath . 'swfobject.js');
 
        // подключаем скрипт инициализации плагина Uploadify
        drupal_add_js($modulePath . 'mymodule.js');
 
        // делаем чтобы идентификатор сессии стал виден в javascript
        drupal_add_js(array('mymodule' => array(
            'phpsessid' => session_id(),
            'uploadifyPath' => $base_path . $uploadifyPath,
        )), 'setting');
    }
}

Скрипт mymodule.js:

// плагин будет инициализирован после загрузки DOM, аналог $(function(){ ... }) в jQuery
Drupal.behaviors.mymodule = function(context)
{
    $('#uploadify').uploadify({
        'uploader'    : Drupal.settings.mymodule.uploadifyPath + 'uploadify.swf',
        'cancelImg'   : Drupal.settings.mymodule.uploadifyPath + 'cancel.png',
        'script'      : '/uploadify',
        'fileDataName': 'files[uploadify]',
        'auto'        : true,
        'folder'      : '/temp',
        'scriptData'  : {'phpsessid':Drupal.settings.mymodule.phpsessid},
        'onComplete'  : function(event, ID, fileObj, response, data){ alert(response); },
        'onError'     : function(event, ID, fileObj, errorObj){ alert(errorObj.type + ', ' + errorObj.info); }
    });
};

Ну и основная функция загрузки файла:

/**
 * Callback menu: загрузка файла
 */
function mymodule_upload()
{
    $phpsessid = isset($_POST['phpsessid']) ? $_POST['phpsessid'] : '';
 
    if ($phpsessid && session_id() != $phpsessid)
    {
        session_destroy();
        session_id($phpsessid);
        $_COOKIE[session_name()] = $phpsessid;
        // после выполнения этой функции переменная $user будет заполнена информацией
        // о текущем пользователе
        _drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);
    }
 
    // проверка прав доступа
    if (!user_access('administer nodes'))
    {
        return false;
    }
 
    $file = file_save_upload('uploadify', array(), file_directory_path());
 
    if ($file)
    {
        // ...
    }
}
Написанное актуально для Drupal 6.x, Uploadify 2.x
Похожие записи

Комментарии RSS

как подружить д6 с последней версией Uploadify 2.1.4 ? Требуется jquery 1.4.

2) Кто-нибудь загружать файл в друпале на другой сервер пробовал? http://www.uploadify.com/faqs/how-do-i-upload-files-from-one-server-to-a...

1) никак

а со старой версией (скачал с файло-помойке) загружать файл на другой сервер пробовал?

бакэнд будет в любом случае одинаковый

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании