Chudo Posted April 7 Report Share Posted April 7 (edited) Господа, всем привет) Подскажите пожалуйста, может кто уже сталкивался с подобной задачей на Simpla? Хочу реализовать возможность скачивать генерить PDF файлы на основе данных из карточки товара с помощью TCPDF или mpdf? Подскажите, в какие директории нужно внести корректировки? Код я как-нибудь напишу, но в систему построения модуля никак не врублюсь. При собственных попытках внедрения постоянно упираюсь в ошибку 500, судя по всему из за неправильного размещения кода. Edited April 7 by Chudo UPDATE: TCPDF Quote Link to post Share on other sites
Chudo Posted April 7 Author Report Share Posted April 7 (edited) Создаю я значит generate_pdf.php в корне проекта <?php require_once '/vendor/tecnickcom/tcpdf/tcpdf.php'; // Путь к файлу TCPDF // Создание нового PDF документа $pdf = new TCPDF(); // Добавление страницы $pdf->AddPage(); // Установка шрифта $pdf->SetFont('dejavusans', '', 12); // Формирование HTML-контента $htmlContent = <<<EOD <h1>{$product['name']}</h1> EOD; // Вывод HTML-контента в PDF $pdf->writeHTML($htmlContent, true, false, true, false, ''); // Вывод PDF $pdf->Output('product_info.pdf', 'I'); И кнопку в product.tpl <a href="generate_pdf.php?product_id={$product->id}" target="_blank">Скачать PDF</a> В итоге данные не передаются из карточки товара =( Edited April 7 by Chudo Quote Link to post Share on other sites
Chudo Posted April 7 Author Report Share Posted April 7 (edited) 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 поля Edited April 7 by Chudo Quote Link to post Share on other sites
Chudo Posted April 7 Author Report Share Posted April 7 Как бы получить изображение в pdf, хотя бы первое, подскажете плиз) Quote Link to post Share on other sites
Chudo Posted April 7 Author Report Share Posted April 7 (edited) Названия файлов уже получает) В .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>"; } Edited April 7 by Chudo Quote Link to post Share on other sites
Chudo Posted April 7 Author Report Share Posted April 7 (edited) Ну в общем получилось: Подключаем 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> Edited April 7 by Chudo Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.