-
Новые сообщения
-
В 13.03.2024 в 08:32, 6cnitymi сказал:
Добрый день!
Есть у кого-нибудь возможность залить повторно?
Или выложить содержимое файла Files.php?
Спасибо!<?php require_once('Simpla.php'); class Files extends Simpla { private $allowed_extentions = array('pdf', 'txt', 'doc', 'docx', 'xls', 'xlsx', 'mp4', 'mp3', 'psd', 'ai', 'zip', 'rar'); public function __construct() { parent::__construct(); } function get_files($filter = array()) { $object_id_filter = ''; $type_filter = ''; if(!empty($filter['object_id'])) $object_id_filter = $this->db->placehold('AND f.object_id in(?@)', (array)$filter['object_id']); if(!empty($filter['type'])) $type_filter = $this->db->placehold('AND f.type=?', $filter['type']); // files $query = $this->db->placehold("SELECT f.id, f.name, f.object_id, f.filename, f.type, f.position FROM __files AS f WHERE 1 $object_id_filter $type_filter ORDER BY f.object_id, f.position"); $this->db->query($query); return $this->db->results(); } public function add_file($object_id, $type, $filename, $name = '') { $query = $this->db->placehold("SELECT id FROM __files WHERE object_id=? AND type=? AND filename=?", $object_id, $type, $filename); $this->db->query($query); $id = $this->db->result('id'); if(empty($id)) { $query = $this->db->placehold("INSERT INTO __files SET object_id=?, type=?, filename=?", $object_id, $type, $filename); $this->db->query($query); $id = $this->db->insert_id(); $query = $this->db->placehold("UPDATE __files SET position=id WHERE id=?", $id); $this->db->query($query); } return($id); } public function update_file($id, $file) { $query = $this->db->placehold("UPDATE __files SET ?% WHERE id=?", $file, $id); $this->db->query($query); return($id); } public function delete_file($id) { $query = $this->db->placehold("SELECT filename FROM __files WHERE id=?", $id); $this->db->query($query); $filename = $this->db->result('filename'); $query = $this->db->placehold("DELETE FROM __files WHERE id=? LIMIT 1", $id); $this->db->query($query); $query = $this->db->placehold("SELECT count(*) as count FROM __files WHERE filename=? LIMIT 1", $filename); $this->db->query($query); $count = $this->db->result('count'); if($count == 0) { $file = pathinfo($filename, PATHINFO_FILENAME); $ext = pathinfo($filename, PATHINFO_EXTENSION); @unlink($this->config->root_dir.$this->config->cms_files_dir.$filename); } } public function upload_file($filename, $name) { // Имя оригинального файла $name = $this->correct_filename($name); $uploaded_file = $new_name = pathinfo($name, PATHINFO_BASENAME); $base = pathinfo($uploaded_file, PATHINFO_FILENAME); $ext = pathinfo($uploaded_file, PATHINFO_EXTENSION); if(in_array(strtolower($ext), $this->allowed_extentions)) { while(file_exists($this->config->root_dir.$this->config->cms_files_dir.$new_name)) { $new_base = pathinfo($new_name, PATHINFO_FILENAME); if(preg_match('/_([0-9]+)$/', $new_base, $parts)) $new_name = $base.'_'.($parts[1]+1).'.'.$ext; else $new_name = $base.'_1.'.$ext; } if(move_uploaded_file($filename, $this->config->root_dir.$this->config->cms_files_dir.$new_name)) return $new_name; } return false; } public function correct_filename($filename) { $ru = explode('-', "А-а-Б-б-В-в-Ґ-ґ-Г-г-Д-д-Е-е-Ё-ё-Є-є-Ж-ж-З-з-И-и-І-і-Ї-ї-Й-й-К-к-Л-л-М-м-Н-н-О-о-П-п-Р-р-С-с-Т-т-У-у-Ф-ф-Х-х-Ц-ц-Ч-ч-Ш-ш-Щ-щ-Ъ-ъ-Ы-ы-Ь-ь-Э-э-Ю-ю-Я-я"); $en = explode('-', "A-a-B-b-V-v-G-g-G-g-D-d-E-e-E-e-E-e-ZH-zh-Z-z-I-i-I-i-I-i-J-j-K-k-L-l-M-m-N-n-O-o-P-p-R-r-S-s-T-t-U-u-F-f-H-h-TS-ts-CH-ch-SH-sh-SCH-sch---Y-y---E-e-YU-yu-YA-ya"); $res = str_replace($ru, $en, $filename); $res = preg_replace("/[\s]+/ui", '-', $res); $res = preg_replace("/[^a-zA-Z0-9\.\-\_]+/ui", '', $res); $res = strtolower($res); return $res; } }
-
Ну в общем получилось:
Подключаем composer require tecnickcom/tcpdf
Если нет composer, то устанавливаем его.
В корне проекта создаём generate_pdf.php<?php require_once '/vendor/tecnickcom/tcpdf/tcpdf.php'; $pdf = new TCPDF(); // Вертикальный отступ после шапки $pdf->Ln(5); $pdf->SetCreator(PDF_CREATOR); $pdf->SetAuthor('Название сайта'); $pdf->SetTitle('Информация о продукте'); $pdf->SetSubject('Экспорт информации о товаре в PDF'); $pdf->SetFont('dejavusans', '', 10, '', true); $pdf->AddPage(); $pdf->SetY(15); // Логотип $logoFile = 'https://прямой_путь_до/logo.png'; $logoWidth = 70; $pdf->Image($logoFile, $pdf->GetX(), $pdf->GetY(), $logoWidth, '', 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false); $productData = [ 'url' => $_POST['url'] ?? 'Недоступно', ]; // Информация о компании $companyInfo = '<h3>Название проекта</h3> <p>Сайт: <a href="ссылка">название</a></p> <p>Ссылка на товар: <a href="https://прямой_путь_до/products/' . $productData['url'] . '">смотреть</a></p>'; $pdf->writeHTMLCell(0, 0, $pdf->GetX() + $logoWidth - 10, $pdf->GetY(), $companyInfo, 0, 1, 0, true, 'L', true); // Добавление горизонтальной линии $pdf->SetDrawColor(0, 0, 0); $pdf->SetLineWidth(0.5); $yPosition = $pdf->GetY() + 10; $pdf->Line($pdf->GetX(), $yPosition, $pdf->GetPageWidth() - $pdf->GetX(), $yPosition); // Установка новой Y-позиции после линии для начала контента $pdf->SetY($yPosition + 5); // Извлечение данных из POST $productData = [ 'name' => $_POST['name'] ?? 'Недоступно', 'description' => $_POST['description'] ?? 'Недоступно', ]; // Формирование HTML-контента для PDF $htmlContent = ""; // Имя продукта if (!empty($_POST['name'])) { // Очистка строки от нежелательных символов и сокращение до 50 символов $safeName = mb_substr(trim($_POST['name']), 0, 50); $safeName = preg_replace('/[^A-Za-z0-9А-Яа-яёЁ\s\-]/u', '', $safeName); $safeName = str_replace(' ', '_', $safeName); } else { $safeName = 'Недоступно'; } // Описание if (!empty($productData['description'])) { $htmlContent .= "<p><strong>Описание:</strong> {$productData['description']}</p>"; } // Вывод HTML-контента в PDF $pdf->writeHTML($htmlContent, true, false, true, false, ''); // Вывод каждого изображения после текста $pageWidth = $pdf->GetPageWidth() - $pdf->getMargins()['left'] - $pdf->getMargins()['right']; // ширина страницы минус поля $imageWidth = $pageWidth * 1; $marginTop = 4; $marginBottom = 4; foreach ($_POST['images'] as $imageFilename) { $imageUrl = 'https://прямой_путь_до/files/originals/' . $imageFilename; if (@getimagesize($imageUrl)) { // Добавление отступа сверху $pdf->Ln($marginTop); // Получение размеров изображения $sizes = getimagesize($imageUrl); // Вычисление высоты изображения, сохраняя пропорции $imageHeight = $imageWidth * $sizes[1] / $sizes[0]; // Добавление изображения и выравнивание его по центру $pdf->Image($imageUrl, ($pageWidth - $imageWidth) / 2, '', $imageWidth, $imageHeight, 'JPG', '', 'T', false, 300, 'C', false, false, 1, false, false, false); // Добавление отступа снизу $pdf->Ln($imageHeight + $marginBottom); } } // После добавления всего контента, футер на последней странице $pdf->lastPage(); // Установка Y-позиции для футера $footerY = $pdf->GetPageHeight() - 24; $pdf->SetY($footerY); // Установка шрифта для футера $pdf->SetFont('dejavusans', '', 9); // Текст футера и ссылки $footerContent = 'Посетите наш сайт: <a href="ссылка">ссылка</a>'; // Добавление футера на страницу $pdf->writeHTMLCell(0, 0, '', '', $footerContent, 0, 1, 0, true, 'C', true); $fileName = "SITE_экспорт_информации_о_товаре_{$safeName}.pdf"; // Вывод документа $pdf->Output($fileName, 'I');
Необходимо прописать относительный путь до файлов (https://прямой_путь_до) и вставить ссылки на свой проект
И в product.tpl воткнуть форму сбора информации<form action="generate_pdf.php" method="post" target="_blank"> <input type="hidden" name="url" value="{$product->url|escape}"> <input type="hidden" name="name" value="{$product->name|escape}"> <input type="hidden" name="description" value="{$product->body|escape}"> <!-- Для фотографий: предполагаем, что у вас есть массив $product->images с URL-адресами --> {foreach from=$product->images item=image} <input type="hidden" name="images[]" value="{$image->filename|escape}"> {/foreach} <button type="submit">Скачать PDF</button> </form>
-
Названия файлов уже получает)
В .tpl{foreach from=$product->images item=image} <input type="hidden" name="images[]" value="{$image->filename|escape}"> {/foreach}
и в php
// Добавление названий изображений if (!empty($_POST['images'])) { $htmlContent .= "<h2>Изображения товара:</h2><ul>"; foreach ($_POST['images'] as $image) { $filename = basename($image); // Извлекаем имя файла из полного пути $htmlContent .= "<li>{$filename}</li>"; // Добавляем только имя файла в список } $htmlContent .= "</ul>"; }
-
Как бы получить изображение в pdf, хотя бы первое, подскажете плиз)
-
generate_pdf
<?php require_once '/vendor/tecnickcom/tcpdf/tcpdf.php'; // Путь к файлу TCPDF $productData = [ 'id' => $_POST['id'], 'url' => $_POST['url'], 'name' => $_POST['name'], // Заполните остальные данные ]; $pdf = new TCPDF(); $pdf->AddPage(); $pdf->SetFont('dejavusans', '', 12); $htmlContent = "<h1>{$productData['name']}</h1> <p><strong>ID:</strong> {$productData['id']}</p> <p><strong>URL:</strong> {$productData['url']}</p> $pdf->writeHTML($htmlContent, true, false, true, false, ''); $pdf->Output('product_info.pdf', 'I');
и кнопка в tpl
<form action="generate_pdf.php" method="post" target="_blank"> <input type="hidden" name="id" value="{$product->id|escape}"> <input type="hidden" name="url" value="{$product->url|escape}"> <input type="hidden" name="name" value="{$product->name|escape}"> <button type="submit">Скачать PDF</button> </form>
Начал выводить ID, url и name поля
Изменено пользователем Chudo
-
-
Новые темы
-
Генерация и скачивание PDF на основе данных из карточки товара
От Chudo, в Общие вопросы по функционалу и дизайну
- 5 ответов
- 221 просмотр
-
Как сделать фильтр товара на главной по 3 свойствам?
От megauser, в Общие вопросы по функционалу и дизайну
- 4 ответа
- 466 просмотров
-
- 1 ответ
- 797 просмотров
-
- 1 ответ
- 645 просмотров
-
- 4 ответа
- 678 просмотров
-
Форумы
-
Simpla CMS
-
- 1.2т
- сообщения
-
- 534
- сообщения
-
- 60.6т
- сообщение
-
- 10.7т
- сообщения
-
- 6.8т
- сообщения
-
-
Дизайн и шаблоны
-
- 455
- сообщений
-
- Smartyflower
- От Noxter,
-
- 1.9т
- сообщений
-
-
Платные модули и услуги
-
- 4т
- сообщение
-
- 1.4т
- сообщений
-
- 510
- сообщений
-
- От Dmitry86,
-
-
Разное
-
- 447
- сообщений
-
- 309
- сообщений
-
- 143
- сообщения
-
-
Кто в онлайне 1 пользователь, 0 анонимных, 192 гостя (Посмотреть всех)
-
Статистика пользователей