Задать вопрос
@andrej3337

Как в yii2 гененрировать png с данными?

Здравствуйте.
Есть форма (база данных не используется), откуда приходят данные, там есть поля для наименований организаций, которые я хочу наложить на изображение через переменные $k1, $k2, $k3 В том же виде под формой нужно вывести генерируемую картинку в зависимости от введенных данных. Пример на чистом php здесь https://zachet.pro/.

Через стандартный экшн с приходящими данными работать можно.
public function actionZachet()
    {
        $model = new ZachetForm();
            if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            }
        return $this->render('zachet', compact('model'));

    }

В этом же контролере создал второй экшн для генерации png. Отрабатывает он нормально что касается генерации и отрисовки фигур.
public function actionImgDefawltv1() {   
        $img_width = 1000;
        $img_height = 200;
        $img = imagecreatetruecolor($img_width, $img_height);

        $black = imagecolorallocate($img, 0, 0, 0);
        $white = imagecolorallocate($img, 255, 255, 255);
        imagefill($img, 0, 0, $white);

        $font = 'E:\OpenServer\domains\myproject.com\frontend\views\service\Roboto-Medium.ttf';
        imagettftext($img, 10, 0, 3, 85, $black, $font, perenos1($k1)); // первый контрагент
        imagettftext($img, 10, 0, 362, 85, $black, $font, perenos2($k2)); // второй контрагент
        imagettftext($img, 10, 0, 722, 85, $black, $font, perenos3($k3)); // третий контрагент

        imagerectangle($img, $img_width*0/100, $img_height*30/100, $img_width*27/100, $img_height*60/100, $black); //левый прямоугольник
        imagerectangle($img, $img_width*36/100, $img_height*30/100, $img_width*63/100, $img_height*60/100, $black); //средний прямоугольник
        imagerectangle($img, $img_width*72/100, $img_height*30/100, $img_width*99/100, $img_height*60/100, $black); //правый прямоугольник

        imagepng($img); // вывод изображения
        return imagedestroy($img);
    }

Однако попытки передать данные в переменные $k1, $k2, $k3 в actionImgDefawltv1() у меня не вышли, пробовал через
$model = new ZachetForm();
$k1 = $model->k1;

... и так тоже
$request = Yii::$app->request;
$data = $request->post();
echo $data['ZachetForm']['k1']


Также если в этом экшене оставить функции по переносу строк, то также вылезает ошибка
function perenos($k1) {
global $font, $k1;
$width = 200;
$margin = 5;
//разбиваем текст на слова
$text_a = explode(' ', $k1);
$text_new = '';
foreach($text_a as $word){
    //создаём новый текст, добавляем слово и вычисляем параметры текста
    $box = imagettfbbox(10, 0, $font, $text_new.' '.$word);
    //если строка влезает в заданную ширину, то добавляем слово с пробелом, если нет то переносим на новую строку
    if($box[2] > $width - $margin*2){
        $text_new .= "\n".$word;
    } else {
        $text_new .= " ".$word;
    }
} return $text_new; 
}

Полностью код на чистом php из примера такой. Но как заставить его работать на yii2 в упор не понимаю.
spoiler
<?php
//Картинка для первого варианта, когда контрагенты в первоначальном положении
//Устанавливаем отображение сообщений об ошибках
ini_set ("display_errors", "1");
error_reporting(E_ALL);
session_start();
$k1=htmlspecialchars_decode($_SESSION['k1']); 
$k2=htmlspecialchars_decode($_SESSION['k2']); 
$k3=htmlspecialchars_decode($_SESSION['k3']);
if (!empty($_SESSION['sum1'])) {$sum1=number_format($_SESSION['sum1'], 2, ',', ' ');} else {$sum1=$_SESSION['sum1'];}
if (!empty($_SESSION['sum2'])) {$sum2=number_format($_SESSION['sum2'], 2, ',', ' ');} else {$sum2=$_SESSION['sum2'];}
if (!empty($_SESSION['sum3'])) {$sum3=number_format($_SESSION['sum3'], 2, ',', ' ');} else {$sum3=$_SESSION['sum3'];}
if (!empty($_SESSION['sum4'])) {$sum4=number_format($_SESSION['sum4'], 2, ',', ' ');} else {$sum4=$_SESSION['sum4'];}

header('Content-type: image/png');

$img_width = 1000;
$img_height = 200;
 
$img = imagecreatetruecolor($img_width, $img_height);
 
$black = imagecolorallocate($img, 0, 0, 0);
$white = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $white);

$font = dirname(__FILE__) . '/Roboto-Medium.ttf';
imagettftext($img, 10, 0, 3, 85, $black, $font, perenos($k1)); // первый контрагент
imagettftext($img, 10, 0, 362, 85, $black, $font, perenos2($k2)); // второй контрагент
imagettftext($img, 10, 0, 722, 85, $black, $font, perenos3($k3)); // третий контрагент

if (empty($sum1)) {imagettftext($img, 10, 0, 282, 87, $black, $font, $sum2." р."); } // сумма первого контрагента
else {imagettftext($img, 10, 0, 282, 87, $black, $font, $sum1." р."); }
imagefilledpolygon($img, [$img_width*35/100, $img_height*43/100, $img_width*35/100, $img_height*49/100, $img_width*36/100, $img_height*46/100], 3, $black); //первая стрелка
imageline($img, $img_width*27/100, $img_height*46/100, $img_width*36/100, $img_height*46/100, $black); //первая линия 

imagefilledpolygon($img, [$img_width*71/100, $img_height*43/100, $img_width*71/100, $img_height*49/100, $img_width*72/100, $img_height*46/100], 3, $black); //вторая стрелка
imageline($img, $img_width*63/100, $img_height*46/100, $img_width*72/100, $img_height*46/100, $black); //вторая линия
if (empty($sum3)) {imagettftext($img, 10, 0, 642, 87, $black, $font, $sum4." р."); }
else {imagettftext($img, 10, 0, 642, 87, $black, $font, $sum3." р."); }  // сумма второго контрагента

function perenos($k1) {
global $font, $k1;
$width = 200;
$margin = 5;
//разбиваем текст на слова
$text_a = explode(' ', $k1);
$text_new = '';
foreach($text_a as $word){
    //создаём новый текст, добавляем слово и вычисляем параметры текста
    $box = imagettfbbox(10, 0, $font, $text_new.' '.$word);
    //если строка влезает в заданную ширину, то добавляем слово с пробелом, если нет то переносим на новую строку
    if($box[2] > $width - $margin*2){
        $text_new .= "\n".$word;
    } else {
        $text_new .= " ".$word;
    }
} return $text_new; 
}

function perenos2($k2) {
global $font, $k2;
$width = 200;
//разбиваем текст на слова
$text_a = explode(' ', $k2);
$text_new = '';
foreach($text_a as $word){
    //создаём новый текст, добавляем слово и вычисляем параметры текста
    $box = imagettfbbox(10, 0, $font, $text_new.' '.$word);
    //если строка влезает в заданную ширину, то добавляем слово с пробелом, если нет то переносим на новую строку
    if($box[2] > $width){
        $text_new .= "\n".$word;
    } else {
        $text_new .= " ".$word;
    }
} return $text_new; 
}

function perenos3($k3) {
global $font, $k3;
$width = 200;
//разбиваем текст на слова
$text_a = explode(' ', $k3);
$text_new = '';
foreach($text_a as $word){
    //создаём новый текст, добавляем слово и вычисляем параметры текста
    $box = imagettfbbox(10, 0, $font, $text_new.' '.$word);
    //если строка влезает в заданную ширину, то добавляем слово с пробелом, если нет то переносим на новую строку
    if($box[2] > $width){
        $text_new .= "\n".$word;
    } else {
        $text_new .= " ".$word;
    }
} return $text_new; 
}

imagerectangle($img, $img_width*0/100, $img_height*30/100, $img_width*27/100, $img_height*60/100, $black); //левый прямоугольник
imagerectangle($img, $img_width*36/100, $img_height*30/100, $img_width*63/100, $img_height*60/100, $black); //средний прямоугольник
imagerectangle($img, $img_width*72/100, $img_height*30/100, $img_width*99/100, $img_height*60/100, $black); //правый прямоугольник
imagepng($img); // вывод изображения
imagedestroy($img);
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы