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

Как реализовать возможность прикрепления к объекту компонента нескольких файлов?

Страницы: 1  |  2
28.11.2011, 16:18
colorit
Студия Колорит

Зарегистрирован:
2011-01-26
Сообщений: 20

Есть компонент, скажем, называется он "Горячие ципы". В нем хранятся девочки и всяческая инфа о них, включая фотки. Так вот я хочу реализовать возможность загрузки нескольких фото к девочке (любого количества, разумеется). Мне нужно иметь возможность загружать, конечно, не только фото, но еще документы, резюме и прочие ненужные разнообразные файлы. Кароче задача сводится к прикреплению к объекту 100500 разнообразных файлов.

З.Ы.: В шаблоне вывода объекта я должен иметь доступ к каждому такому файлу, без ограничений.
30.11.2011, 11:03
DiGGy
DiGGy
DiGGy

Зарегистрирован:
2005-04-04
Сообщений: 1546

Вам нужен компонент "Горячие ципы (файлы)", где будет 2 поля: ID ципы и файл.

Temet nosce...
02.12.2011, 11:42
colorit
Студия Колорит

Зарегистрирован:
2011-01-26
Сообщений: 20

Вы предлагаете сделать так же, как с Альбомами и Фотогалереей (связывать 2 компонента)? Чтобы по одному файлу загружать и теряться с общем списке? Нееет, так не пойдет, нужно по-человечески.
02.12.2011, 12:51
Denis
Denis

Зарегистрирован:
2008-07-15
Сообщений: 666

Почему по одному?
пример

Ксю доставляет...
16.12.2011, 12:01
mxxn

Зарегистрирован:
2011-12-16
Сообщений: 8

Немного не понятно как реализован пример.
Видно что поля добавляются яваскриптом и у каждого индивидуальное имя. Не ясно как реализована обработка этих полей.
16.12.2011, 20:35
Гость
Гость

Вообще в
Условия добавления объекта
Array ( [name] => [type] => [tmp_name] => [error] => 4 [size] => 0 ) ------Array ( [name] => file.jpg [type] => image/jpeg [tmp_name] => C:\WINDOWS\TEMP\phpC7.tmp [error] => 0 [size] => 163742 )
сдается мне тут перехватывают

Хотя могли бы выложить код :-) компонента
17.12.2011, 12:30
ap

Зарегистрирован:
2009-04-30
Сообщений: 12

Да, попробовал сегодня реализовать, все получилось. Получаете имен закачиваемых файлов и копируете куда душе угодно.
print_r() в помощь
18.12.2011, 23:45
mxxn

Зарегистрирован:
2011-12-16
Сообщений: 8

Это все конечно хорошо. Непонятно только одно: предполагается ручной парсинг $_FILES (ручная запись в соответствующую директорию, а так же отдельный вручную составленный запрос к базе данных на добавление элемента компонента)?

Насколько я знаю у неткэт нет api для добавления элемента в компонент раздела программно.
19.12.2011, 09:14
Гость
Гость

На самом деле там писать не много, хотя конечно бы api помогло бы, можете создать просто поле и хранить там пути к файлам в виде
/netcat_files/40/45/file1.jpg:/netcat_files/40/45/file2.jpg
при выводе $ar_files=exploide(":", ...);
получаете массив, я что-то подобное делал в принципе если бы было встроено было проще, но и реализовать самому не сильно сложно
парсите строчку выводите файлы в альтернативной форме добавления, добавляете значки удалить, правда это все потом нужно реализовать (удаление)

единственный минус переносимость с проекта на проект, все заново т.к. генерить альтернативную форму надо и в шаблонах действий прописывать

если просто хотите добавлять в базу файлы по одному,
то парсить там ничего не надо путь типа netcat_files/$cc/$sub или /$sub/$cc на вскидку не помню
в базе там поля стандартные(в том плане что вся инфа уже есть только INSERT прописать), и для поля с файлом вычислять ничего не надо все из массива берется, на форуме недавно видел там расписано что значит, хотя в версиях отличаются поля немного

единственное что это все нужно протестировать как следует, поэтому готовое протестированное решение было бы очень уместно
19.12.2011, 13:37
mxxn

Зарегистрирован:
2011-12-16
Сообщений: 8

Условие добавления

Код:
$uploads_dir = '/path/to/site/netcat_files/135/183/';
foreach ($_FILES["imgfile"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["imgfile"]["tmp_name"][$key];
$original_name = $_FILES["imgfile"]["name"][$key];
$name = nc_transliterate($original_name);
$name = nc_get_filename_for_original_fs($name, $uploads_dir);
$db_field = $original_name . ":" . $_FILES["imgfile"]["type"][$key] . ":" . $_FILES["imgfile"]["size"][$key] . ":135/183/" . $name;
if (move_uploaded_file($tmp_name, "$uploads_dir$name")) {
$db->query("INSERT INTO Message204 (User_ID, Subdivision_ID, Sub_Class_ID, Keyword, Created, LastUser_ID, SourceImage, ArticleID) VALUES
(1, 135, 183, '', '".date("Y-m-d H:i:s")."', 0, '".$db_field."', 0)");
}
}
}


Действие после добавления
Код:
$db->query("UPDATE Message204 SET ArticleID = ".$message." WHERE ArticleID=0");


Не сильно оттестено, но вроде работает. Какие есть замечания?
20.12.2011, 00:53
DiGGy
DiGGy
DiGGy

Зарегистрирован:
2005-04-04
Сообщений: 1546

1. Надо также обрабатывать и случаи с ошибкой при закачке файла и в этих случаях выдавать $posting = 0; и соотв-ий текст ошибки.
2. Может случиться так, что действие после добавления не выполнится. Например, юзер качает 10 файлов и просто тупо не хватило времени работы скрипта (обычно у хостеров лимиты на 30-60 сек). В этом случае, закачанные файлы прицепятся к следующей закачке, а это уже нарушение целостности базы.
3. В User_ID лучше передавать реальный ИД юзера $AUTH_USER_ID. Еще лучше заполнять поле компонента Checked = 1. Вместо '".date("Y-m-d H:i:s")."' уж куда проще написать now().
4. ...

Temet nosce...
198 196 2011-12-20 15:34:11 11721
Страницы: 1  |  2
Описание проекта