Переопределение пути загружаемого файла в рамках одной ИС

#
Переопределение пути загружаемого файла в рамках одной ИС
Доброго времени суток, возникла следующая задача.
Необходимо сделать переопределение директории для загрузки файлов и механизма формирования субдирректорий в рамках одной Информационной системы.
Во всех остальных нужен штатный механизм. Как можно решить данную задачу?
Загрузка файла задается в Edit файле элемента информационной системы  и получается через getItemPath, и хотя я так и не нашел, где он определяется,  но в принципе уже в самом edit файле можно изменить механизм загрузки.

Или здесь более верным решением создавать свой класс, и от него уже плясать дальше?
Вариант подцепить на какой нибудь хук тоже интересен, но с обсерверами не работал до этого, так что если приведете код который доступно объяснит что делать буду признателен.
#
Re: Переопределение пути загружаемого файла в рамках одной ИС
Не понятно. Можете более подробно описать. Непонятно  что такое "Edit файле элемента".

Как пример, я напишу что сделал буквально вчера: в клиентской части на карточке товара при клике по ссылке я скачиваю как-бы файл mysite.ru/shop/shirts/xxl/new-shirt/shirt_sizes.pdf, а реально файл находится по менее "красивому" адресу mysite.ru/upload/shop_1/1/2/item_123/shop_items_property_117.pdf

Через метод getItemPath() вы получаете относительный путь к файлу в папке /upload/ - т.е. в моем примере /upload/shop_1/1/2/item_123/shop_items_property_117.pdf

Сам метод находится в modules\informationsystem\item\model.php (ищите по исходникам!)
ARTatom
#
Re: Переопределение пути загружаемого файла в рамках одной ИС
Более подробно:
Есть информационная  система, в которой необходимо, чтобы файлы лежали по пути /documents/{папка в зависимости от группы в ИС}/{Информационный элемент}/{файл} , что в принципе очень похоже на то, что реализовывали Вы.
Касательно "Edit файле элемента" я говорил про файл \modules\informationsystem\item\controller\edit.php, и собирался менять именно там, или же через extends контроллера, и писать свое обработчик  этой части кода.

Цитата:

Как пример, я напишу что сделал буквально вчера: в клиентской части на карточке товара при клике по ссылке я скачиваю как-бы файл mysite.ru/shop/shirts/xxl/new-shirt/shirt_sizes.pdf, а реально файл находится по менее "красивому" адресу mysite.ru/upload/shop_1/1/2/item_123/shop_items_property_117.pdf

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

P.S. За указание на метод, спасибо я как то умудрился его вчера просмотреть, хотя модель первым делом проверял. Все таки перебирать код в первом часу ночи не есть гуд.
#
Re: Переопределение пути загружаемого файла в рамках одной ИС
Добавляем виртуальный "путь" к скачиваемому файлу.
Для примера, пусть выводятся эл-ты в XSL:

  ...
  <ul>
    <xsl:for-each select="informationsystem_item">
      <li>
        <a class="download" href="{name}.pdf" data-id="{@id}"><xsl:value-of select="name"/></a>
      </li>
    </xsl:for-each>
  </ul>
  ...

Добавляем перехват "кликов" через JS:

  $(function(){
    var downloadBtns = $('li a.download');
    downloadBtns.on('click',function(e){
      e.preventDefault();
      var self = $(this);
      var id = self.data('id');
      var form = $('<form />', {method: 'post', style: 'display: none;'});
      $('<input />', {type: 'hidden', name: 'action', value: 'download'}).appendTo(form);
      $('<input />', {type: 'hidden', name: 'id', value: id}).appendTo(form);
      form.appendTo('body').submit();
    });
  });

Добавляем обработчик в настройки динамической страницы или ТДС:

<?php
  ...
  $itemId = Core_Array::getRequest('id', 0);
  if ($action == 'download' && $itemId)
  {
    Core_File::download(
      // Путь к физическому файлу на сервере
      $oItem->getItemPath() . $oItem->image_large,
      // Фиктивное название, под которым будет скачиваться файл
      urlencode($oItem->name . '.' . Core_File::getExtension($oItem->image_large),
      array('attachment')
    );
    exit();
  }
  ...
ARTatom
Авторизация