Customdatafields.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?php
  2. namespace Dotdigitalgroup\Email\Block\Adminhtml\Config;
  3. class Customdatafields extends
  4. \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray
  5. {
  6. /**
  7. * Customer attributes.
  8. *
  9. * @var \Magento\Framework\View\Element\BlockInterface
  10. */
  11. public $attributeRenderer;
  12. /**
  13. * Customer datafields.
  14. *
  15. * @var \Magento\Framework\View\Element\BlockInterface
  16. */
  17. public $datafieldRenderer;
  18. /**
  19. * @var \Dotdigitalgroup\Email\Model\Config\Source\Datamapping\Datafields
  20. */
  21. public $datafieldsFactory;
  22. /**
  23. * @var \Magento\Framework\Data\Form\Element\Factory
  24. */
  25. public $elementFactory;
  26. /**
  27. * @var \Magento\Framework\View\Element\BlockInterface
  28. */
  29. public $getDatafieldRenderer;
  30. /**
  31. * @var \Magento\Framework\View\Element\BlockInterface
  32. */
  33. public $getAttributeRenderer;
  34. /**
  35. * Customdatafields constructor.
  36. *
  37. * @param \Magento\Backend\Block\Template\Context $context
  38. * @param \Magento\Framework\Data\Form\Element\Factory $elementFactory
  39. * @param \Dotdigitalgroup\Email\Model\Config\Source\Datamapping\DatafieldsFactory $datafields
  40. * @param array $data
  41. */
  42. public function __construct(
  43. \Magento\Backend\Block\Template\Context $context,
  44. \Magento\Framework\Data\Form\Element\Factory $elementFactory,
  45. \Dotdigitalgroup\Email\Model\Config\Source\Datamapping\DatafieldsFactory $datafields,
  46. array $data = []
  47. ) {
  48. $this->elementFactory = $elementFactory;
  49. $this->datafieldsFactory = $datafields->create();
  50. $this->_addAfter = false;
  51. $this->_addButtonLabel = __('Add New Attribute');
  52. parent::__construct($context, $data);
  53. }
  54. /**
  55. * @return void
  56. */
  57. public function _prepareToRender()
  58. {
  59. $this->getDatafieldRenderer = null;
  60. $this->getAttributeRenderer = null;
  61. $this->addColumn(
  62. 'attribute',
  63. [
  64. 'label' => __('Attribute'),
  65. 'style' => 'width:120px',
  66. ]
  67. );
  68. $this->addColumn(
  69. 'datafield',
  70. [
  71. 'label' => __('Data Field'),
  72. 'style' => 'width:120px',
  73. ]
  74. );
  75. }
  76. /**
  77. * @param string $columnName
  78. *
  79. * @return string
  80. */
  81. public function renderCellTemplate($columnName)
  82. {
  83. if ($columnName == 'attribute' && isset($this->_columns[$columnName])) {
  84. $options = $this->getElement()->getValues();
  85. $element = $this->elementFactory->create('select');
  86. $element->setForm(
  87. $this->getForm()
  88. )->setName(
  89. $this->_getCellInputElementName($columnName)
  90. )->setHtmlId(
  91. $this->_getCellInputElementId('<%- _id %>', $columnName)
  92. )->setValues(
  93. $options
  94. );
  95. return str_replace("\n", '', $element->getElementHtml());
  96. }
  97. if ($columnName == 'datafield' && isset($this->_columns[$columnName])) {
  98. $options = $this->datafieldsFactory->toOptionArray();
  99. $element = $this->elementFactory->create('select');
  100. $element->setForm(
  101. $this->getForm()
  102. )->setName(
  103. $this->_getCellInputElementName($columnName)
  104. )->setHtmlId(
  105. $this->_getCellInputElementId('<%- _id %>', $columnName)
  106. )->setValues(
  107. $options
  108. );
  109. return str_replace("\n", '', $element->getElementHtml());
  110. }
  111. return parent::renderCellTemplate($columnName);
  112. }
  113. /**
  114. * @param \Magento\Framework\DataObject $row
  115. *
  116. * @return null
  117. */
  118. public function _prepareArrayRow(\Magento\Framework\DataObject $row)
  119. {
  120. $options = [];
  121. $options['option_' . $this->_getAttributeRenderer()->calcOptionHash(
  122. $row->getData('attribute')
  123. )]
  124. = 'selected="selected"';
  125. $options['option_' . $this->_getDatafieldRenderer()->calcOptionHash(
  126. $row->getData('datafield')
  127. )]
  128. = 'selected="selected"';
  129. $row->setData('option_extra_attrs', $options);
  130. }
  131. /**
  132. * @return \Magento\Framework\View\Element\BlockInterface|object
  133. *
  134. * @throws \Magento\Framework\Exception\LocalizedException
  135. */
  136. public function _getAttributeRenderer()
  137. {
  138. $this->attributeRenderer = $this->getLayout()->createBlock(
  139. \Dotdigitalgroup\Email\Block\Adminhtml\Config\Select::class,
  140. '',
  141. ['data' => ['is_render_to_js_template' => true]]
  142. );
  143. return $this->attributeRenderer;
  144. }
  145. /**
  146. * @return \Magento\Framework\View\Element\BlockInterface|object
  147. *
  148. * @throws \Magento\Framework\Exception\LocalizedException
  149. */
  150. public function _getDatafieldRenderer()
  151. {
  152. $this->datafieldRenderer = $this->getLayout()->createBlock(
  153. \Dotdigitalgroup\Email\Block\Adminhtml\Config\Select::class,
  154. '',
  155. ['data' => ['is_render_to_js_template' => true]]
  156. );
  157. return $this->datafieldRenderer;
  158. }
  159. /**
  160. * @return string
  161. *
  162. * @throws \Exception
  163. */
  164. public function _toHtml()
  165. {
  166. return '<input type="hidden" id="' . $this->getElement()->getHtmlId()
  167. . '"/>' . parent::_toHtml();
  168. }
  169. }