Форум Joomla! Україна
Как реализовать сохранение картинки на сервер со стороны пользователя - Версія для друку.

+- Форум Joomla! Україна (https://joomla-ua.org/forum)
+-- Форум: Розширення Joomla! (https://joomla-ua.org/forum/forum-27.html)
+--- Форум: Розробка та модифікація розширень (https://joomla-ua.org/forum/forum-71.html)
+--- Тема: Как реализовать сохранение картинки на сервер со стороны пользователя (/thread-2484.html)



Как реализовать сохранение картинки на сервер со стороны пользователя - AlexSpider - 24.05.2020

Всем привет!
Вопрос довольно избитый, но все же, нужно реализовать загрузку фото в каталог на сервере с записью названия в БД.
Оговорюсь сразу,в PHP не силён, так что сильно не ругайте.
Есть модель (models/item.php) в которую изначально вставил код для сохранения фото

Код:
protected function prepareTable($table){
        if (isset($table->images) && is_array($table->images)){
            $registry = new Registry;
            $registry->loadArray($table->images);
            $table->images = (string)$registry;
        }
    }

Так как код взял с админки, где для загрузки использовался type="media", поменял на type="file" и подправил филд в форме .xml

Код:
<fields name="images">
<field name="file"
type="file"
label="COM_ZAKUPKA_ITEM_IMG"
description=""
accept="image/jpeg,image/png,image/gif"
/>
</fields>

Добавил в форму где выводятся все филдсеты enctype="multipart/form-data"

Код:
<form action="index.php?option=com_zakupka&layout=edit&id=<?php echo $this->item->id?>" method="POST" enctype="multipart/form-data" id="adminForm" name="adminForm" class="form-validate">
<input type="hidden" name="task" value="">
<div class="form-horizontal">
<?php foreach($this->form->getFieldsets() as $name => $fieldset) :/?>
<fieldset class="adminForm">
<legend><?php echo JText::_($fieldset->label);?></legend>
    <div class="row-fluid">
    <div class="span6">
    <?php foreach($this->form->getFieldset($name) as $field) :?>
    <div class="control-group">
    <div class="control-label"><?php echo $field->label;?></div>
    <div class="controls"><?php echo $field->input;?></div>
    </div>
    <?php endforeach;?>
    </div>
    </div>
</fieldset>
<?php endforeach;?>
</div>

<?php echo JHtml::_('form.token');
?>
</form>

Нашел код который проверил в index.php, как в песочнице, на работоспособность.

Код:
<form method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" name="upload" value="Загрузить" />
</form>



<?php

if(isset($_POST['upload'])) {
if(empty($_FILES['file']['size']))  die('Вы не выбрали файл');
if($_FILES['file']['size'] > (5 * 1024 * 1024)) die('Размер файла не должен превышать 5Мб');
$imageinfo = getimagesize($_FILES['file']['tmp_name']);

$upload_dir = 'uploads/'; //имя папки с картинками
$name = $upload_dir.date('YmdHis').basename($_FILES['file']['name']);
$mov = move_uploaded_file($_FILES['file']['tmp_name'],$name);
  if($mov) {
//здесь коннект к БД
$name = htmlentities(stripslashes(strip_tags(trim($name))),ENT_QUOTES,'UTF-8');
//если mysql - здесь еще mysql_real_escape_string обработай, mysqli - mysqli_real_escape_string,PDO - quote
$query = "INSERT INTO `shop_zakupka`(`images`) VALUES('$name')";
//выполняешь запрос, если все ок - то выводишь "поздравления" если все плохо - выводишь ошибку
//здесь запрос 
  }
  else echo 'Произошла ошибка при загрузке фотографии. Пожалуйста, попробуйте снова';

}
?>


Сохранение фото идёт, но в БД не записывает, немного покопавшись понял, что для записи в базу мало обращения только к одному столбцу в таблице, пытался прикрутить его к модели на место старого но не могу найти какую функцию необходимо использовать.

Да, название БД - `shop_zakupka`, столбец - `images`

И ещё вопрос, будет ли идти сохранение через кнопки из общего представления view.html.php

Код:
<div class="formelm-buttons">
        <button type="button" onclick="Joomla.submitbutton('item.save')">
            <?php echo JText::_('JSAVE') ?>
        </button>
        <button type="button" onclick="Joomla.submitbutton('item.cancel')">
            <?php echo JText::_('JCANCEL') ?>
        </button>
</div>
так как <input type="submit" name="upload" value="Загрузить" /> из формы выше конечно прийдется убрать.

За ранее спасибо всем кто откликнется, уже несколько дней не могу решить эту головоломку


RE: Как реализовать сохранение картинки на сервер со стороны пользователя - saharin - 24.05.2020

Якщо у вас слабкі знання PHP, навряд чи вдасться осилити це.
Спочатку файли треба зберегти фізично по вказаному шляху (вони завантажуються в тимчасовий каталог), а потім ці шляхи до файлів зберегти в бд для потрібної сутності (зазвичай шляхи до зображень зберігаються в json форматі).
Метод prepareTable підготовлює дані для збереження. Теоретично його можна не використовувати для збереження, позаяк у класу Joomla\CMS\Table\Table є властивість _jsonEncode, це масив назв властивостей, котрі потрібно кодувати в json формат перед збереження.


RE: Как реализовать сохранение картинки на сервер со стороны пользователя - AlexSpider - 24.05.2020

Готов заплатить за решение функционала


RE: Как реализовать сохранение картинки на сервер со стороны пользователя - saharin - 24.05.2020

Я можу скайпом (d.saharin) розказати та наглядно показати як робити (безкоштовно звісно Smile).


RE: Как реализовать сохранение картинки на сервер со стороны пользователя - AlexSpider - 24.05.2020

Спасибо за предложение, но будет проще если я предоставлю исходники и опишу задачу, а вы скажете цену и поможете с кодом.


RE: Как реализовать сохранение картинки на сервер со стороны пользователя - saharin - 24.05.2020

Напишіть мені в скайп.


RE: Как реализовать сохранение картинки на сервер со стороны пользователя - kaylenekey - 26.05.2021

Спасибо!