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


У меня есть структура в базе данных, и я хочу, чтобы она была напечатана. Итак, в меню крючка у меня есть запись с

'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"], используемым в качестве текста ссылки?

То, что я сейчас делаю, довольно грязно:

  1. В function mymodule_mystructure_display Я foreach или array_walk над файлами.

  2. Для каждого элемента я беру идентификатор файла и использую для него эту вспомогательную функцию:

    _uri_by_id($id) {
      $file = file_load($id);
      return $file->uri;
    }
    
  3. Результат передается в 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"
      }
    }
    
  4. В mystructure.tpl.php Я использую l() для печати фактической ссылки:

    echo l($item["name"], $item["url"]);
    

Все это работает. Но это неприятно. Я всегда был бэкендистом, моих знаний о интерфейсе как-то не хватает. Но я уверен, что должен быть более короткий путь от идентификатора управляемого файла до ссылки. Так что же это будет?

Примечание: значение в ["name"] получено из $mystructure, это не что-то взятое непосредственно из объекта file. Это в значительной степени остановило меня от использования theme_file_link(). Но даже если бы это не было проблемой, мне все равно нужно загрузить файловый объект вручную, чтобы использовать theme_file_link().

Author: Mołot, 2014-01-14

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.

 2
Author: Clive, 2014-01-14 13:37:55