Здравствуйте! Очень надеюсь на вашу помощь, так как уже потихоньку начинаю выходить из себя и раздумывать о запое.
Суть в следующем. Есть сайт, на котором к материалу "Текстовая страница" можно добавлять файлы - для этого есть группа полей field_grouped_files_files. Ссылка на скачивание файла работает через file_create_url($item['uri']) - т.е., отдает прямой путь к файлу.
Но. Мне необходимо сделать так, чтобы ссылка на скачивание была вида system/download/$fid. Попробовал воспользоваться следующим способом:
<?php
/**
* Implementation of hook_menu()
*/
function mymodule_menu() {
$items['download/%file'] = array(
'page callback' => 'mymodule_download_file',
'access arguments' => array('administer site configuration'),
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* Page callback for forcing a file to download
*/
function mymodule_download_file($file) {
if($file) {
file_transfer($file->uri, array('Content-disposition' => 'attachment; filename='.$file->filename));
}
else {
return drupal_access_denied();
}
}?>
Но максимум, чего смог добиться — 403 ошибки. Иногда 404. Плагины типа Download File работают так же: то 403, то 404, т.е. их, пожалуйста, не предлагайте.
Надеюсь на вашу помощь, спасибо!
Комментарии
Давайте пробовать решать...
Для начала, нужно аргумент $file - передавать из хука меню:
<?php
/**
* Implementation of hook_menu()
*/
function mymodule_menu() {
$items['download/%file'] = array(
'page callback' => 'mymodule_download_file',
'page arguments' => array(1), // Передаем аргумент в коллбек
'access arguments' => array('administer site configuration'),
'type' => MENU_CALLBACK,
);
return
$items;}
?>
2-е. Вы уверены что существует вайлдкард %file ? Файл приходит в коллбек mymodule_download_file?
насчет второго не уверен. как можно это проверить?
Можно установить модуль Devel, и посмотреть ф-цией dpm():
<?php
function mymodule_download_file($file) {
dpm($file); // Выведет значение переменной на экран
if($file) {
file_transfer($file->uri, array('Content-disposition' => 'attachment; filename='.$file->filename));
}
else {
return drupal_access_denied();
}
}
?>
Ну, или стандартными var_dump, var_export, print_r...
Так же, учитывайте, что ссылку должен смотреть администратор, в разрешениях указаны права 'administer site configuration'.
PS - перестаньте модераторов звать Только хуже делаете
хм. HTTP ERROR 503 в ответ.
я правильно все сделал? вытащил блок "выполнить php" в футер, там запустил код. залогинен был под админом.
P. S. виноват, исправляюсь
Нет! НЕЕЕТ! И еще - 1000 раз нет!
Весь код реализуется в рамках модулей, в крайнем случае - в теме.
добавлял код в модуль, в итоге ничего не увидел.
вот это поле:
но где сами файлы? я уже либо путаюсь, либо туплю
Значит, не грузится файл автоматом.
На страницу download/% что передается 1м аргументом? ID файла (fid)?
да, fid
А сам файл с вызываемым FID'ом есть?
Должен приходить файл, если существует.
Что выводит dpm($file); в коллбеке?
Если объект файла - должно работать. Если только FID - инициализируйте загрузку файла ( file_load($fid) ) перед обработкой.
И не забывайте что в коллбеке нужно возвращать результат:
<?php
function mymodule_download_file($file) {
dpm($file); // Выведет значение переменной на экран
if($file) {
// Используйте return
return file_transfer($file->uri, array('Content-disposition' => 'attachment; filename='.$file->filename));
}
else {
return drupal_access_denied();
}
}
?>
в общем, что я имею.
методом перебора выяснилось, что на моем сайте можно заставить работать модуль DownloadFile.
и он работает с дефолтными настройками: по ссылке download/file/fid/%fid все скачивается замечательно. но как только я вписываю туда system/download/file/fid/%fid, сразу все падает с 403 ошибкой даже под админом.
ссылка такого вида нужна для работы счетчика скачиваний.
можете посоветовать, в какую сторону копать?
Не работал с подобными модулями.
Ссылку system/download/file/fid/%fid откуда берете? Она вообще существует?
в коде модуля есть такой фрагмент:
<?php
function download_file_menu() {
$items['download/file/fid/%'] = array(
'title' => 'Download file',
'page callback' => 'download_file_direct_download',
'page arguments' => array(3),
'access arguments' => TRUE,
);
}
?>вот туда пробовал вписать.
Вангую, что пропущен основной шаг: