Файловый модуль File и тег file

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

TOC


Модуль File ^

Волшебный модуль File плагина XText умеет получать файлы, сохранять их по подпапочкам, записывать о них данные в БД, удалять файлы из БД и физически с жесткого диска. Ну в общем такая конфета.

Загрузка одиночных файлов ^

Ежели Вам в своем модуле/плагине надо быстренько залить одно файло, полученное из POST multipart/form-data, то делается это в два пинка:
1. Заливаем файло
$oFile = $this->PluginXtext_File_Upload('file_field_name');

2. Добавлем его в БД
if($oFile->isError()){  // случилаь какая-то мерзкая ошибка
  // здесь $oFile instanceof PluginXtext_ModuleFile_EntityError
  throw new Exception($oFile->getText()); // например так обработаем ошибку, новомодненько
}else{
  // здесь $oFile instanceof PluginXtext_ModuleFile_EntityFile
  $oFile = $oFile->doAdd(); // добавляем в БД!
  // например, получаем полный URL файла
  $sUrl = $oFile->getUrl();
  // ... PROFIT!
}


Живой пример загрузки одиночного файла можно глянуть в методе PluginXtext_Audiotag_AjaxUpload

Загрузка множества файлов ^

Случается, что одним POST-запросом надо залить несколько файлов, иногда фиксированное количество, иногда бесконечное (ну насколько хватит post_max_size и ограничения длины запроса на http-сервере).

Придумаем поля для формы
<input type="file" name="picture" />
<input type="file" name="docs[]" />
<input type="file" name="docs[]" />
<input type="file" name="docs[]" />


Глянем на определение метода Upload
public function Upload($aNames = null, $oAccept = null, $bMulti = false)

$aNames — имена полей формы, в нашем случае array('picture','docs')
$oAccept — Accept-фильтр, пока не трогаем
$bMulti — флаг мультизагрузки, да, он нам нужен, выставим в true

Таким образом лепим код для заливки файлов
$aFiles = $this->PluginXtext_File_Upload(array('picture','docs'), null, true);


На выходе $aFiles у нас будет что-то вроде
array(
  'picture' => array(
     0 => (object File|Error),
  ),
  'docs' => array(
     0 => (object File|Error),
     1 => (object File|Error),
     2 => (object File|Error),
  ),
)


Нам остается пройтись по этому двумерному массиву и совершить с объектами файлов/ошибок всё то, что мы хотели с ними совершить (добавить в БД, например, или еще чего-нибудь страшное сделать)

Тег file ^

Тег file предназначен для вставки в топики/комментарии/страницы/личную переписку ссылок на файлы, добавленные в БД с помощью модуля File плагина XText.

У тега file есть один обязательный атрибут id, значение которого должно со значением одной из записей в таблице prefix_xtext_file.file_id

Например, код
Отличная песня, качайте: <file id="2" /> :)
будет интерпретирован так:


И да, тут тег file еще tooltip показывает при наведении мышкой :)

Блок «Мои файлы» ^

На странице создания топика плагин XText добавляет блок «Мои файлы», на вкладках которого отображаются списки последних загруженных файлов, отсортированных по категориям. Под каждым файлом код для вставки в топик




Полный список ваших файлов ^

Ткнув курсором по ссылке «Все файлы» в блоке «Мои файлы» мы попадаем в полный список Ваших файлов.



// ушел пить чай, продолжение следует

12 комментариев

avatar
круто! за такую цену столько функций! работает все на ура! жду не дождусь мультизагрузки в xtext! уж очень нужен фоторепортажный функционал
avatar
Кстати, сразу не обратил внимание, во «все файлы» попутаны местами наименования колонок «Дата» и «размер»
avatar
ага ок. в свн у себя пофиксил
avatar
Отличный Модуль..!!!:)
Он как будет распространяться в месте с плагином «XText» или отдельно..?
avatar
оно еще с версии 0.0.4 там
avatar
это понятно, «мои файлы» — это он и есть.А когда ждать реализации функционала загрузки «множества файлов»?
avatar
как руки дойдут ) ежели вам не терпится и есть навык, то можете попробовать сами
avatar
у меня навык есть небольной, но не настолько, чтобы
пройтись по этому двумерному массиву и совершить с объектами файлов/ошибок всё то, что мы хотели с ними совершить (добавить в БД, например, или еще чего-нибудь страшное сделать)

вот щас сижу и делаю фотоотчет: фигачу 53 фотки в топик по одной — это кошмар! Когда ж будет в паблике или мультизагрузка в xtext или вид топика отдельный: фотоотчет?
avatar
Есть предложение, сделать возможность убирать список «моих файлов» чтобы ничего нельзя было удалить/изменить
Если залил файл, то он на сервере, ничего не поделаешь (как с картинками) [место на жестких дисках нынче в разы дешевле cpu & etc]
А так идея отличная, был модуль для 0.3 версии — он меня все устраивал — был удобный очень и простой при этом. Когда то платный был…
avatar
ну скажем не то чтобы убрать список, а убрать кнопочку с корзинкой, которая удаляет и запрет на аякс-метод.
вообще оно было так сделано, чтобы как раз подчищать лишнее барахло для экономии места )
avatar
Подчищать может простой скрипт Уборщицы)
И я все таки рад был бы, если был вариант скрыть вообще это огромное меню с файлами. Простота — вот это и правда нужно)
В принципе это судя по скринам можно будет сделать просто скрыв пункт в шаблоне) Меньше простой юзер знает — лучше спит он и все остальные)
avatar
вообще, можно в конфиге тега file просто закомментировать тот блок и не будет его нигде. вот.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.