PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/app/bundles/LeadBundle/Form/Type/FieldType.php

https://gitlab.com/jankube/mautic
PHP | 363 lines | 301 code | 36 blank | 26 comment | 13 complexity | 69910c14257e0101b736ab2c7680d12b MD5 | raw file
  1. <?php
  2. /**
  3. * @package Mautic
  4. * @copyright 2014 Mautic Contributors. All rights reserved.
  5. * @author Mautic
  6. * @link http://mautic.org
  7. * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
  8. */
  9. namespace Mautic\LeadBundle\Form\Type;
  10. use Doctrine\ORM\EntityRepository;
  11. use Mautic\CoreBundle\Factory\MauticFactory;
  12. use Mautic\CoreBundle\Form\EventListener\CleanFormSubscriber;
  13. use Mautic\CoreBundle\Form\EventListener\FormExitSubscriber;
  14. use Mautic\LeadBundle\Form\DataTransformer\FieldToOrderTransformer;
  15. use Symfony\Component\Form\AbstractType;
  16. use Symfony\Component\Form\CallbackTransformer;
  17. use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList;
  18. use Symfony\Component\Form\FormBuilderInterface;
  19. use Symfony\Component\Form\FormEvent;
  20. use Symfony\Component\Form\FormEvents;
  21. use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  22. use Mautic\LeadBundle\Helper\FormFieldHelper;
  23. /**
  24. * Class FieldType
  25. *
  26. * @package Mautic\LeadBundle\Form\Type
  27. */
  28. class FieldType extends AbstractType
  29. {
  30. private $translator;
  31. private $em;
  32. /**
  33. * @param MauticFactory $factory
  34. */
  35. public function __construct(MauticFactory $factory)
  36. {
  37. $this->translator = $factory->getTranslator();
  38. $this->em = $factory->getEntityManager();
  39. }
  40. /**
  41. * @param FormBuilderInterface $builder
  42. * @param array $options
  43. */
  44. public function buildForm(FormBuilderInterface $builder, array $options)
  45. {
  46. $builder->addEventSubscriber(new CleanFormSubscriber());
  47. $builder->addEventSubscriber(new FormExitSubscriber('lead.field', $options));
  48. $builder->add(
  49. 'label',
  50. 'text',
  51. array(
  52. 'label' => 'mautic.lead.field.label',
  53. 'label_attr' => array('class' => 'control-label'),
  54. 'attr' => array('class' => 'form-control', 'length' => 50)
  55. )
  56. );
  57. $disabled = (!empty($options['data'])) ? $options['data']->isFixed() : false;
  58. $builder->add(
  59. 'group',
  60. 'choice',
  61. array(
  62. 'choices' => array(
  63. 'core' => 'mautic.lead.field.group.core',
  64. 'social' => 'mautic.lead.field.group.social',
  65. 'personal' => 'mautic.lead.field.group.personal',
  66. 'professional' => 'mautic.lead.field.group.professional'
  67. ),
  68. 'attr' => array(
  69. 'class' => 'form-control',
  70. 'tooltip' => 'mautic.lead.field.form.group.help'
  71. ),
  72. 'expanded' => false,
  73. 'multiple' => false,
  74. 'label' => 'mautic.lead.field.group',
  75. 'empty_value' => false,
  76. 'required' => false,
  77. 'disabled' => $disabled
  78. )
  79. );
  80. $new = (!empty($options['data']) && $options['data']->getAlias()) ? false : true;
  81. $default = ($new) ? 'text' : $options['data']->getType();
  82. $fieldHelper = new FormFieldHelper();
  83. $fieldHelper->setTranslator($this->translator);
  84. $builder->add(
  85. 'type',
  86. 'choice',
  87. array(
  88. 'choices' => $fieldHelper->getChoiceList(),
  89. 'expanded' => false,
  90. 'multiple' => false,
  91. 'label' => 'mautic.lead.field.type',
  92. 'empty_value' => false,
  93. 'disabled' => ($disabled || !$new),
  94. 'attr' => array(
  95. 'class' => 'form-control',
  96. 'onchange' => 'Mautic.updateLeadFieldProperties(this.value);'
  97. ),
  98. 'data' => $default,
  99. 'required' => false
  100. )
  101. );
  102. $builder->add(
  103. 'properties_select_template',
  104. 'sortablelist',
  105. array(
  106. 'mapped' => false,
  107. 'label' => 'mautic.lead.field.form.properties.select',
  108. 'option_required' => false
  109. )
  110. );
  111. $builder->add(
  112. 'default_template',
  113. 'text',
  114. array(
  115. 'label' => 'mautic.core.defaultvalue',
  116. 'label_attr' => array('class' => 'control-label'),
  117. 'attr' => array('class' => 'form-control'),
  118. 'required' => false,
  119. 'mapped' => false
  120. )
  121. );
  122. $builder->add(
  123. 'default_bool_template',
  124. 'yesno_button_group',
  125. array(
  126. 'label' => 'mautic.core.defaultvalue',
  127. 'label_attr' => array('class' => 'control-label'),
  128. 'attr' => array('class' => 'form-control'),
  129. 'required' => false,
  130. 'mapped' => false,
  131. 'data' => false
  132. )
  133. );
  134. $builder->add(
  135. 'properties',
  136. 'collection',
  137. array(
  138. 'required' => false,
  139. 'allow_add' => true,
  140. 'error_bubbling' => false
  141. )
  142. );
  143. $builder->add(
  144. 'defaultValue',
  145. 'text',
  146. array(
  147. 'label' => 'mautic.core.defaultvalue',
  148. 'label_attr' => array('class' => 'control-label'),
  149. 'attr' => array('class' => 'form-control'),
  150. 'required' => false
  151. )
  152. );
  153. $formModifier = function (FormEvent $event, $eventName) {
  154. $form = $event->getForm();
  155. $data = $event->getData();
  156. $type = (is_array($data)) ? (isset($data['type']) ? $data['type'] : null) : $data->getType();
  157. if ($type == 'select' || $type == 'lookup') {
  158. $properties = $data->getProperties();
  159. if (isset($properties['list']) && is_string($properties['list'])) {
  160. $properties['list'] = array_map('trim', explode('|', $properties['list']));
  161. }
  162. $form->add(
  163. 'properties',
  164. 'sortablelist',
  165. array(
  166. 'required' => false,
  167. 'label' => 'mautic.lead.field.form.properties.select',
  168. 'data' => $properties
  169. )
  170. );
  171. } elseif ($type == 'boolean') {
  172. if (is_array($data)) {
  173. $value = isset($data['defaultValue']) ? $data['defaultValue'] : false;
  174. $yesLabel = !empty($data['properties']['yes']) ? $data['properties']['yes'] : 'matuic.core.form.yes';
  175. $noLabel = !empty($data['properties']['no']) ? $data['properties']['no'] : 'matuic.core.form.no';
  176. } else {
  177. $value = $data->getDefaultValue();
  178. $props = $data->getProperties();
  179. $yesLabel = !empty($props['yes']) ? $props['yes'] : 'matuic.core.form.yes';
  180. $noLabel = !empty($props['no']) ? $props['no'] : 'matuic.core.form.no';
  181. }
  182. $form->add(
  183. 'defaultValue',
  184. 'yesno_button_group',
  185. array(
  186. 'label' => 'mautic.core.defaultvalue',
  187. 'label_attr' => array('class' => 'control-label'),
  188. 'attr' => array('class' => 'form-control'),
  189. 'required' => false,
  190. 'data' => !empty($value),
  191. 'choice_list' => new ChoiceList(
  192. array(false, true),
  193. array($noLabel, $yesLabel)
  194. )
  195. )
  196. );
  197. }
  198. };
  199. $builder->addEventListener(
  200. FormEvents::PRE_SET_DATA,
  201. function (FormEvent $event) use ($formModifier) {
  202. $formModifier($event, FormEvents::PRE_SET_DATA);
  203. }
  204. );
  205. $builder->addEventListener(
  206. FormEvents::PRE_SUBMIT,
  207. function (FormEvent $event) use ($formModifier) {
  208. $formModifier($event, FormEvents::PRE_SUBMIT);
  209. }
  210. );
  211. //get order list
  212. $transformer = new FieldToOrderTransformer($this->em);
  213. $builder->add(
  214. $builder->create(
  215. 'order',
  216. 'entity',
  217. array(
  218. 'label' => 'mautic.core.order',
  219. 'class' => 'MauticLeadBundle:LeadField',
  220. 'property' => 'label',
  221. 'label_attr' => array('class' => 'control-label'),
  222. 'attr' => array('class' => 'form-control'),
  223. 'query_builder' => function (EntityRepository $er) {
  224. return $er->createQueryBuilder('f')
  225. ->orderBy('f.order', 'ASC');
  226. },
  227. 'required' => false
  228. )
  229. )->addModelTransformer($transformer)
  230. );
  231. $builder->add(
  232. 'alias',
  233. 'text',
  234. array(
  235. 'label' => 'mautic.core.alias',
  236. 'label_attr' => array('class' => 'control-label'),
  237. 'attr' => array(
  238. 'class' => 'form-control',
  239. 'length' => 25,
  240. 'tooltip' => 'mautic.lead.field.help.alias',
  241. ),
  242. 'required' => false,
  243. 'disabled' => ($disabled || !$new)
  244. )
  245. );
  246. $data = ($disabled) ? true : $options['data']->getIsPublished();
  247. $builder->add(
  248. 'isPublished',
  249. 'yesno_button_group',
  250. array(
  251. 'disabled' => $disabled,
  252. 'data' => $data
  253. )
  254. );
  255. $builder->add(
  256. 'isRequired',
  257. 'yesno_button_group',
  258. array(
  259. 'label' => 'mautic.core.required'
  260. )
  261. );
  262. $builder->add(
  263. 'isVisible',
  264. 'yesno_button_group',
  265. array(
  266. 'label' => 'mautic.lead.field.form.isvisible'
  267. )
  268. );
  269. $builder->add(
  270. 'isShortVisible',
  271. 'yesno_button_group',
  272. array(
  273. 'label' => 'mautic.lead.field.form.isshortvisible'
  274. )
  275. );
  276. $builder->add(
  277. 'isListable',
  278. 'yesno_button_group',
  279. array(
  280. 'label' => 'mautic.lead.field.form.islistable'
  281. )
  282. );
  283. $builder->add(
  284. 'isUniqueIdentifer',
  285. 'yesno_button_group',
  286. array(
  287. 'label' => 'mautic.lead.field.form.isuniqueidentifer',
  288. 'attr' => array(
  289. 'tooltip' => 'mautic.lead.field.form.isuniqueidentifer.tooltip'
  290. ),
  291. 'disabled' => ($options['data']->getId()) ? true : false
  292. )
  293. );
  294. $builder->add(
  295. 'isPubliclyUpdatable',
  296. 'yesno_button_group',
  297. array(
  298. 'label' => 'mautic.lead.field.form.ispubliclyupdatable',
  299. 'attr' => array(
  300. 'tooltip' => 'mautic.lead.field.form.ispubliclyupdatable.tooltip'
  301. )
  302. )
  303. );
  304. $builder->add('buttons', 'form_buttons');
  305. if (!empty($options["action"])) {
  306. $builder->setAction($options["action"]);
  307. }
  308. }
  309. /**
  310. * @param OptionsResolverInterface $resolver
  311. */
  312. public function setDefaultOptions(OptionsResolverInterface $resolver)
  313. {
  314. $resolver->setDefaults(
  315. array(
  316. 'data_class' => 'Mautic\LeadBundle\Entity\LeadField'
  317. )
  318. );
  319. }
  320. /**
  321. * @return string
  322. */
  323. public function getName()
  324. {
  325. return "leadfield";
  326. }
  327. }