Удаление файлов

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Удаление файлов

Сообщение Александр Гавриленко »

Всем здравствуйте!
Запутался совсем.
Подскажите пожалуйста такой вопрос.
Есть вид с выпадающим списком. Список выводится динамически, т.е. вывожу хелпером FileHelpers:

Код: Выделить всё

<?php $form = ActiveForm::begin(['options' => ['class' => 'load']]); ?>
    <?= $form->field($model, 'description')->dropDownList(\yii\helpers\FileHelper::findFiles(Yii::getAlias("@frontend/path/to"))); ?>
    <?= Html::submitButton('Удалить файл', ['class' => 'btn btn-danger', 'name' => 'contact-button']) ?>
<?php ActiveForm::end(); ?>
из указанной папки.
Что нужно прописать в контроллере и модели, чтобы удалялся выбранный файл, указанный в выпадающем списке, из папки?
Спасибо.
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Удаление файлов

Сообщение Александр Гавриленко »

То, что используется функция unlink я знаю, я не могу получть выбранное имя файла в модель
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Удаление файлов

Сообщение caHek2x »

FileHelper::findFiles что генерирует ?
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Удаление файлов

Сообщение Александр Гавриленко »

Выпадающий список, т.е. массив

Код: Выделить всё

<option value="0">W:\domains\BSP\yii2-bsp/frontend/web/images/bottle\alivaria1864.png</option>
<option value="1">W:\domains\BSP\yii2-bsp/frontend/web/images/bottle\alivaria1864_1.png</option>
<option value="2">W:\domains\BSP\yii2-bsp/frontend/web/images/bottle\amber-piwo.png</option>
<option value="3">W:\domains\BSP\yii2-bsp/frontend/web/images/bottle\amber-piwo_1.png</option>
<option value="4">W:\domains\BSP\yii2-bsp/frontend/web/images/bottle\amber.png</option>
<option value="5">W:\domains\BSP\yii2-bsp/frontend/web/images/bottle\amber_1.png</option>
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Удаление файлов

Сообщение caHek2x »

эти value вам о чем то говорят ?) вы потом по цифре "3" сможете достать W:\domains\BSP\yii2-bsp/frontend/web/images/bottle\amber-piwo_1.png ?)
если нет то в value загоняйте этот же путь ...
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Удаление файлов

Сообщение someweb »

caHek2x писал(а): 2017.10.20, 15:50 если нет то в value загоняйте этот же путь ...
И потом сразу удалить не проверяя по этому пути :D
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Удаление файлов

Сообщение Александр Гавриленко »

Вот именно, что я не могу понять как мне вытянуть это значение по value!!! Т.е. передать это значение в модель, которая настроена на удаление файла.
Метод в модели:

Код: Выделить всё

public function delimgbottle($name_2)
    {
      unlink(Yii::getAlias("@frontend/web/images/bottle/$name_2.png"));
      unlink(Yii::getAlias("@frontend/web/images/bottle/{$name_2}_1.png"));
    }
Мне нужно лишь получить параметр $name_2, но это у меня не получается.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Удаление файлов

Сообщение caHek2x »

someweb писал(а): 2017.10.20, 16:06 И потом сразу удалить не проверяя по этому пути :D
:D :D :D забавно будет ) понятное дело проверить есть ли права на удаление .. или пользовательская ли директория ... или чтото еще что уже войдет в логику автора исходя из того как определяется может удалять это пользователь или нет )
Александр Гавриленко писал(а): 2017.10.20, 16:14 Вот именно, что я не могу понять как мне вытянуть это значение по value!!! Т.е. передать это значение в модель, которая настроена на удаление файла.
не понял вас ... яж сказал загоните путь в value ... он вам в форме и прийдет ... а дальше обрабатывайте его ...
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Удаление файлов

Сообщение webplus »

Класс FileHelper должен возвращать массив в котором $key такие же как и $value
Обрати внимания на: $files[$file] = $file;

Код: Выделить всё

Use yii\helpers;

Class FileHelper{

public static function findFiles($path)
{
$files = [];
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            	$file = $dir . $file;
		$files[$file] = $file;
        }
        closedir($dh);
    }
}
return $files;
}

}
В экшене:

Код: Выделить всё

public function actionIndex()
{
	$model = new MyFiles();
	$model->load(Yii::$app->request->post(),'');
	if($model->validate()) {
		$model->deleteFile();
	}
}
В модели MyFiles

Код: Выделить всё

	public $file;

	public function rules() {
		return [
			['file', 'required']
		];
	}
	
	public function deleteFile()
	{
		@unlink($this->file);
	}
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: Удаление файлов

Сообщение webplus »

Я не заметил что вы использовали юишный хелпер: yii\helpers\FileHelper
- я думал вы свой написали.
Но в таком случае создайте свой компонент:

Код: Выделить всё

use common\components;

Class MyFiles{
static public function list()
{
$files = [];
foreach(\yii\helpers\FileHelper::findFiles(Yii::getAlias("@frontend/path/to")) as $file){
$files[$file] = $file;
}
return $files;
}
}
во вьюхе его вызовите:

Код: Выделить всё

 <?= $form->field($model, 'description')->dropDownList(\common\components\MyFiles::list()); ?>
   
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Удаление файлов

Сообщение Александр Гавриленко »

Давайте попробуем сначала!
Решил немного изменить код, а то путь слушком длинный.

Имеем:

Вид:

Код: Выделить всё

<?
.....
// получаем имена изображений изделий из базы данных
$name_bottle = Bottle::find()->asArray()->select(['name_1', 'name_2'])->all();

// формируем массив, с ключем равным полю 'name_2' и значением равным полю 'name_1'
$items = ArrayHelper::map($name_bottle, 'name_2', 'name_1');
?>
.....
//форма выпадающего списка
<div class="col-sm-8 bg-img">
    <?php $form = ActiveForm::begin(['options' => ['class' => 'load']]); ?>
    <?= $form->field($model, 'description')->dropDownList($items, ['name_2']); ?>
    <?= Html::submitButton('Удалить изображения изделия', ['class' => 'btn btn-danger', 'name' => 'contact-button']) ?>
    <?php ActiveForm::end(); ?>
 </div>
Контроллер:

Код: Выделить всё

public function actionDelImgBottle()
  {
	$model = new DelImgBottle();

    if ($model->load(Yii::$app->request->post())) {
    //не могу правильно передать параметр delimgbottle(name_2)!!!
      if ($model->delimgbottle(name_2)) {
        Yii::$app->session->setFlash('success', 'Файлы удалены успешно!');
        return $this->refresh();
      }else {
        Yii::$app->session->setFlash('error', 'Внимание! Файлы не удалены!!!');
      }
    }

    return $this->render('del-img-bottle',[
        'model' => $model,
    ]);
  }
Модель:

Код: Выделить всё

<?php

namespace backend\models;

use Yii;
use yii\base\Model;


 
class DelImgBottle extends Model
{
    public $description;
   
  public function attributeLabels()
  {
    return [
      'description' => 'Выбрать изделие для удаления его изображения',
    ];
  }

//сюда надо получить параметр!!!
    public function delimgbottle($name_2)
    {
      unlink(Yii::getAlias("@frontend/web/images/bottle/$name_2.png"));//Удаляем фото с сервера
      unlink(Yii::getAlias("@frontend/web/images/bottle/{$name_2}_1.png"));
    }

}
Формируется выпадающий список:

Код: Выделить всё

<option value="bbh-low">BSP</option>
<option value="krinitsa">Криница</option>
<option value="zlatBaz">Златы Базант</option>
Надо по ключу value удалить файл
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Удаление файлов

Сообщение someweb »

Код: Выделить всё

public function actionDelImgBottle()
{
    $model = new DelImgBottle();

    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        if ($model->delimgbottle()) {
            Yii::$app->session->setFlash('success', 'Файлы удалены успешно!');
            return $this->refresh();
        }else {
            Yii::$app->session->setFlash('error', 'Внимание! Файлы не удалены!!!');
        }
    }

    return $this->render('del-img-bottle',[
        'model' => $model,
    ]);
}



class DelImgBottle extends Model
{
    public $description;
    public $name_2;

    public function rules()
    {
        return ['name_2', function ($attribute, $params, $validator) {
            if (!(Пользователь имеет право удалить файл $this->$attribute)) {
                $this->addError($attribute, 'Вы не можете удалить этот файл.');
            }

        }];
    }

    public function attributeLabels()
    {
        return [
            'description' => 'Выбрать изделие для удаления его изображения',
        ];
    }

    public function delimgbottle()
    {
        Удаляем $this->name_2 и возвращаем true, если получилось.
    }

Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Удаление файлов

Сообщение someweb »

Ошибочка, забыл внешние скобки

Код: Выделить всё

    public function rules()
    {
        return [
            ['name_2', function ($attribute, $params, $validator) {
            if (!(Пользователь имеет право удалить файл $this->$attribute)) {
                $this->addError($attribute, 'Вы не можете удалить этот файл.');
            }

            }],
       ];
    }
Параметры в документации
http://www.yiiframework.com/doc-2.0/gui ... validators
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Удаление файлов

Сообщение Александр Гавриленко »

Вот так сейчас выглядят:
Котроллер

Код: Выделить всё

public function actionDelImgBottle()
  {
    $model = new DelImgBottle();

    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
      if ($model->delimgbottle()) {
        Yii::$app->session->setFlash('success', 'Файлы удалены успешно!');
        return $this->refresh();
      }else {
        Yii::$app->session->setFlash('error', 'Внимание! Файлы не удалены!!!');
      }
    }

    return $this->render('del-img-bottle',[
        'model' => $model,
    ]);
  }
Модель

Код: Выделить всё

class DelImgBottle extends Model
{

    public $description;
    public  $name_2;


  public function attributeLabels()
  {
    return [
      'description' => 'Выбрать изделие для удаления его изображения',
    ];
  }


  public function rules()
  {
    return [
        ['name_2', function ($attribute, $params, $validator) {
          if (!($this->$attribute)) {
            $this->addError($attribute, 'Вы не можете удалить этот файл.');
          }
        }],
    ];
  }



  public function delimgbottle()
  {
    $name = $this->name_2;
    unlink(Yii::getAlias("@frontend/web/images/bottle/$name.png"));//Удаляем фото с сервера
    unlink(Yii::getAlias("@frontend/web/images/bottle/{$name}_1.png"));
    return true;
  }
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Удаление файлов

Сообщение someweb »

Код: Выделить всё

 <?= $form->field($model, 'description')->dropDownList($items, ['name_2']); ?>
->

Код: Выделить всё

 <?= $form->field($model, 'name_2')->dropDownList($items); ?>
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Александр Гавриленко
Сообщения: 70
Зарегистрирован: 2017.02.05, 07:46

Re: Удаление файлов

Сообщение Александр Гавриленко »

Спасибо!
Помог второй вариант. Первый сам раньше пробовал не получалось.
Пробовал и второй, но в модели было прописано:

Код: Выделить всё

public function attributeLabels()
  {
    return [
      'name_2' => 'Выбрать изделие для удаления его изображения',
    ];
  }
которое выводила заголовок, поэтому значит и не удалялось!!!
Еще раз благодарю.
Ответить