Your IP : 216.73.217.79


Current Path : /var/www/v3.cesa.co.za/src/ContentBundle/Controller/
Upload File :
Current File : /var/www/v3.cesa.co.za/src/ContentBundle/Controller/FormItemController.php

<?php

namespace App\ContentBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use App\ContentBundle\Form\Type\FormCompletedType;
use App\CoreBundle\Services\ServiceGetterManager;

class FormItemController extends AbstractController
{

    #[Route('/form-item/{formId}/list.html', name: 'content_form_item_list_json')]
    public function listAction(Request $request, ServiceGetterManager $sg, $formId = '0')
    {

        $formItemManager = $sg->get('form_item.manager');

        $formItemsJson = $request->get('formItemsJson');
        $returnJson = $request->get('returnJson');

        $formItemsArray = array('formItems' => array());

        $form = $sg->get('form_manager.manager')->find($formId);

        $formId = '0';
        $formCompleted = null;

        if (is_object($form)) {
            $formId = $form->getId();
            $formCompleted = $sg->get('form_completed.manager')->getObject($form);
        }

        if (is_object($form) && strlen($formItemsJson) <= 0) {

            $formItemObjects = $formItemManager->findByForm($form);

            foreach ($formItemObjects as $formItemObject) {
                $formItemsArray['formItems'][] = $formItemObject->getAsArray($form);
            }
        } else {
            $formItemsArray = json_decode($formItemsJson, true);
        }

        if (!isset($formItemsArray['formItems'])) {
            $formItemsArray['formItems'] = array();
        }

        $itemCount = 0;

        foreach ($formItemsArray['formItems'] as $itemCnt => $formItem) {

            if (strlen($formItemsArray['formItems'][$itemCnt]['id']) <= 0) {
                $formItemsArray['formItems'][$itemCnt]['id'] = $itemCount;
            }

            if ($formItemsArray['formItems'][$itemCnt]['form_item_type'] == 'link') {

                $formItem = $formItemManager->find($formItemsArray['formItems'][$itemCnt]['id']);

                if (is_object($formItem)) {

                    if (!is_object($form)) {
                        $form = new Form();
                    }

                    $formItemsArray['formItems'][$itemCnt] = $formItem->getAsArray($form);
                } else {
                    $formItemsArray['formItems'][$itemCnt]['id'] = $itemCount;
                }
            }

            if (!isset($formItemsArray['formItems'][$itemCnt]['widget_name'])) {
                $formItemsArray['formItems'][$itemCnt]['widget_name'] = $sg->get('form_item_type.manager')->getWidgetNameByType($formItemsArray['formItems'][$itemCnt]['form_item_type']);
                $formItemsArray['formItems'][$itemCnt]['widget_id'] = $formId . '-' . $formItemsArray['formItems'][$itemCnt]['id'];
            }

            $formItemsArray['formItems'][$itemCnt]['form_builder'] = true;

            $itemCount++;
        }

        $formCompletedForm = $this->createForm('iga_contentbundle_formcompletedtype', $formCompleted, array('form_items' => $formItemsArray['formItems']));

        if (strlen($formItemsJson) <= 0) {
            $formItemsJson = json_encode($formItemsArray);
        }

        if ($returnJson) {
            $response = new Response(json_encode($formItemsJson));
            $response->headers->set('X-robots-tag', 'noindex');
            $response->headers->set('Content-Type', 'application/json');
            return $response;
        } else {
            return $this->render(
                'ContentBundle:FormItem:list.render.html.twig',
                array(
                    'formItems' => $formItemsArray,
                    'formCompletedForm' => $formCompletedForm->createView(),
                    'formId' => $formId,
                )
            );
        }
    }

    #[Route('/form/{formCompletedId}/complete.html', name: 'content_form_complete', defaults: ['formCompletedId' => 0])]
    public function completedFormAction(Request $request, ServiceGetterManager $sg, $formCompletedId)
    {

        $formCompletedManager = $sg->get('form_completed.manager');
        $formCompleted = $formCompletedManager->find($formCompletedId);

        if (is_object($formCompleted)) {
            $html = $formCompletedManager->getCompletedFormHtml($formCompleted);
        } else {
            $html = 'Invalid form';
        }

        $response = new Response($html);
        $response->headers->set('Content-Type', 'text/html');
        return $response;
    }

    #[Route('/form/{formCompletedId}/complete/edit.html', name: 'content_form_complete_edit')]
    public function completedFormEditAction(Request $request, ServiceGetterManager $sg, $formCompletedId)
    {

        try {

            $formCompletedManager = $sg->get('form_completed.manager');

            $formCompleted = $formCompletedManager->find($formCompletedId);
            $formSubmitted = 0;

            $form = $sg->get('form_manager.manager')->find($formCompleted->getForm()->getId());

            if ($formCompleted->getCreatedBy() != '') {
                $userList = $sg->get('user_list.manager')->find($formCompleted->getCreatedBy());
            }

            if (!is_object($form)) {
                echo 'Invalid form';
                exit;
            }

            $formItemObjects = $sg->get('form_item.manager')->findByForm($form);

            $formItems = array();

            foreach ($formItemObjects as $formItemObject) {
                $formItems[] = $formItemObject->getAsArray($form);
            }

            $formCompletedForm = $this->createForm(FormCompletedType::class, $formCompleted, array('form_items' => $formItems, 'form_edit_user' => $userList));
            $errorMessage = '';

            if ($request->getMethod() == 'POST') {

                $formSubmitted = 1;

                $formCompletedValues = $request->get('form_completed');
                //                echo 'values: ' . count($formCompletedValues);
                //                exit;

                $formCompletedForm->handleRequest($request);
                $errors = array();

                if ($formCompletedForm->isValid() && count($errors) <= 0) {

                    $formCompletedValues['form'] = $form;

                    $result = $sg->get('form_completed.manager')->saveFromRequest($formCompletedValues, $formCompleted);

                    if (strlen($result) <= 0) {

                        if ($form->isSurvey()) {

                            $idNumber = $request->get('survey_id_number');
                            $student = $sg->get('cce_student.manager')->findOneBy(['id_number' => $idNumber]);

                            if (!is_object($student) || strlen($idNumber) <= 0) {
                                $this->addFlash('danger', 'An error occurred: Could not find your ID number.');
                                return $this->redirect($this->generateUrl('content_refer', ['formId' => $form->getId()]));
                            }

                            $data = [
                                'formData' => [],
                                'studentId' => $student->getId(),
                            ];

                            $sg->get('key_value.manager')->setKeyValue(
                                'survey_data_' . $form->getId() . '_' . $student->getId() . '_',
                                $data,
                                true
                            );
                        }

                        $this->addFlash('success', 'Form details saved.');

                        if ($form->isAddReferral()) {
                            return $this->redirect($this->generateUrl('content_refer', ['formId' => $form->getId()]));
                        }
                    } else {
                        $this->addFlash('danger', 'An error occurred: ' . $result);
                    }
                } else {
                    // echo $formCompletedForm->getErrors(true);
                    // exit;
                    $this->addFlash('danger', 'Your information has not been saved. Please check your form for incomplete fields and save.');
                }
            }

            $formRendered = array(
                'formBody' => $sg->getTwig()->render(
                    '@ContentBundle/Form/form.html.twig',
                    array(
                        'form' => $formCompletedForm->createView(),
                        'formItems' => $formItems,
                        'formObject' => $form,
                        'formCompletedId' => $formCompletedId,
                        'formSubmitted' => $formSubmitted,
                    )
                ),
                'formTitle' => $form->getTitle(),
                'id' => $form->getId(),
                'formObject' => $form,
            );;

            return $this->render(
                '@ContentBundle/Default/view.html.twig',
                array(
                    'form' => $formRendered,
                    'formCompletedId' => $formCompletedId,
                    'formSubmitted' => $formSubmitted,
                )
            );
        } catch (\Exception $ex) {
            //            $logger = $sg->get('error_log.manager');
            //            $logger->error('Error on form data: ' . $ex->getMessage());
            echo $ex->getMessage() . ' - ' . $ex->getTraceAsString();
        }
    }

    public function exportCompletedFormsAction(Request $request, ServiceGetterManager $sg, $formId)
    {

        try {

            $formCompletedManager = $sg->get('form_completed.manager');
            $formManager = $sg->get('form_manager.manager');

            $form = $formManager->find($formId);

            if (!is_object($form)) {
                throw new \Exception('Invalid form');
            }

            $userExportCsv = $formCompletedManager->generateEventExcel($form);

            $response = new Response($userExportCsv);
            $response->headers->set('Content-Type', 'application/vnd.ms-excel');
            $response->headers->set('Content-Disposition', 'attachment; filename="form-data-export ' . $form->getTitle() . ' ' . date('Y-m-d') . '.xlsx"');
            return $response;
        } catch (\Exception $ex) {

            if ($ex->getCode() != 403) {
                $logger = $sg->get('error_log.manager');
                $logger->error('Error on form data export: ' . $ex->getMessage());
                if ($ex->getCode() != 4003)
                    return $this->redirect($this->generateUrl('iga_core_500', array('message' => $ex->getMessage())));
                else
                    return $this->redirect($this->generateUrl('iga_core_403', array('message' => $ex->getMessage())));
            } else {
                throw new AccessDeniedException();
            }
        }
    }

    public function formCompleteAction(Request $request, $formId)
    {

        try {

            $formItemManager = $sg->get('form_item.manager');

            $userListId = $request->get('user_token');
            $contentId = $request->get('contentId');

            if (strlen($userListId) > 0) {
                //Auto login for user from URL

                $securityContext = $sg->get('security.token_storage');

                $userList = $sg->get('user_list.manager')->find($userListId);

                if (!is_object($userList)) {
                    throw new \Exception('Invalid user specified');
                }

                $token = new UsernamePasswordToken($userList->getUsername(), $userList->getPassword(), 'secured_area', $userList->getRoles());

                $token->setUser($userList);

                $securityContext->setToken($token);

                $event = new InteractiveLoginEvent($request, $token);
                $sg->get("event_dispatcher")->dispatch("security.interactive_login", $event);

                $sg->get('user_list.manager')->decideContactType($request);
            } else {
                $userList = $this->getUser();
            }

            $form = $sg->get('form_manager.manager')->find($formId);

            $formCompleted = null;

            if (is_object($form)) {
                $formId = $form->getId();
                $formCompleted = $sg->get('form_completed.manager')->getObject($form, $userList);
            } else {
                throw new \Exception('Invalid form!');
            }

            $formItemObjects = $formItemManager->findByForm($form);
            $formItemsArray = array('formItems' => array());

            foreach ($formItemObjects as $formItemObject) {
                $formItemsArray['formItems'][] = $formItemObject->getAsArray($form);
            }

            $itemCount = 0;

            foreach ($formItemsArray['formItems'] as $itemCnt => $formItem) {

                if (!isset($formItemsArray['formItems'][$itemCnt]['widget_name'])) {
                    $formItemsArray['formItems'][$itemCnt]['widget_name'] = $sg->get('form_item_type.manager')->getWidgetNameByType(
                        $formItemsArray['formItems'][$itemCnt]['form_item_type']
                    );
                    $formItemsArray['formItems'][$itemCnt]['widget_id'] = $formId . '-' . $formItemsArray['formItems'][$itemCnt]['id'];
                }

                $formItemsArray['formItems'][$itemCnt]['form_builder'] = true;

                $itemCount++;
            }

            //, 'form_values' => $formCompletedValues
            $formCompletedForm = $this->createForm(
                FormCompletedType::class,
                $formCompleted,
                array('form_items' => $formItemsArray['formItems'])
            );

            $pageTitleString = $form->getTitle();
            $descriptionString = 'Complete online form';
            $keyWordString = 'online form';
            $errorMessage = '';

            if ($request->getMethod() == 'POST') {

                $formCompletedForm->handleRequest($request);
                $formCompletedValues = $request->get('form_completed');

                $formCompletedValues['form'] = $form;

                $errors = array();

                if ($formCompletedForm->isValid()) {

                    foreach ($formItemObjects as $formItemObject) {

                        if ($formItemObject->getIsRequired() && $formCompletedForm->has($form->getId() . '-' . $formItemObject->getId())) {

                            if (!isset($formCompletedValues[$form->getId() . '-' . $formItemObject->getId()])) {
                                $formCompletedForm->get($form->getId() . '-' . $formItemObject->getId())->addError(new FormError('Please complete this field'));
                                $errors[] = '1';
                            } elseif (
                                !is_array($formCompletedValues[$form->getId() . '-' . $formItemObject->getId()]) &&
                                strlen(trim($formCompletedValues[$form->getId() . '-' . $formItemObject->getId()])) <= 0
                            ) {
                                $formCompletedForm->get($form->getId() . '-' . $formItemObject->getId())->addError(new FormError('Please complete this field'));
                                $errors[] = '1';
                            } elseif (trim($formCompletedValues[$form->getId() . '-' . $formItemObject->getId()]) == '0') {
                                $formCompletedForm->get($form->getId() . '-' . $formItemObject->getId())->addError(new FormError('Please complete this field'));
                                $errors[] = '1';
                            }
                        }
                    }
                } else {
                    $errorMessage = $formCompletedForm->getErrors(true);
                }

                if ($formCompletedForm->isValid() && count($errors) <= 0) {

                    $result = $sg->get('form_completed.manager')->saveFromRequest(
                        $formCompletedValues,
                        $formCompleted,
                        $contentId,
                        array('valid' => $formCompletedForm->isValid())
                    );

                    if (strlen($result) <= 0) {

                        if (strlen($contentId) > 0) {
                            $this->addFlash(
                                'success',
                                'Thank you very much. Our staff have received your data via e-mail.'
                            );
                            return $this->redirect(
                                $this->generateUrl('iga_content_page', array('contentId' => $contentId))
                            );
                        }

                        //                        $this->addFlash('success', $languagePhrasesManager->translate('RSVP details saved. Thank you very much!'));
                        return $this->render(
                            'ContentBundle:FormItem:form.complete.thanks.html.twig',
                            array(
                                'pageTitleString' => $pageTitleString,
                                'descriptionString' => $descriptionString,
                                'keyWordString' => $keyWordString,
                                'userLanguage' => $userLanguage,
                            )
                        );
                    } else {
                        $this->addFlash('error', 'An error occurred' . ': ' . $result);
                    }
                } else {
                    $this->addFlash(
                        'error',
                        'Your form information has not been saved. Please check your form for incomplete fields and save.'
                    );
                }
            }

            return $this->render(
                'ContentBundle:FormItem:form.complete.html.twig',
                array(
                    'pageTitleString' => $pageTitleString,
                    'descriptionString' => $descriptionString,
                    'keyWordString' => $keyWordString,
                    'formItems' => $formItemsArray,
                    'formCompletedForm' => $formCompletedForm->createView(),
                    'formId' => $formId,
                    'form' => $form,
                    'errorMessage' => $errorMessage,
                    //'messageRespondant' => $messageRespondant,
                    'messageRespondant' => null,
                    'contentId' => $contentId,
                )
            );
        } catch (\Exception $ex) {

            if ($ex->getCode() != 403) {
                $logger = $sg->get('error_log.manager');
                $logger->error('Error on complete form action: ' . $ex->getMessage() . "\r\n" . $ex->getTraceAsString());
                if ($ex->getCode() != 4003)
                    return $this->redirect($this->generateUrl('iga_core_500', array('message' => $ex->getMessage())));
                else
                    return $this->redirect($this->generateUrl('iga_core_403', array('message' => $ex->getMessage())));
            } else {
                throw new AccessDeniedException();
            }
        }
    }
}