Jump to content

Генерация и скачивание PDF на основе данных из карточки товара


Recommended Posts

Господа, всем привет)

Подскажите пожалуйста, может кто уже сталкивался с подобной задачей на Simpla?

Хочу реализовать возможность скачивать генерить PDF файлы на основе данных из карточки товара с помощью TCPDF или mpdf?

Подскажите, в какие директории нужно внести корректировки? 
Код я как-нибудь напишу, но в систему построения модуля никак не врублюсь. 
При собственных попытках внедрения постоянно упираюсь в ошибку 500, судя по всему из за неправильного размещения кода. 

Edited by Chudo
UPDATE: TCPDF
Link to post
Share on other sites
Posted (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 by Chudo
Link to post
Share on other sites
Posted (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 by Chudo
Link to post
Share on other sites
Posted (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 by Chudo
Link to post
Share on other sites
Posted (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 by Chudo
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...