Регистрация
Вход через соцсети
Восстановление пароля

Доработка формы множественной загрузки файлов

Новый топик
28.02.2013, 12:52
Ответить | Цитировать
Руслан Густокашин
Студия Вэлпис
Руслан Густокашин

Зарегистрирован:
2012-02-06
Сообщений: 869

Здравствуйте!
Есть ли у кого-нибудь готовое решение по доработке формы редактирования/добавления объекта, в котором используется поле "Множественная загрузка файлов" для фотографий?
Хочется:
1. Чтобы уже загруженные фотки можно было удалять нажатием спец.кнопки возле файла, а не галочками.
2. Чтобы была возможность самому оформить внешний вид блока со списком уже загруженных файлов
3. Добавить отображение превьюшек фотографий рядом с каждым уже загруженным файлом - чтобы пользователь видел, какую фотку ему удалить.
Вдруг кто-то такое уже делал... не хочется велосипед изобретать. ;-)

14.05.2013, 11:17
Ответить | Цитировать
Руслан Густокашин
Студия Вэлпис
Руслан Густокашин

Зарегистрирован:
2012-02-06
Сообщений: 869

Мне удалось все три пункта выполнить - сделал AJAX-удаление товаров прямо в форме редактирование товаров (не выходя из режима редактирования), сделал отображение превьюшек уже загруженных фотографий, сделал выбор главной фотографии. Все оказалось не очень сложно. улыбка

10.07.2013, 08:04
Ответить | Цитировать
A.Popov
Kit.Team

Зарегистрирован:
2010-08-19
Сообщений: 6

Не могли бы поделиться Вашим решением ?
10.07.2013, 08:35
Ответить | Цитировать
Руслан Густокашин
Студия Вэлпис
Руслан Густокашин

Зарегистрирован:
2012-02-06
Сообщений: 869

Давайте попробую показать принцип действия.
Если рассматривать альтернативную форму изменения объекта, то там, где выводится поле для фотогалереи, делаем следующие корректировки:
Код:

".$f_Photo_Gallery->settings->preview(230, 200)->max(4)."
<!--
Закомментировали стандартный вывод form():
".$f_Photo_Gallery->form()."
Выводим некоторые служебные поля 'вручную' (раньше их выводил как раз form()):
-->
<input type='hidden' name='settings_Photo_Gallery[use_name]' value='' />
<input type='hidden' name='settings_Photo_Gallery[path]' value='' />
<input type='hidden' name='settings_Photo_Gallery[preview][width]' value='230' />
<input type='hidden' name='settings_Photo_Gallery[preview][height]' value='200' />
<input type='hidden' name='settings_Photo_Gallery[preview][mode]' value='0' />
<input type='hidden' name='settings_Photo_Gallery[resize][width]' value='0' />
<input type='hidden' name='settings_Photo_Gallery[resize][height]' value='0' />
<input type='hidden' name='settings_Photo_Gallery[resize][mode]' value='0' />
<input type='hidden' name='settings_Photo_Gallery[min]' value='0' />
<input type='hidden' name='settings_Photo_Gallery[max]' value='4' />
<input type='hidden' name='settings_Photo_Gallery_hash' value='b5106495e89bc10a160555d789414093'/>
";
// Внимание! Выше значение поля hash надо подсмотреть в html-коде, сгенерированном с помощью закомментированного form()

$mainPhotoID=abs(intval($db->get_var("select ID from Multifield where Field_ID=1564 AND Message_ID=$message AND (Priority=0 OR Priority is null) limit 1"))); // определили ID главной фотографии - это фотка с нулевым приоритетом
if($f_Photo_Gallery->count()) {
// если есть фотки в галерее - выводим список фоток в виде таблицы: радиокнопка("главная"), превьюшка и кнопка удаления
echo "<table><tr style='text-align:center;'><td>Главная&nbsp;&nbsp;&nbsp;</td><td></td><td></td></tr>";
foreach($f_Photo_Gallery->records as $loadedpic) {
echo "<tr style='height:76px;'>
<td style='vertical-align:middle;text-align:center;'><input type='radio' name='isMainPhoto' value='{$loadedpic->ID}' ".($mainPhotoID==$loadedpic->ID?"checked='checked'":NULL)."/></td>
<td><img src='{$loadedpic->Preview}' style='width:100px;padding-right:15px;margin:5px;' alt='' /></td><td style='vertical-align:middle'>
<input type='hidden' value='{$loadedpic->ID}' name='delpic-{$loadedpic->ID}' />
<a class='delete ajaxdelete' href='#'><span>Удалить</span></a>
</td></tr>";
}
echo "</table>";
}


И в действии после изменения нужно добавить такую строчку:
Код:
if($isMainPhoto) {
$db->query("update Multifield set Priority=IF(ID=".abs(intval($isMainPhoto)).",0,ID) where Field_ID=1564 and Message_ID=$message");
}

(устанавливаем нулевой приоритет той фотке, которую выбрали радиокнопкой, а остальным делаем приоритет в порядке ID фотографии)

Дальше нужно в Ваш основной js-файл прописать AJAX-привязку для кнопки "Удалить":
Код:
$('a.ajaxdelete').click(function(){
if(confirm('Вы уверены? Фотография будет безвозвратно удалена.')) {
$.ajaxSetup({async:false});
var row=$(this).closest('tr');
$.get('/netcat/modules/default/delpic.php', {id:$(this).prev('input').val()}, function(data) {
if(data==0) { alert('Ошибка удаления файла!'); }
else row.html("<td colspan=3 style='vertical-align:middle;text-align:center;color:blue;'>Изображение удалено.</td>");
});
}
return false;
});

Ну а сам скрипт-удалялка delpic.php вот такой:
Код:

<?php
if (!$_COOKIE['PHP_AUTH_SID']) exit;
session_id($_COOKIE['PHP_AUTH_SID']);
session_start();
include_once '../../../vars.inc.php';
include_once '../../connect_io.php';
include_once '../default/function.inc.php';
global $db,$current_user;
Authorize();
$usergroups=nc_usergroup_get_group_by_user ( $current_user['User_ID'] , 0);
$inAdminGroup=in_array(1, $usergroups);

$picid=abs(intval($_GET['id']));
$picdata=$db->get_row("select * from Multifield where ID=$picid limit 1");
$realownerid=$db->get_var("select User_ID from MessageXXX where Message_ID='{$picdata->Message_ID}' limit 1"); // Здесь XXX - номер таблицы, где хранятся товары. Определили, кто реальный владелец товара (для защиты от хакеров улыбка ).
if($current_user['User_ID'] == $realownerid || $inAdminGroup) {
// запрос на удаление выполняем только если он поступил от админа или от владельца товара
if(file_exists($DOCUMENT_ROOT.$picdata->Path)) @unlink($DOCUMENT_ROOT.$picdata->Path);
if(file_exists($DOCUMENT_ROOT.$picdata->Preview)) @unlink($DOCUMENT_ROOT.$picdata->Preview);
$db->query("delete from Multifield where ID=$picid limit 1");
echo 1; // возвращаем 1-ку, если удаление прошло благополучно.
}
else echo 0;
?>


В вышеприведенном коде 1564 - это номер поля, в котором находится фотогалерея.
Если что-то не получится - пишите, помогу. улыбка

10.07.2013, 12:01
Ответить | Цитировать
Егоров Денис Александрович

Зарегистрирован:
2013-01-14
Сообщений: 31

Спасибо, Ваш код оказался очень полезным!
10.07.2013, 14:42
Ответить | Цитировать
A.Popov
Kit.Team

Зарегистрирован:
2010-08-19
Сообщений: 6

Спасибо Руслан за подробные разъяснения - отличное решение данных вопросов.
11.08.2013, 02:17
Ответить | Цитировать
Руслан Густокашин
Студия Вэлпис
Руслан Густокашин

Зарегистрирован:
2012-02-06
Сообщений: 869

На здоровье! улыбка Надеюсь, в новых версиях нетката подобные вещи сделают уже более-менее штатным функционалом. А то сейчас туговато все это на каждый новый проект взгромождать.

24.08.2013, 15:31
Ответить | Цитировать
Гость
Гость

Здравствуйте! Как вывести фотки, если их более 2 (%Path% и %Preview%) из поля множественной загрузки? Спасибо!)
24.08.2013, 17:16
Ответить | Цитировать
Игорь
Stark
Игорь

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

http://www.netcat.ru/developes/docs/components/types-of-fields/#field11
24.08.2013, 17:46
Ответить | Цитировать
Гость
Гость

Игорь, не могли бы Вы добавить меня в скайп, если есть время? Я отправил Вам приглашение (логин:qcb-shop). Благодарю.
27.08.2013, 20:52
Ответить | Цитировать
Руслан Густокашин
Студия Вэлпис
Руслан Густокашин

Зарегистрирован:
2012-02-06
Сообщений: 869

Учитывая, что в таблице Multifield только два поля под пути к файлам в полях данного типа, смею предположить, что больше двух вариантов фотографий это поле не поддерживает.
Надо хитрить;-)

198 196 2013-08-27 20:52:16 12935
Описание проекта