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)
{
// ...
}
}
Комментарии
как подружить д6 с последней версией Uploadify 2.1.4 ? Требуется jquery 1.4.
2) Кто-нибудь загружать файл в друпале на другой сервер пробовал? http://www.uploadify.com/faqs/how-do-i-upload-files-from-one-server-to-…
1) никак
а со старой версией (скачал с файло-помойке) загружать файл на другой сервер пробовал?
бакэнд будет в любом случае одинаковый
Добавить комментарий