<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
	<channel>
		<title>cotonti.com : [Решено] Как привязать изображения модулю Files, которые сохраняются по url</title>
		<link>https://www.cotonti.com</link>
		<description>Останні повідомлення в темі</description>
		<generator>Cotonti</generator>
		<language>en</language>
		<pubDate>Sun, 12 Apr 2026 01:46:23 -0000</pubDate>

		<item>
			<title>prostogorod</title>
			<description><![CDATA[<p>Требовало, добавил еще</p>

<pre class="brush:php;">
use cot\modules\files\services\FileService;
</pre>

<p>Спасибо за помощь! Заработало. Файлы прикрепляет, теперь нужно осознать, что с этим можно еще сделать.</p>
]]></description>
			<pubDate>Нд, 10 Лис 2024 15:22:37 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=9374&d=0#post48150]]></link>
		</item>
		<item>
			<title>Alex300</title>
			<description><![CDATA[<p>Забыл написать. В начале php-файла надо добавить:</p>

<pre class="brush:php;">
use cot\modules\files\models\File;</pre>

<p>Примерно так:</p>

<pre class="brush:php;">
&lt;?php

use cot\modules\files\models\File;

defined('COT_CODE') or die('Wrong URL.');</pre>

<p> </p>

<blockquote>
<p>Для каждого товара, может быть одно или несколько изображений.</p>
</blockquote>

<p>Несколько</p>
]]></description>
			<pubDate>Нд, 10 Лис 2024 11:50:50 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=9374&d=0#post48149]]></link>
		</item>
		<item>
			<title>prostogorod</title>
			<description><![CDATA[<p>Спасибо! Буду пробовать. Но у меня сразу ошибка:</p>

<pre class="brush:php;">
Fatal error: Uncaught Error: Class "File" not found in ...</pre>

<p>Я так понимаю нужно еще дополнительно класс File подключить?</p>

<p>Такого подключения не достаточно?</p>

<pre class="brush:php;">
require_once cot_incfile('files', 'module'); </pre>

<p> </p>

<p> И еще вдогонку вопрос, по коду не понял. Для каждого товара, может быть одно или несколько изображений.  Я это учитываю, и у меня переменная - $id_attach, которая считает количество изображений для каждого товара. Как эту переменную учитывать, на примере Вашего кода?<br />
 </p>

<pre class="brush:php;">
 $imageFileName = 'image-'. $id . '-' .  $id_attach . '-' . uniqid() . '.jpg';</pre>

<p> </p>
]]></description>
			<pubDate>Сб, 09 Лис 2024 18:16:04 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=9374&d=0#post48148]]></link>
		</item>
		<item>
			<title>Alex300</title>
			<description><![CDATA[<p>Судя по коду Вы загружаете изображение в память, а потом записываете на диск. Можно использовать функцию <code>copy()</code>. Она умеет копировать удаленные файлы.</p>

<pre class="brush:php;">
if (@copy('http://someserver.com/somefile.jpg','./somefile.jpg')) {
        echo "File copied from remote!";
} else {
    $errors = error_get_last(); 
    echo 'COPY ERROR: ' . $errors['type']; 
    echo '&lt;br /&gt;\n' . $errors['message'];
}</pre>

<p>Сэкономите память не загружая в нее данные, которые не собираетесь обрабатывать. Фактически файл при скачивании все равно будет загружен в память, но при сохранении на диск память будет освобождена. И это не расходует память, выделяемую скрипту на выполнение.</p>

<blockquote>
<pre>
// Проверяем, сохранилось ли изображение
if (file_exists($fullImagePath))
</pre>
</blockquote>

<p>Это лишнее. Функция <code>copy()</code> вернет <code>TRUE</code> в случае успеха и <code>FALSE</code> в противном случае. Достаточно проверить результат выполнения функции.</p>

<p>PHP в режиме <a href="https://www.php.net/manual/ru/features.commandline.php" rel="nofollow" target="_blank" rel="nofollow noreferrer noopener">командной строки</a> как правило не имеет ограничений по памяти и времени выполнения. <a href="https://github.com/Alex300/cotonti-lib/blob/master/cli.php" rel="nofollow" target="_blank" rel="nofollow noreferrer noopener">Этот компонент</a> позволяет запускать Cotonti из командной строки.</p>

<p>Не накапливайте в памяти ненужные данные. После обработки каждого товара в памяти не должно оставаться "мусора". Ненужные более данные должны быть удалены или перезаписаны следующим товаром.</p>

<p> </p>

<p>Модуль файлов используется в основном для удобной загрузки файлов и привязки их к объектам (страницы, посты, товары и т.п.) через веб интерфейс и для удобного вывода файлов в веб интерфейсе. Загрузка у Вас автоматизирована. Если вы не собираетесь выводить каталог товаров в браузер - особого смысла нет.</p>

<p> </p>

<p>Если он все же нужен, у него нет отдельного метода для сохранения файла, который существует локально (надо бы сделать). Но можно написать примерно так:<br />
 </p>

<pre class="brush:php;">
// $fullImagePath - Путь к файлу локально из Вашего примера

$file = new File();
$file-&gt;original_name = $originalName; // Исходное имя файла (используется для отображения пользователю)
$file-&gt;user_id = $uid;
$file-&gt;source = 'shop';
$file-&gt;source_id = $product-&gt;id; // ID сохраненного товара
$file-&gt;ext = mb_strtolower(cot_filesGetExtension($fullImagePath));
$file-&gt;mime_type = mime_content_type($fullImagePath);
$file-&gt;is_img = 1;
$file-&gt;size = filesize($fullImagePath));


Cot::$db-&gt;beginTransaction();
try {
	$fileId = $file-&gt;save();
	if (!fileId) {
		throw new Exception('Ошибка при сохранении');
	}
	
	// Path relative to files root directory
	$relativeFileName = FileService::generateFileRelativePath($objFile);
	$file-&gt;path = dirname($relativeFileName);
	$file-&gt;file_name = basename($relativeFileName);
	$file-&gt;filesystem_name = FileService::getFilesystemName($file-&gt;source, $file-&gt;source_field);
	 
	// Path relative to site root directory
	$fileFullName = Cot::$cfg['files']['folder'] . '/' . $relativeFileName;
	if (!@rename($fullImagePath, $fileFullName)) {
		throw new Exception('Ошибка при сохранении');
	} 
	 
	$file-&gt;save();
	 
    Cot::$db-&gt;commit();
} catch(\Throwable $e) {
    Cot::$db-&gt;rollBack();
    // не удалось сохранить файл;
}</pre>

<p> </p>
]]></description>
			<pubDate>Сб, 09 Лис 2024 07:19:43 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=9374&d=0#post48147]]></link>
		</item>
		<item>
			<title>prostogorod</title>
			<description><![CDATA[<p>Пишу скрипт обработки xml-файла. С категориями и почти с товарами разобрался. Осталось реализовать прикрепление изображение к товарам. Вернее дошел до того, что все изображения товаров сохраняю на сервер по url. Но я хочу привязать к модулю Files.<br />
Пожалуйста, подскажите, какие функции использовать в модуле Files для сохранения изображений? Какая последовательность?<br />
А лучше кратко в виде кода, так будет более понятней)) Спасибо!</p>

<pre class="brush:php;">
// Получаем содержимое изображения
$imageContent = fetchImage((string)$pictureUrl);

// Генерируем уникальное имя файла
$imageFileName = 'image_' . uniqid() . '.jpg';
$fullImagePath = $savePath . '/' . $imageFileName;   /////////////////

// Сохраняем изображение в файл
file_put_contents($fullImagePath, $imageContent);

// Проверяем, сохранилось ли изображение
if (file_exists($fullImagePath)) 
{
    if (cot_module_active('files')) 
    {
        require_once cot_incfile('files', 'module'); 
        ......
    }

}</pre>

<p> </p>

<p>P.S. Хочу учесть, один нюанс. Товары уже загружены, теперь нужно прикрепить изображение к ним. Я изначально разделил обработку на добавление категорий, потом товаров и теперь изображений. Вообще вся задача обработки xml-файла ресурсоёмкая. Что еще посоветуете сделать, чтобы процесс ускорить и минимизировать ресурсы сервера? В том числе и при обработке изображений?</p>
]]></description>
			<pubDate>Пт, 08 Лис 2024 16:03:06 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=9374&d=0#post48146]]></link>
		</item>
	</channel>
</rss>