<?php
namespace App\Controller;
use App\Entity\User;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use App\Entity\Eshop;
use App\Entity\FormBuilder;
use App\Entity\FormField;
use App\Entity\FormResponse;
use App\Entity\FormFieldType;
use PDO;
use PDOStatement;
use PDOException;
use Symfony\Contracts\Translation\TranslatorInterface;
class FormBuilderController extends DefaultController
{
protected ManagerRegistry $doctrine;
protected TranslatorInterface $translator;
public function __construct(ManagerRegistry $doctrine,
TranslatorInterface $translator)
{
$this->doctrine = $doctrine;
$this->translator = $translator;
}
/**
* @Route("/formBuilder", name="formBuilder")
*/
public function formBuilderAction(Request $request)
{
/* we load session data */
parent::init($request);
$session = $request->getSession();
$em = $this->doctrine->getManager();
$dem = $this->doctrine->getManager('dynamic_em');
$userId = $session->get('user')->getUserId();
$user = $em->getRepository(User::class)->getUser($userId);
$formBuilderList = $dem->getRepository(FormBuilder::class)->getFormBuilderList();
/* we render data */
return $this->render('formBuilder.html.twig',
array('headerData' => $this -> getPageHeader($request),
'formBuilderList' => $formBuilderList,
'menu' => $this -> adminMenu($request),
'mainMenu' => $this -> adminMainMenu($request),
'user' => $user,
)
);
}
/**
* @Route("/formBuilderNew", name="formBuilderNew")
*/
public function formBuilderNewAction(Request $request)
{
/* we load session data */
parent::init($request);
$session = $request->getSession();
$em = $this->doctrine->getManager();
$dem = $this->doctrine->getManager('dynamic_em');
/* we get user */
$userId = $session->get('user')->getUserId();
$user = $em->getRepository(User::class)->getUser($userId);
/* we build login form */
$fmBuilder = new FormBuilder;
$formBuilder = $this->createFormBuilder($fmBuilder);
$formBuilder->add('formBuilderName', TextType::class, array(
'required' => true,
'label' => $this->translator->trans('module.formBuilder_name'),
'attr' => array('class' => 'text_form', 'size' => 22),
'label_attr' => array('class' => 'form_field_label'),
));
//form.button.save
$formBuilder->add('save', SubmitType::class, array('label' => $this->translator->trans('form.button.save'),
'attr' => array('class' => 'butt_big')));
$form = $formBuilder->getForm();
$form->handleRequest($request);
if ($request->getMethod() == 'POST') {
if ($form->isValid()) {
$formData = $form->getData();
//$userName = $request->request->get('form')['username'];
//$userExist = $em->getRepository(User::class)->getUserFromLogin($userName, $request->request->get('form')['password']);
$fmBuilder->setFormBuilderName($formData->getFormBuilderName());
/* we persist and save */
$dem->persist($fmBuilder);
$dem->flush();
$this->addFlash('notice', 'New Form Builder was created.');
return $this->redirectToRoute('formBuilderEdit', array('formBuilderId' => $fmBuilder->getFormBuilderId()));
}
}
/* we render data */
return $this->render('formBuilderNew.html.twig',
array( 'form' => $formBuilder->getForm()->createView(),
'headerData' => $this -> getPageHeader($request),
'menu' => $this -> adminMenu($request),
'mainMenu' => $this -> adminMainMenu($request),
'user' => $user,
)
);
}
/**
* @Route("/formBuilderEdit/{formBuilderId}", name="formBuilderEdit")
*/
public function formBuilderEditAction(Request $request, $formBuilderId)
{
/* we load session data */
parent::init($request);
$session = $request->getSession();
/* we load entity managers */
$em = $this->doctrine->getManager();
$dem = $this->doctrine->getManager('dynamic_em');
/* we get user */
$userId = $session->get('user')->getUserId();
$user = $em->getRepository(User::class)->getUser($userId);
/* we get current e-shop */
$eshop = $em->getRepository(Eshop::class)->getCurrentEshop($userId);
/* we get form builder entity */
$fmBuilder = $dem->getRepository(FormBuilder::class)->getFormBuilder($formBuilderId);
$userDirs = $this->getUserFolderPaths($request);
//print('<br>QQW user: ');
//\Doctrine\Common\Util\Debug::dump($user);
/* we build edit form */
$formBuilder = $this->createFormBuilder($fmBuilder);
$formBuilder->add('formBuilderName', TextType::class, array(
'required' => false,
'label' => $this->translator->trans('module.formBuilder_name'),
'attr' => array('class' => 'text_form', 'size' => 22, 'value' => $fmBuilder->getFormBuilderName()),
'label_attr' => array('class' => 'form_field_label')
));
$formBuilder->add('formBuilderEmail', TextType::class, array(
'required' => false,
'label' => $this->translator->trans('module.formBuilder_email'),
'attr' => array('class' => 'text_form', 'size' => 22, 'value' => $fmBuilder->getFormBuilderEmail()),
'label_attr' => array('class' => 'form_field_label')
));
$formBuilder->add('isVisible', ChoiceType::class, array(
'choices' => array('Yes' => true, 'No' => false),
'required' => false,
'mapped' => true,
'multiple' => false,
'expanded' => true,
'placeholder' => false,
'label_attr' => array('class' => 'form_field_label'),
'attr' => array('class' => 'form_field_text'),
'data' => $fmBuilder->isIsVisible(),
));
$formBuilder->add('save', SubmitType::class, array('label' => $this->translator->trans('form.button.save'),
'attr' => array('class' => 'butt_big')));
$formField = new FormField;
$formFieldNewBuilder = $this->createFormBuilder($formField);
$formFieldNewBuilder->add('formFieldName', TextType::class, array(
'required' => false,
'label' => $this->translator->trans('module.formField_name'),
'attr' => array('class' => 'text_form', 'size' => 22, 'value' => ''),
'label_attr' => array('class' => 'form_field_label'),
));
$formFieldNewBuilder->add('save', SubmitType::class, array('label' => $this->translator->trans('service.add'),
'attr' => array('class' => 'butt_big')));
$form = $formBuilder->getForm();
$formFieldNew = $formFieldNewBuilder->getForm();
$form->handleRequest($request);
$formFieldNew->handleRequest($request);
if ($request->getMethod() == 'POST') {
//$form->bindRequest($request);
if ($form->isValid()) {
$formData = $form->getData();
/* we load user data from register form into user object */
$fmBuilder->setFormBuilderName($formData->getFormBuilderName());
$fmBuilder->setFormBuilderEmail($formData->getFormBuilderEmail());
//$formContactGroups = $form['contactGroups']->getData();
if(!empty($formData->isIsVisible())) {
$fmBuilder->setIsVisible($formData->isIsVisible());
}
/* we persist and save */
$dem->persist($fmBuilder);
$dem->flush();
$this->addFlash('notice', 'Form Builder was updated.');
return $this->redirectToRoute('formBuilderEdit', array('formBuilderId' => $fmBuilder->getFormBuilderId()));
}
if ($formFieldNew->isValid()) {
$formFieldNewData = $formFieldNew->getData();
print('<br>qqw creating new field: '.$formFieldNewData->getFormFieldName());
$formField = new FormField;
$formField->setFormFieldName($formFieldNewData->getFormFieldName());
//$formField->setProductSelectionGuide($productSelectionGuide);
/* we update formbuilder - add form field */
$fmBuilder->addFormField($formField);
$dem->persist($fmBuilder);
$dem->persist($formField);
$dem->flush();
return $this->redirectToRoute('formBuilderEdit', array('formBuilderId' => $fmBuilder->getFormBuilderId()));
}
}
/* we render data */
return $this->render('formBuilderEdit.html.twig',
array('headerData' => $this -> getPageHeader($request),
'form' => $formBuilder->getForm()->createView(),
'formFieldNew' => $formFieldNewBuilder->getForm()->createView(),
'fmBuilder' => $fmBuilder,
'userDirs' => $userDirs,
'menu' => $this -> adminMenu($request),
'mainMenu' => $this -> adminMainMenu($request),
'user' => $user,
)
);
}
/**
* @Route("/formBuilderRemove/{formBuilderId}", name="formBuilderRemove")
*/
public function formBuilderRemoveAction(Request $request, $formBuilderId)
{
/* we load session data */
parent::init($request);
$session = $request->getSession();
/* we load entity managers */
$em = $this->doctrine->getManager();
$dem = $this->doctrine->getManager('dynamic_em');
$userId = $session->get('user')->getUserId();
/* we get current e-shop */
$eshop = $em->getRepository(Eshop::class)->getCurrentEshop($userId);
$parameter = $dem->getRepository('AppBundle:ProductParameter')->getProductParameter($productParameterId);
print('<hr>qqw parameter: ');
\Doctrine\Common\Util\Debug::dump($parameter);
//$repo = $dem->getRepository('AppBundle:Category');
//$repo->removeFromTree($category);
$dem->remove($parameter);
$dem->flush();
$this->addFlash('notice', 'Parameter was removed.');
return $this->redirectToRoute('productParameter');
}
/**
* @Route("/formFieldEdit/{formFieldId}", name="formFieldEdit")
*/
public function formFieldEditAction(Request $request, $formFieldId)
{
/* we load session data */
parent::init($request);
$session = $request->getSession();
/* we load entity managers */
$em = $this->doctrine->getManager();
$dem = $this->doctrine->getManager('dynamic_em');
/* we get user */
$userId = $session->get('user')->getUserId();
$user = $em->getRepository(User::class)->getUser($userId);
/* we get current e-shop */
$eshop = $em->getRepository(Eshop::class)->getCurrentEshop($userId);
/* we get form field entity */
$formField = $dem->getRepository(FormField::class)->getFormField($formFieldId);
$userDirs = $this->getUserFolderPaths($request);
// print('<br>QQW user: ');
// \Doctrine\Common\Util\Debug::dump($user);
/* we build edit form */
$formBuilder = $this->createFormBuilder($formField);
$formBuilder->add('formFieldName', TextType::class, array(
'required' => false,
'label' => $this->translator->trans('module.formField_name'),
'attr' => array('class' => 'text_form', 'size' => 22, 'value' => $formField->getFormFieldName()),
'label_attr' => array('class' => 'form_field_label')
));
$formFieldTypeList = $em->getRepository(FormFieldType::class)->getFormFieldTypeList();
$formFieldTypes = array();
$formFieldTypesRequired = false;
foreach($formFieldTypeList as $formFieldType) {
//print('<br>Consent: '.$consent->getConsentName());
// if($consent->getBlockOrder()) {
// $consentRequired = true;
// }
$formFieldTypes[$formFieldType->getFormFieldTypeName()] = $formFieldType->getFormFieldTypeId();
}
$selectedFormFieldTypes = array();
if(!empty($formField->getFormFieldType())) {
foreach ($formField->getFormFieldType() as $fieldType) {
$fieldTypeId = $fieldType->getFormFieldTypeId();
$selectedFormFieldTypes[] = $fieldTypeId;
}
}
$formBuilder->add('formFieldType', ChoiceType::class, array(
'choices' => $formFieldTypes,
'attr' => array('class' => 'selector'),
'label_attr' => array('class' => 'form_field_label'),
'data' => $selectedFormFieldTypes,
'mapped' => false,
'multiple' => true
));
// $formBuilder->add('formFieldTypes', ChoiceType::class, array(
// 'choices' => $formFieldTypes,
// // 'required' => $consentRequired,
// 'mapped' => false,
// 'multiple' => true,
// 'expanded' => true,
// 'label_attr' => array('class' => 'consent_label'),
// 'attr' => array('class' => 'form_field_text'),
// 'choice_attr' => function($val, $key, $index) {
// // adds a class like attending_yes, attending_no, etc
// return ['class' => 'choiceBlock5', 'required' => 'required'];
// },
// 'data' => $selectedFormFieldTypes
// ));
$formBuilder->add('formFieldOptions', TextType::class, array(
'required' => false,
'label' => $this->translator->trans('module.formField_options'),
'attr' => array('class' => 'text_form', 'size' => 22, 'value' => $formField->getFormFieldOptions()),
'label_attr' => array('class' => 'form_field_label')
));
$formBuilder->add('save', SubmitType::class, array('label' => $this->translator->trans('form.button.save'),
'attr' => array('class' => 'butt_big')));
$form = $formBuilder->getForm();
$form->handleRequest($request);
if ($request->getMethod() == 'POST') {
//$form->bindRequest($request);
if ($form->isValid()) {
$formData = $form->getData();
$formField->setFormFieldName($formData->getFormFieldName());
if(is_array($formField->getFormFieldType())) {
foreach ($formField->getFormFieldType() as $fieldType) {
$formField->removeFormFieldType($fieldType);
}
}
$formFieldTypes = $form['formFieldType']->getData();
if(is_array($formFieldTypes)) {
foreach($formFieldTypes as $formFieldTypeId) {
print('<br>add fieldTypeId: '.$formFieldTypeId);
$fieldType = $em->getRepository(FormFieldType::class)->getFormFieldType($formFieldTypeId);
$formField->addFormFieldType($fieldType);
}
}
//$formField->setFormFieldTypes($form['formFieldType']->getData());
$formField->setFormFieldOptions($formData->getFormFieldOptions());
/* we persist and save */
$dem->persist($formField);
$dem->flush();
$this->addFlash('notice', 'Form Field was updated.');
return $this->redirectToRoute('formFieldEdit', array('formFieldId' => $formField->getFormFieldId()));
}
}
/* we render data */
return $this->render('formFieldEdit.html.twig',
array('headerData' => $this -> getPageHeader($request),
'form' => $formBuilder->getForm()->createView(),
'formField' => $formField,
'userDirs' => $userDirs,
'menu' => $this -> adminMenu($request),
'mainMenu' => $this -> adminMainMenu($request),
'user' => $user,
)
);
}
/**
* @Route("/formResponse", name="formResponse")
*/
public function formResponseAction(Request $request)
{
/* we load session data */
parent::init($request);
$session = $request->getSession();
$userDirs = $this->getUserFolderPaths($request);
/* we load users entity manager */
$dem = $this->doctrine->getManager('dynamic_em');
$formResponseList = $dem->getRepository('AppBundle:FormResponse')->getFormResponseList();
/* we render data */
return $this->render('formResponse.html.php',
array('headerData' => $this -> getPageHeader($request),
'formResponseList' => array_reverse($formResponseList),
'userDirs' => $userDirs,
'menu' => $this -> adminMenu($request),
'mainMenu' => $this -> adminMainMenu($request),
)
);
}
/**
* @Route("user/{userId}/form/{formBuilderId}", name="form")
*/
public function formAction(Request $request, $userId, $formBuilderId)
{
$processResult = true;
$processMessage = 'OK';
/* we load session data */
parent::init($request);
$session = $request->getSession();
/* we load entity managers */
$em = $this->doctrine->getManager();
$dem = $this->doctrine->getManager('dynamic_em');
$user = $em->getRepository(User::class)->getUser($userId);
$form = $dem->getRepository(FormBuilder::class)->getFormBuilder($formBuilderId);
$userDirs = $this->getUserFolderPathsFromUserId($userId);
//print('<br>QQW form: ');
//\Doctrine\Common\Util\Debug::dump($form);
/* we check if eshop exists */
if($user === null) {
$this->addFlash('error', 'User does not exist.');
print('<br>User does not exist');
}
/* we generate response message */
if(!empty($request->query->get('message'))) {
$formResponseMessage = $request->query->get('message');
} else {
$formResponseMessage = '';
}
if(!empty($request->query->get('name'))) {
$formResponseName = $request->query->get('name');
} else {
$formResponseName = '';
}
if(!empty($request->query->get('email'))) {
$formResponseEmail = $request->query->get('email');
} else {
$formResponseEmail = '';
}
if(!empty($request->query->get('phone'))) {
$formResponsePhone = $request->query->get('phone');
} else {
$formResponsePhone = '';
}
if(!empty($request->query->get('subject'))) {
$formResponseSubject = $request->query->get('subject');
} else {
$formResponseSubject = '';
}
/* we generate response xml */
$documentUrl = 'formResponse' . md5(uniqid()).'.xml';
$xmlFile = $userDirs['user']. '/'.$documentUrl;
$xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><formResponse></formResponse>');
$formRequests = $request->query->all();
foreach($formRequests as $key=>$req) {
//print('<br>qqw req: '.$key);
//\Doctrine\Common\Util\Debug::dump($req);
$xml->addChild($key, $req );
}
// Save out the file
$xml->asXML($xmlFile);
$formResponseMessage .= (string)$xml;
/* we try to connect to users database */
$dbHost = '127.0.0.1';
$dbName = $user->getDatabaseName();
$dsn = sprintf("mysql:host=%s;dbname=%s",
$dbHost,
$dbName
);
$sql = "INSERT INTO form_response (form_builder_id,
form_response_message,
document_url,
form_response_name,
form_response_email,
form_response_phone,
form_response_subject,
form_response_ip,
date_inserted
) VALUES ( '".$formBuilderId."',
'".$formResponseMessage."',
'".$documentUrl."',
'".$formResponseName."',
'".$formResponseEmail."',
'".$formResponsePhone."',
'".$formResponseSubject."',
'".$request->getClientIp()."',
NOW()
)";
$connection = new PDO ( $dsn, $user->getDatabaseUser(), $user->getDatabasePassword());
$statement = $connection->prepare($sql);
if($statement->execute()) {
$processMessage = $this->translator->trans('module.formResponse_ok');
//sending email
if(!empty($form->getFormBuilderEmail()) && $form->getFormBuilderEmail() !== '') {
// we prepare emailing
$name = $formResponseName;
$to = $form->getFormBuilderEmail();
$subject = $name.' - '.$this->translator->trans('eshop.email_order_subject').': #';
$message = $this->translator->trans('eshop.email_form_message');
$from = 'noreply@easycommerc.com';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=UTF-8\r\n";
$headers .= "From: {$name} <{$from}>\r\n";
$headers .= "Reply-To: <{$from}>\r\n";
$headers .= "Subject: {$subject}\r\n";
$headers .= "X-Mailer: PHP/".phpversion()."\r\n";
// we send email form builder admin - sendmail, sendemail
if(@mail($to, $subject, $message, $headers)) {
print('<br>Email was sent.');
} else {
print('<br>Email was not sent.');
}
}
} else {
$processResult = false;
$processMessage = $this->translator->trans('module.formResponse_error');
}
//$statement = $connection->query ( $this->buildQueryString());
/* we generate return URL */
//$returnLink = $request->get('returnLink');
//$returnLink = $request->get('form')['returnLink'];
$returnLink = $request->query->get('returnLink');
//print('<br>qqw $sql: '.$sql);
/*
if ($request->getMethod() == 'GET') {
print('<br>IS GET ');
}
print('<br>QQW user: ');
\Doctrine\Common\Util\Debug::dump($user);
*/
/* we render data */
return $this->render('form.html.php',
array(
'user' => $user,
'returnLink' => $returnLink,
'processResult' => $processResult,
'processMessage' => $processMessage,
)
);
}
public function adminMenu(Request $request)
{
$menuItems = array(0 => array('link' => 'webpagesAdmin', 'langKey' => 'webpages.admin', 'routeName' => 'webpagesAdmin'),
1 => array('link' => 'formBuilder', 'langKey' => 'module.formBuilder', 'routeName' => 'formBuilder'),
2 => array('link' => 'formBuilderNew', 'langKey' => 'module.formBuilder_new', 'routeName' => 'formBuilderNew'),
3 => array('link' => 'formResponse', 'langKey' => 'module.formResponse', 'routeName' => 'formResponse'),
);
return $menuItems;
}
}