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

28.01.2010

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
Похожие записи

Комментарии

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

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

Добавить комментарий