От идентификатора управляемого файла до ссылки конечного пользователя - аккуратный и чистый способ?
У меня есть структура в базе данных, и я хочу, чтобы она была напечатана. Итак, в меню крючка у меня есть запись с
'page callback' => 'mymodule_mystructure_display',
И в файле inc у меня есть
function mymodule_mystructure_display($id_structure) {
$mystructure= something(); // Data preparation
return $mystructure;
}
И у меня есть все помощники, настроенные так, чтобы mystructure.tpl.php Я могу просто использовать:
kpr($mystructure);
И все это работает, поэтому позвольте мне пока опустить детали, они описаны в Примерах для разработчиков в любом случае.
Настоящая борьба идет с файлами.
В $mystructure['files']
У меня есть вложенный массив, такой как это:
array(2) { [0]=> array(2) { ["name"]=> string(26) "Display name of first file" ["fid"]=> int(34) } [1]=> array(2) { ["name"]=> string(27) "Display name of second file" ["fid"]=> int(62) } }
Где ["fid"]
соответствует полю {file_managed}.fid
в базе данных Drupal.
Какой самый чистый способ вывода ссылок на файлы, с ["name"]
, используемым в качестве текста ссылки?
То, что я сейчас делаю, довольно грязно:
В
function mymodule_mystructure_display
Яforeach
илиarray_walk
над файлами.-
Для каждого элемента я беру идентификатор файла и использую для него эту вспомогательную функцию:
_uri_by_id($id) { $file = file_load($id); return $file->uri; }
-
Результат передается в
file_create_url
функция, и его результат сохраняется под индексом["url"]
, чтобы дать мне этот массив в$mystructure['files']
:array(2) { [0]=> array(2) { ["name"]=> string(26) "Display name of first file" ["fid"]=> int(34) ["url"]=> string(50) "http://example.com/sites/default/files/example.pdf" } [1]=> array(2) { ["name"]=> string(27) "Display name of second file" ["fid"]=> int(62) ["url"]=> string(50) "http://example.com/sites/default/files/example.txt" } }
-
В mystructure.tpl.php Я использую l() для печати фактической ссылки:
echo l($item["name"], $item["url"]);
Все это работает. Но это неприятно. Я всегда был бэкендистом, моих знаний о интерфейсе как-то не хватает. Но я уверен, что должен быть более короткий путь от идентификатора управляемого файла до ссылки. Так что же это будет?
Примечание: значение в ["name"]
получено из $mystructure
, это не что-то взятое непосредственно из объекта file. Это в значительной степени остановило меня от использования theme_file_link()
. Но даже если бы это не было проблемой, мне все равно нужно загрузить файловый объект вручную, чтобы использовать theme_file_link()
.
1 answers
Лично я бы предпочел что-то вроде этого:
// Extract file IDs so we only run one file_load().
$fids = array_map($mystructure['files'], function($x) { return $x['fid']; });
$files = file_load_multiple($fids);
$build = array();
foreach ($mystructure['files'] as $file) {
// Update the description
$files[$file['fid']]->description = $file['name'];
// Add to the build
$build[] = array(
'#theme' => 'file_link',
'#file' => $files[$file['fid']],
);
}
return $build;
Немного чище/производительнее и использует как можно больше основных API.