Перейти к содержимому


правильно обнулить поле с типом "Файл"


Сообщений в теме: 4

#1 AntonKravchenko

    Активный участник

  • Пользователи
  • PipPipPip
  • 153 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород

Отправлено 08 Февраль 2017 - 09:44

Коллеги. приветствую!
Подскажите, как правильно обнулить поле с типом "Файл"? Простейшее вычисление $line['Файл'] = ''; очищает поле, однако после этого программным способом в него уже не получается ничего записать - оно остаётся пустым, ошибок нет

Сообщение отредактировал AntonKravchenko: 08 Февраль 2017 - 09:44


#2 AntonKravchenko

    Активный участник

  • Пользователи
  • PipPipPip
  • 153 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород

Отправлено 08 Февраль 2017 - 09:45

для заполнения поля Файл использую класс WorksWithFilesCB от уважаемого wondertalik:

/**
* Класс предоставляет методы для копирования уже загруженных в КБ файлов
* из одного или нескольких полей в одно любое другое.
*
* Class WorksWithFilesCB
*/
class WorksWithFilesCB
{
	protected $fieldsSource;
	protected $tableID;
	protected $lineID;
	const TYPE_FILE = 1; //Тип файла - файл
	const TYPE_IMG = 2; //Тип файла - изображение
	public function __construct($tableID)
	{
		$this->clear();
		$this->tableID = $tableID;
	}
	protected function getFilePath($fieldID, $lineID, $nameFile)
	{
		$file_path = get_file_path($fieldID, $lineID, $nameFile);
		return $file_path;
	}
	/**
	 * Копирует все файлы из полей инициализированных через WorksWithFilesCB::addFieldOne  в другое поле
	 * Стоит отметить, что файлы будут добавлятся к уже существующим.
	 * Если необходимо полностью заменить на новые используется WorksWithFilesCB::replaceAllFiles
	 *
	 * @param int $destTableID айди таблицы в которую нужно скопировать
	 * @param int $destFieldName айди поля в таблице в которое нужно скопировать
	 * @param int $destLineID айди строки куда копировать
	 * @throws Exception
	 */
	protected function copy($destTableID, $destFieldName, $destLineID)
	{
		//Выбираем все файлы из полей
		$fields = $this->getFieldsSource();
		if (count($fields)) {
			//Получаем список уже существующих файлов в строке назначения
			$listFiles = $this->explodeFiles($destTableID, $destFieldName, $destLineID);
			$destFieldID = substr($destFieldName, 1);
			foreach ($fields as $value) {
				$nameField = $value['field'];
				$fieldID = substr($nameField, 1);
				//Получаем список файлов которые необходимо копировать
				$files = $this->explodeFiles($this->tableID, $nameField, $this->lineID);
				foreach ($files as $file) {
					$destFieldID = substr($destFieldName, 1);
					//Путь к файлу источнику
					$file_path_old = $this->getFilePath($fieldID, $this->lineID, $file);
					//Путь к файлу назначения
					$file_path_new = $this->getFilePath($destFieldID, $destLineID, $file);
					//Создаем необходимую структуру директорий
					create_data_file_dirs($destFieldID, $destLineID, $file);
					//Копируем файл
					if (copy($file_path_old, $file_path_new)) {
						//дополняем список
						$listFiles[] = $file;
					}
				}
			}
			$upd[$destFieldName] = implode("\r\n", $listFiles);
			data_update($destTableID, EVENTS_ENABLE, $upd, "`id` = ", $destLineID);
		} else {
			throw new Exception("Необходимо указать поле, из которого будет производится копирование");
		}
	}
	/**
	 * Возвращает список файлов которые находятся в поле
	 *
	 * @param int $tableID
	 * @param string $fieldName
	 * @param int $lineID
	 * @return array
	 * @throws Exception
	 */
	protected function explodeFiles($tableID, $fieldName, $lineID)
	{
		//Получаем список файлов в поле назначения
		$result = data_select_field($tableID, $fieldName, "`id` = ", $lineID, " LIMIT 1");
		if (sql_num_rows($result)) {
			$row = sql_fetch_assoc($result);
			//Парсим перечень файлов.
			if (strlen(trim($row[$fieldName])))
				return explode("\r\n", $row[$fieldName]);
			else
				return array();
		} else {
			throw new Exception("В поле " . $fieldName . " не удалось найти запись с ID " . $lineID . " в таблице " . $tableID);
		}
	}
	/**
	 * @param $tableID
	 * @param $fieldName
	 * @param $lineID
	 */
	protected function delFilesInFields($tableID, $fieldName, $lineID)
	{
		$fieldID = substr($fieldName, 1);
		$result = data_select_field($tableID, $fieldName, "`id` = ", $lineID);
		//Если была найдена строка
		if (sql_num_rows($result) > 0) {
			$row = sql_fetch_assoc($result);
			$files = explode("\r\n", $row[$fieldName]);
			foreach ($files as $file) {
				$file_path = $this->getFilePath($fieldID, $lineID, $file);
				@unlink($file_path);
			}
			data_update($tableID, array($fieldName => ''), "`id` = ", $lineID);
		}
	}
	public function clear()
	{
		$this->tableID = NULL;
		$this->fieldsSource = array();
		$this->lineID = NULL;
	}
	public function setLineID($lineID)
	{
		$this->lineID = intval($lineID);
	}
	public function getLineID()
	{
		return $this->lineID;
	}
	public function setTableID($tableID)
	{
		$this->tableID = $tableID;
	}
	public function getTableID()
	{
		return $this->tableID;
	}
	/**
	 * Добавление поля, откуда будут копироватся файлы
	 *
	 * @param $field
	 * @param int $type
	 */
	public function addFieldOne($field, $type = WorksWithFilesCB::TYPE_IMG)
	{
		array_push($this->fieldsSource, array('field' => $field, 'type' => $type));
	}
	/**
	 * Удаление поля, откуда будут копироватся файлы
	 *
	 * @param string $field имя поля, например f1292.
	 */
	public function delFieldOne($field)
	{
		foreach ($this->fieldsSource as $key => $value) {
			if ($field == $value['field'])
				unset($this->fieldsSource[$key]);
		}
	}
	public function getFieldsSource()
	{
		return $this->fieldsSource;
	}
	/**
	 * Копирует все файлы из полей инициализированных через WorksWithFilesCB::addFieldOne  в поле $destFieldName
	 * Стоит отметить, что все файлы в поле назначении перед добавлением новых файлов удаляются.
	 * Если необходимо полностью заменить на новые используется WorksWithFilesCB::replace
	 *
	 * @param int $destTableID айди таблицы в которую нужно скопировать
	 * @param int $destFieldName айди поля в таблице в которое нужно скопировать
	 * @param int $destLineID айди строки куда копировать
	 * @throws Exception
	 */
	public function replaceAllFiles($destTableID, $destFieldName, $destLineID)
	{
		$this->delFilesInFields($destTableID, $destFieldName, $destLineID);
		$this->copy($destTableID, $destFieldName, $destLineID);
	}
	/**
	 * Копирует все файлы из полей инициализированных через WorksWithFilesCB::addFieldOne  в другое поле
	 * Стоит отметить, что файлы будут добавлятся к уже существующим.
	 * Если необходимо полностью заменить на новые используется WorksWithFilesCB::replaceAllFiles
	 *
	 * @param int $destTableID айди таблицы в которую нужно скопировать
	 * @param int $destFieldName айди поля в таблице в которое нужно скопировать
	 * @param int $destLineID айди строки куда копировать
	 * @throws Exception
	 */
	public function copyAllFiles($destTableID, $destFieldName, $destLineID)
	{
		$this->copy($destTableID, $destFieldName, $destLineID);
	}
} 

Сообщение отредактировал AntonKravchenko: 08 Февраль 2017 - 09:46


#3 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 08 Февраль 2017 - 10:14

// удаляем файл на диске
drop_data_file(111, $line['ID'], $line['Файл']); // вместо 111 подставляете id поля Файл
// удаляем файл из поля
$line['Файл'] = "";

Это код в случае если файл в поле один. Если их может быть несколько, он несколько усложняется, т.к. нужен цикл удаления по всем файлам.

#4 AntonKravchenko

    Активный участник

  • Пользователи
  • PipPipPip
  • 153 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород

Отправлено 09 Февраль 2017 - 15:44

да, спасибо, эта информация + изменение логики работы вычисления очень помогли

#5 wondertalik

    Активный участник

  • Пользователи
  • PipPipPip
  • 1 159 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 10 Февраль 2017 - 10:41

Просмотр сообщенияAntonKravchenko (09 Февраль 2017 - 15:44) писал:

да, спасибо, эта информация + изменение логики работы вычисления очень помогли

protected function delFilesInFields($tableID, $fieldName, $lineID)
        ...
}
Измените protected на public. И можете использовать этот метод. Вызов в одну строку без цикла.





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных