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


Присвоить поле картинка из одной таблицы в другую


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

#1 alexols

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

  • Пользователи
  • PipPipPip
  • 48 сообщений

Отправлено 24 Май 2016 - 13:24

Приветствую, есть ли более простой способ копирования поля типа картинка из одной таблица в другую.
простое присвоение
$line['Фото'] = $row['photo'];
понятно дело не работает, пишет файл не найден.
Представление о том что делать имею из этой ветки https://clientbase.r...l=&fromsearch=1

Может есть специальные функции для работы с этим типом полей которые могут облегчить эту задачу ?

#2 AntonKravchenko

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

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

Отправлено 24 Май 2016 - 13:43

кто-то из коллег выкладывал ранее такие функции.
Мы использовали их так:
1. В поле Номенклатура в таблице "Позиции заявки" на изменение этого поля поставили вычисление
if (!empty($line['Позиция']['Цвет'])) {
	$line['Цвет'] = '';	  // сначала удаляем нынешний цвет
	// используем функцию WorksWithFilesCB от Wondertalik с форума

  $mf = new WorksWithFilesCB(91);	// 91 - id таблицы с номенклатурой
	//  дальше указываем поля из которых нужно скопировать
  $mf->addFieldOne(f6911);

	//  указываем что копируем из строки с id = $line['Позиция']['ID']
  $mf->setLineID($line['Позиция']['ID']);

	// Копируем файлы (добавление файлов к уже существующим)
	// public function copyAllFiles($destTableID, $destFieldName, $destLineID)
  $mf->copyAllFiles(281, f7441, $ID);
  $mf->copyAllFiles(130, f7861, $line['Заявка']['ID']);
}

Сообщение отредактировал AntonKravchenko: 24 Май 2016 - 13:44


#3 AntonKravchenko

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

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

Отправлено 24 Май 2016 - 13:43

2. сами функции работы с файлами поместили в include/functions_custom.php:
<?php
/**
* Класс предоставляет методы для копирования уже загруженных в КБ файлов
* из одного или нескольких полей в одно любое другое.
*
* 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: 24 Май 2016 - 13:44


#4 alexols

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

  • Пользователи
  • PipPipPip
  • 48 сообщений

Отправлено 24 Май 2016 - 16:33

Спасибо за код !!!!!
Немного не получается так работает:

$mf = new WorksWithFilesCB(720);	   // 720 - id таблицы с фото
//  дальше указываем поля из которых нужно скопировать
$mf->addFieldOne(f14290);
//  указываем что копируем из строки с id =
$mf->setLineID(1);
// заменяем файлы
$mf->replaceAllFiles(180, f14300, $ID);
А так нет:


$result = data_select_field(720, "id", "f14270='".$line['ИмяПоляПоиска']."' AND f14280='".$line['ИмяПоляПоиска1']."'");
$row = sql_fetch_assoc($result);

$mf = new WorksWithFilesCB(720);	   // 720 - id таблицы с фото
//  дальше указываем поля из которых нужно скопировать
$mf->addFieldOne(f14290);

//  указываем что копируем из строки с id =
$mf->setLineID($row['ID']);

// заменяем файлы
// public function replaceAllFiles($destTableID, $destFieldName, $destLineID)
$mf->replaceAllFiles(180, f14300, $ID);
Понимаю что дело тут $row['ID'], вообще был уверен что эта конструкция вернет ID записи из таблицы поиска. Но видимо что то не так, не могу понять что.

Сообщение отредактировал alexols: 24 Май 2016 - 16:53


#5 alexols

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

  • Пользователи
  • PipPipPip
  • 48 сообщений

Отправлено 24 Май 2016 - 17:08

Uncaught exception 'Exception' with message 'В поле f14290 не удалось найти запись с ID 0 в таблице 720
такое сообщение об ошибке не пойму почему 0, если закатать $row['ID'] в любое поле то там будет 1.

#6 alexols

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

  • Пользователи
  • PipPipPip
  • 48 сообщений

Отправлено 24 Май 2016 - 17:46

вроде разобрался нужно тут:
$result = data_select_field(720,"id","f14270='".$line['ИмяПоляПоиска']."' AND f14280='".$line['ИмяПоляПоиска1']."'");
указывать альяс
$result = data_select_field(720,"id as Id","f14270='".$line['ИмяПоляПоиска']."' AND f14280='".$line['ИмяПоляПоиска1']."'");

#7 wondertalik

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

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

Отправлено 25 Май 2016 - 13:17

Код мой исходники вот. Там же и примеры есть. По свободе буду заглядывать в ветку.

$mf->setLineID($row['id']);

Регистр важен.

Сообщение отредактировал wondertalik: 25 Май 2016 - 13:18






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

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