| Current Path : /var/www/v3.cesa.co.za/src/ContentBundle/Services/ |
| 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;
}
}