3
Присвоить поле картинка из одной таблицы в другую
Автор alexols, 24 мая 2016 13:24
Сообщений в теме: 6
#1
Отправлено 24 Май 2016 - 13:24
Приветствую, есть ли более простой способ копирования поля типа картинка из одной таблица в другую.
простое присвоение
$line['Фото'] = $row['photo'];
понятно дело не работает, пишет файл не найден.
Представление о том что делать имею из этой ветки https://clientbase.r...l=&fromsearch=1
Может есть специальные функции для работы с этим типом полей которые могут облегчить эту задачу ?
простое присвоение
$line['Фото'] = $row['photo'];
понятно дело не работает, пишет файл не найден.
Представление о том что делать имею из этой ветки https://clientbase.r...l=&fromsearch=1
Может есть специальные функции для работы с этим типом полей которые могут облегчить эту задачу ?
#2
Отправлено 24 Май 2016 - 13:43
кто-то из коллег выкладывал ранее такие функции.
Мы использовали их так:
1. В поле Номенклатура в таблице "Позиции заявки" на изменение этого поля поставили вычисление
Мы использовали их так:
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
Отправлено 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
Отправлено 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
Отправлено 24 Май 2016 - 17:08
Uncaught exception 'Exception' with message 'В поле f14290 не удалось найти запись с ID 0 в таблице 720
такое сообщение об ошибке не пойму почему 0, если закатать $row['ID'] в любое поле то там будет 1.
такое сообщение об ошибке не пойму почему 0, если закатать $row['ID'] в любое поле то там будет 1.
#6
Отправлено 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']."'");
$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']."'");
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных