Your IP : 216.73.217.79


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

<?php

namespace App\ContentBundle\Services;

use Symfony\Component\Validator\Constraints\GreaterThanOrEqual;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Monolog\Logger;
use App\ContentBundle\Entity\Form;
use App\ContentBundle\Entity\FormItemType;

/**
 * Form Item Types manager
 *
 * @author Otto Saayman <otto@igotafrica.com>
 * @package ContentBundle
 * @subpackage Form Item Types
 * @version 0.0.1
 */
final class FormItemTypeManager
{

    /**
     * Service Container
     * @var object
     */
    private $container = null;

    /**
     * Entity manager
     * @var object
     */
    private $em;

    /**
     * Class construct
     *
     * @param  ContainerInterface $container
     * @param  Logger             $logger
     * @return void
     */
    public function __construct(
        ContainerInterface $container,
        UsageTrackingTokenStorage $securityContext
    ) {
        $this->setContainer($container);
        $this->setSecurityContext($securityContext);
        $this->setEm($container->get('doctrine')->getManager('default'));

        return;
    }

    /**
     * Get Container
     *
     * @return ContainerInterface $container
     */
    public function getContainer()
    {
        return $this->container;
    }

    /**
     * Set Container
     *
     * @param  ContainerInterface $container
     * @return void
     */
    public function setContainer($container)
    {
        $this->container = $container;
    }

    /**
     * Get Entity Manager
     *
     * @return string
     */
    public function getEm()
    {
        return $this->em;
    }

    /**
     * Set Container
     *
     * @param  string $em
     * @return void
     */
    public function setEm($em)
    {
        $this->em = $em;
    }

    public function getSecurityContext()
    {
        return $this->securityContext;
    }

    public function setSecurityContext(UsageTrackingTokenStorage $securityContext)
    {
        $this->securityContext = $securityContext;
    }

    /**
     * Get a form type
     *
     * @param string $id
     * @return FormItemType
     */
    public function find($id)
    {
        return $this->getEm()->getRepository(FormItemType::class)->find($id);
    }

    /**
     * Check if exists and load if not for given Form Type
     *
     * @param  string $formTypeName
     * @return FormItemType
     */
    public function checkAndLoad($formItemTypeName, $widgetName)
    {

        $formItemType = $this->em->getRepository(FormItemType::class)->findOneBy(array('type_name' => $formItemTypeName));

        if (!is_object($formItemType)) {

            $formItemType = new FormItemType();

            $formItemType->setTypeName($formItemTypeName);
        }

        $formItemType->setWidgetName($widgetName);
        $this->getEm()->persist($formItemType);
        $this->getEm()->flush();

        return $formItemType;
    }

    /**
     * Get select array from
     *
     * @param string $list
     * @return array
     */
    public function getArrayFromList($list)
    {

        $return = array();

        $options = explode("\n", $list);

        foreach ($options as $option) {
            $return[trim($option)] = trim(rawurldecode($option));
        }

        return $return;
    }

    /**
     * Get the form builder widget options for an item type
     *
     * @param  mixed $formItemType
     * @param Form $form
     * @param array $formItem
     * @return array
     */
    public function getWidgetOptions($formItemType, Form $form = null, &$formItem = array())
    {

        $systemSettingManager = $this->getContainer()->get('system_setting.manager');

        if (is_array($formItemType)) {
            $formItemType = $this->find($formItemType['id']);
        }

        if (!is_object($formItemType)) {
            $formItemType = $this->find($formItemType);
        }

        $optionsArray = array(
            'label' => $formItem['prompt'],
            'mapped' => false,
        );

        if (!isset($formItem['form_builder'])) {
            $formItem['form_builder'] = false;
        }

        if (!isset($formItem['form_edit_user'])) {
            $formItem['form_edit_user'] = null;
        }

        if (!isset($formItem['widget_name']) || strlen($formItem['widget_name']) <= 0) {
            $formItem['widget_name'] = $formItemType->getWidgetName();
        }

        if ($formItem['is_required'] !== true || $formItem['is_required'] != 'true') {
            $optionsArray['required'] = false;
        } else {
            $optionsArray['required'] = true;
            $optionsArray['constraints'] = array(
                new NotBlank(array('message' => 'This field must not be blank')),
            );
        }

        if (
            in_array(
                $formItem['widget_name'],
                [
                    'choice_drop_down',
                    'choice_drop_down_multi',
                    'choice_check_box',
                    'choice_radio',
                    'yes_no',
                    'helpful',
                    'keep_drop',
                    'excellent_satisfactory',
                    'excellent_good',
                    'excellent_poor',
                    'expectations',
                    'substantially',
                    'agree_na',
                    'bce_modules',
                    'yes_somewhat_no',
                    'time_spent_compiling'
                ]
            )
        ) {

            $optionsArray['choices'] = array();
            $optionsArray['multiple'] = false;

            if (
                $formItem['widget_name'] == 'choice_drop_down_multi' ||
                $formItem['widget_name'] == 'choice_check_box' ||
                $formItem['widget_name'] == 'bce_modules'
            ) {
                $optionsArray['multiple'] = true;
            }

            if (
                in_array(
                    $formItem['widget_name'],
                    [
                        'choice_radio',
                        'yes_no',
                        'helpful',
                        'keep_drop',
                        'excellent_satisfactory',
                        'excellent_good',
                        'excellent_poor',
                        'expectations',
                        'substantially',
                        'agree_na',
                        'yes_somewhat_no',
                        'time_spent_compiling'
                    ]
                )
            ) {
                $optionsArray['expanded'] = true;
                $optionsArray['attr']['class'] = 'radio-field';
            }

            if (
                in_array(
                    $formItem['widget_name'],
                    ['choice_check_box', 'bce_modules']
                )
            ) {
                $optionsArray['expanded'] = true;
                $optionsArray['attr']['class'] = 'checkbox-field';
            }

            if ($formItem['widget_name'] == 'choice_drop_down_multi' || $formItem['widget_name'] == 'choice_drop_down') {
                $optionsArray['attr']['style'] = 'width: 280px;';
            }

            if ($formItem['widget_name'] == 'yes_no') {
                $optionsArray['choices'] = array(
                    'Yes' => 'Yes',
                    'No' => 'No'
                );
            } else {

                if (!is_array($formItem['select_list_options'])) {
                    $formItem['select_list_options'] = $this->getArrayFromList($formItem['select_list_options']);
                } else {
                    foreach ($formItem['select_list_options'] as $optionKey => $option) {
                        $formItem['select_list_options'][$optionKey] = rawurldecode($option);
                    }
                }

                $optionsArray['choices'] = $formItem['select_list_options'];
                //                var_dump($optionsArray['choices']);
            }

            $formItem['widget_name'] = ChoiceType::class;
        }

        if ($formItem['widget_name'] == 'country') {
            $optionsArray['attr']['style'] = 'width: 280px;';
        }

        if ($formItem['widget_name'] == 'date_calendar') {
            $optionsArray['attr']['class'] = 'datepicker';
            $formItem['widget_name'] = TextType::class;
        }

        if ($formItem['widget_name'] == 'date_time_calendar') {
            $optionsArray['attr']['class'] = 'datetimepicker';
            $formItem['widget_name'] = TextType::class;
        }

        if ($formItem['widget_name'] == 'decimal') {
            $optionsArray['grouping'] = true;
            $optionsArray['precision'] = 2;
            $formItem['widget_name'] = NumberType::class;
        }

        if ($formItem['widget_name'] == 'money') {
            $optionsArray['currency'] = 'ZAR';
            $formItem['widget_name'] = MoneyType::class;
        }

        if ($formItem['widget_name'] == 'scalar') {
            $optionsArray['constraints'] = array(new GreaterThanOrEqual(0));
            $formItem['widget_name'] = NumberType::class;
        }

        if ($formItem['widget_name'] == 'time') {
            $optionsArray['attr']['class'] = 'timepicker';
            $formItem['widget_name'] = TextType::class;
        }

        if ($formItem['form_builder']) {
            $optionsArray['required'] = false;
        }

        if ($formItem['widget_name'] == 'textarea') {
            $formItem['widget_name'] = TextareaType::class;
            $optionsArray['attr']['class'] = 'form-control';
        }

        $loggedOnUser = null;

        if (is_object($formItem['form_edit_user'])) {
            $loggedOnUser = $formItem['form_edit_user'];
        } elseif (is_object($this->getSecurityContext()) && is_object($this->getSecurityContext()->getToken())) {
            $loggedOnUser = $this->getSecurityContext()->getToken()->getUser();
        }

        if (is_object($loggedOnUser)) {

            if ($systemSettingManager->getSetting('first_name_form_item_type') == $formItemType->getId()) {
                $optionsArray['data'] = $loggedOnUser->getFirstNameString();
            }

            if ($systemSettingManager->getSetting('last_name_form_item_type') == $formItemType->getId()) {
                $optionsArray['data'] = $loggedOnUser->getLastNameString();
            }

            if ($systemSettingManager->getSetting('id_number_form_item_type') == $formItemType->getId()) {
                $optionsArray['data'] = $loggedOnUser->getIdNumber();
            }

            if ($systemSettingManager->getSetting('prepop_email_form_item_type') == $formItemType->getId()) {
                $optionsArray['data'] = $loggedOnUser->getEMailAddressString();
            }

            if ($systemSettingManager->getSetting('contact_number_form_item_type') == $formItemType->getId()) {
                $optionsArray['data'] = $loggedOnUser->getUserTelNoWork();
            }

            if ($systemSettingManager->getSetting('cell_number_form_item_type') == $formItemType->getId()) {
                $optionsArray['data'] = $loggedOnUser->getUserTelNoMobile();
            }

            if (
                $systemSettingManager->getSetting('dealership_form_item_type') == $formItemType->getId() ||
                $systemSettingManager->getSetting('dealership_prepop_form_item_type') == $formItemType->getId()
            ) {
                $optionsArray['choices'] = $this->getContainer()->get('companies.manager')->getSelectList();
                $optionsArray['required'] = false;
                $optionsArray['empty_data'] = '';
            }

            if ($systemSettingManager->getSetting('dealership_prepop_form_item_type') == $formItemType->getId()) {
                $optionsArray['data'] = $loggedOnUser->getCompanyId();
                $optionsArray['constraints'] = array(
                    new NotBlank(array('message' => 'Please select your Company')),
                );
            }

            if ($systemSettingManager->getSetting('position_form_item_type') == $formItemType->getId()) {
                $optionsArray['data'] = $loggedOnUser->getUserTypeTypes()->getId();
                $optionsArray['choices'] = $this->getContainer()->get('user_type_types.manager')->getSelectList(
                    $systemSettingManager->getSetting('employee_user_type'),
                    'Please select your Position',
                    true
                );
                $optionsArray['required'] = false;
                $optionsArray['constraints'] = array(
                    new NotBlank(array('message' => 'Please select your Position')),
                );
            }
        }

        //        var_dump($formItem);
        //        echo '<br />';
        //        var_dump($optionsArray);
        //        echo '<br />';
        //        exit;

        return $optionsArray;
    }

    /**
     * Get the widget name for an item type
     *
     * @param  mixed $formItemType
     * @return string
     */
    public function getWidgetNameByType($formItemType)
    {

        if (!is_object($formItemType)) {
            $formItemType = $this->find($formItemType);
        }

        $return = 'text';

        if (is_object($formItemType)) {
            $return = $formItemType->getWidgetName();
        }

        return $return;
    }
}