Файловый модуль File и тег file
Всем привет, выдалась минутка для раскрытия одной из тем сисек XText.
Топик пока не топик, а черновик, но хочется, чтобы его уже видели.
Волшебный модуль File плагина XText умеет получать файлы, сохранять их по подпапочкам, записывать о них данные в БД, удалять файлы из БД и физически с жесткого диска. Ну в общем такая конфета.
Ежели Вам в своем модуле/плагине надо быстренько залить одно файло, полученное из POST multipart/form-data, то делается это в два пинка:
1. Заливаем файло
2. Добавлем его в БД
Живой пример загрузки одиночного файла можно глянуть в методе PluginXtext_Audiotag_AjaxUpload
Случается, что одним POST-запросом надо залить несколько файлов, иногда фиксированное количество, иногда бесконечное (ну насколько хватит post_max_size и ограничения длины запроса на http-сервере).
Придумаем поля для формы
Глянем на определение метода Upload
$aNames — имена полей формы, в нашем случае array('picture','docs')
$oAccept — Accept-фильтр, пока не трогаем
$bMulti — флаг мультизагрузки, да, он нам нужен, выставим в true
Таким образом лепим код для заливки файлов
На выходе $aFiles у нас будет что-то вроде
Нам остается пройтись по этому двумерному массиву и совершить с объектами файлов/ошибок всё то, что мы хотели с ними совершить (добавить в БД, например, или еще чего-нибудь страшное сделать)
Тег file предназначен для вставки в топики/комментарии/страницы/личную переписку ссылок на файлы, добавленные в БД с помощью модуля File плагина XText.
У тега file есть один обязательный атрибут id, значение которого должно со значением одной из записей в таблице prefix_xtext_file.file_id
Например, код

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


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

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