Получить путь к файлу

Главные вкладки

Аватар пользователя sierra sierra 20 апреля 2012 в 10:50

Как получить путь к прикрепленному файлу в ноде (файлы крепятся через файлфиелд)? По апи пошарился не нашел...

Комментарии

Аватар пользователя sg85 sg85 20 апреля 2012 в 11:21

Получать программно файлы, прикрепленные к нодам лично мне не приходилось, однако, мне кажется, что любую хрень, связанную с нодой, можно получить из её объекта, структуру которого, в свою очередь, можно наглядно увидеть с помощью 100500 способов, половина из которых раскидана по этому форуму.(лично мне удобнее юзать devel)

Аватар пользователя sierra sierra 20 апреля 2012 в 13:31

"sg85" wrote:
однако, мне кажется, что любую хрень, связанную с нодой, можно получить из её объекта

Не выходит:


<?php 
$nid
=8;
$node node_load($nid);
print 
$node->field_file[0]['filepath'];
?>

Результат — ничего...

Аватар пользователя sg85 sg85 20 апреля 2012 в 14:05

"<a href="mailto:nilard@drupal.org">nilard@drupal.org</a>" wrote:
Посмотреть содержимое ноды можно уже с помощью стандартных функций PHP (вставьте следующий код например в node.tpl.php): <?php print_r($node) ?>

взято от сюда http://www.drupal.ru/node/10529

Аватар пользователя sierra sierra 20 апреля 2012 в 14:24

"sg85" wrote:
взято от сюда http://www.drupal.ru/node/10529[/quote]
Ну и, получил я эту кашу, есть там да же путь файла, но опять таки, зачем мне разгребать всю кашу ноды, если нужен только путь к аттаченному файлу. Должен быть отдельный метод получения пути.

Аватар пользователя sg85 sg85 20 апреля 2012 в 14:55

Да блин, эта каша - всего лишь структура ноды, в которой наглядно показано какие поля объекта у неё вообще есть, и как их правильно задать.
Дальше выделяете мышкой нужный вам кусок, нажимаете Ctrl+C, открываете Ваш модуль, в нем в нужном месте жмете Ctrl+V, правите этот кусок под правила PHP и свои нужны, и пользуетесь.

Я беспонятия как объяснить более доходчиво...

Аватар пользователя sierra sierra 20 апреля 2012 в 14:58

Если что то выше я код приводил, в котором и написано получение с ноды того что мне нужно, по правилам, только не работает оно.

Аватар пользователя sg85 sg85 20 апреля 2012 в 15:10

Если там действительно все верно, то не работать оно может только, если вызывается не по правилам. Проверить можно через print "текст"; в том месте, где у Вас тот код. А если этот текст где-либо все таки вылезет, то скорей всего $node->field_file[0]['filepath']; неверно.

Аватар пользователя sierra sierra 20 апреля 2012 в 15:16

Разобрался, так заработало:

<?php
<?
$nid=12;
$node node_load($nid);
$get_field_name field_get_items('node'$node'field_file');
print 
$get_field_name[0]['uri'];
?>

Но это немного не такой путь, он вида public://book/1_7.txt а мне нужен sites/default/files/book/1_7.txt

Аватар пользователя Orion76 Orion76 20 апреля 2012 в 15:17

обычно в параметре URI поля типа файл ноды содержиться путь к файлу от папки files , что-то типа public://dir/file.ext
полный путь к файлу можно получить функцией drupal_realpath($uri) http://api.drupal.org/api/drupal/includes!file.inc/function/drupal_realp...

Аватар пользователя sg85 sg85 20 апреля 2012 в 15:24

field_get_items, вроде функция локализации, позволяет получить текст на определенном языке, т.е. совершенно здесь не нужна. Т.е. в 1м варианте Вы пытаетесь получить 'filepath', во 2м 'uri'

Аватар пользователя drupby drupby 20 апреля 2012 в 15:35

"sg85" wrote:
field_get_items, вроде функция локализации, позволяет получить текст на определенном языке,

откуда такие выводы ?
langcode в ней вроде как опциональный аргумент.
она скорее для того ,чтобы после неё вывести поле через field_view_value()

Аватар пользователя sg85 sg85 20 апреля 2012 в 16:32

"drupby" wrote:
откуда такие выводы ?
langcode в ней вроде как опциональный аргумент.
она скорее для того ,чтобы после неё вывести поле через field_view_value()

из самой функции

function field_get_items($entity_type, $entity, $field_name, $langcode = NULL) {
  $langcode = field_language($entity_type, $entity, $field_name, $langcode);
  return isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : FALSE;
}

$get_field_name = field_get_items('node', $node, 'field_file'); будет полным аналогом $get_field_name->field_name, если $get_field_name == $node(в данном случае)

Аватар пользователя drupby drupby 20 апреля 2012 в 16:45

"sg85" wrote:
$get_field_name = field_get_items('node', $node, 'field_file'); будет полным аналогом $get_field_name->field_name, если $get_field_name == $node(в данном случае)

"sg85" wrote:

field_get_items, вроде функция локализации


и где логика ваша?

Аватар пользователя sg85 sg85 20 апреля 2012 в 17:04

"drupby" wrote:
"sg85" написал(а):
$get_field_name = field_get_items('node', $node, 'field_file'); будет полным аналогом $get_field_name->field_name, если $get_field_name == $node(в данном случае)
"sg85" написал(а):
field_get_items, вроде функция локализации
и где логика ваша?

А где Ваша?)
Или писать такое:

function f1($arg){
  return $arg;
}
print f1($data);

стало модным?)
Нет, я согласен, что в некоторых ситуациях, когда, к примеру, имя поля изначально неизвестно, использовать можно, но в данном варианте, выглядит именно так)

Аватар пользователя Ch Ch 20 апреля 2012 в 17:11

field_get_items это вспомогательная функция, с помощью которой удобно извлекать значения (с учётом текущего языка) из полей ноды. Даже если на сайте используется только один язык, значения полей в ноде буду находится в массиве с соответствующим индексом. Поэтому извлекать их оттуда удобней с помощью данной функции.
http://www.davereid.net/content/hlkd7fotw-field-get-items

Аватар пользователя sg85 sg85 20 апреля 2012 в 18:22

"Ch" wrote:
 field_get_items это вспомогательная функция, с помощью которой удобно извлекать значения (с учётом текущего языка) из полей ноды. Даже если на сайте используется только один язык, значения полей в ноде буду находится в массиве с соответствующим индексом. Поэтому извлекать их оттуда удобней с помощью данной функции.
http://www.davereid.net/content/hlkd7fotw-field-get-items[/quote]
Спасибо за разъяснение, но для себя по прежнему не нахожу в ней смысла, кроме случаев с языком, либо, когда имя поля является переменной, особенно, если требуется получить значения десятка полей, но это, видимо, уже мои проблемы Smile