Начало

Давайте начинать. Первое, что нам нужно будет сделать — это настройка локального сервера Open Server (или аналоги). Ну либо вы можете сразу на хостинг выполнять данные действия, тут уж как удобно.

Создаем в папке domains папку проекта, убеждаемся что версия PHP 7.1 или выше, и все будет хорошо.

Создаем в папке два файла — index.html, word.php и добавляем файлик-шаблон в формате docx (его можно найти по ссылке на гитхаб внизу поста).

Устанавливаем библиотеку

Мы будем использовать библиотеку PHPWord для нашей реализации. Скачать ее просто кнопкой download нельзя, нужно будет ставить специальную утилиту composer. По факту, это тоже самое что npm, но только для PHP.

При установке composer вас попросят выбрать специальный файлик php, который соответствует выбранной версии языка. Идем в OSPanel/modules/php/ваша_версия и находим там файлик php.exe, его и выбираем.

Ну и после установки composer вы можете использовать консоль OSPanel для установки этой утилиты. Все происходит также, как при npm — composer require phpoffice/phpword. Не забудьте через консоль перейти в нужную папку.

Более детально и наглядно процесс установки показан на видео в начале поста.

Пишем HTML

<form action="word.php" method="POST" enctype="multipart/form-data">
<input type="date" name="birth">
<input type="text" name="name" placeholder="Введите ФИО">
<input type="tel" name="tel" placeholder="Введите телефон" required>
<input type="text" name="city" placeholder="Введите город">
<input type="text" name="purpose" placeholder="Введите цель">
<input type="number" name="startYear" placeholder="Введите начальный год обучения">
<input type="number" name="lastYear" placeholder="Введите конечный год обучения">
<input type="text" name="university" placeholder="Введите университет">
<input type="file" name="file">
<textarea name="about" id="" cols="30" rows="10" placeholder="О себе"></textarea>
<button type="submit">Отправить</button>
</form>

Просто форма, у которой несколько полей, у каждого есть name, который и свяжет нашу разметку и php-код.

Настройка шаблона

Этот процесс лучше посмотреть на видео, чем описать словами.

PHP-обработчик

require_once 'vendor/autoload.php';

$document = new \PhpOffice\PhpWord\TemplateProcessor('./review.docx');

$uploadDir = __DIR__;
$outputFile = 'review_full.docx';

$uploadFile = $uploadDir . '\\' . basename($_FILES['file']['name']);
move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile);

$birthdate = $_POST['birth'];
$name = $_POST['name'];
$tel = $_POST['tel'];
$city = $_POST['city'];
$purpose = $_POST['purpose'];
$startYear = $_POST['startYear'];
$lastYear = $_POST['lastYear'];
$university = $_POST['university'];
$file = $_POST['file'];
$about = $_POST['about'];

$document->setValue('name', $name);
$document->setValue('birthdate', $birth);
$document->setValue('tel', $tel);
$document->setValue('city', $city);
$document->setValue('purpose', $purpose);
$document->setValue('startYear', $startYear);
$document->setValue('lastYear', $lastYear);
$document->setValue('university', $university);
$document->setValue('about', $about);
$document->setImageValue('image', array('path' => $uploadFile, 'width' => 120, 'height' => 120, 'ratio' => false));

$document->saveAs($outputFile);


// Имя скачиваемого файла
$downloadFile = $outputFile;

// Контент-тип означающий скачивание
header("Content-Type: application/octet-stream");

// Размер в байтах
header("Accept-Ranges: bytes");

// Размер файла
header("Content-Length: ".filesize($downloadFile));

// Расположение скачиваемого файла
header("Content-Disposition: attachment; filename=".$downloadFile);

// Прочитать файл
readfile($downloadFile);


unlink($uploadFile);
unlink($outputFile);

Может показаться, что кода много, но по сути он очень простой.

  1. Сперва мы используем TemplateProcessor, чтобы начать работу с шаблоном
  2. Затем создаем переменные, в которых получаем данные из супермассива $_POST - то есть как раз наши данные формы
  3. Далее, с помощью метода setValue сопоставляем наши переменные и данные из шаблона. То есть мы просто используем шаблон и в него подставляем данные
  4. Следующий шаг — сохранить все через команду saveAs.
  5. А далее — скачивание файла через readfile и удаление его же через unlink.

Надеюсь, вам поможет эта статья. Если же нет — посмотрите видео, все же видео-формат более нагляден.

Удачи!