PageRenderTime 37ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/magento/module-backend/Block/Widget/Grid/Column.php

https://gitlab.com/yousafsyed/easternglamor
PHP | 501 lines | 250 code | 45 blank | 206 comment | 23 complexity | 5ae14ed0d42243a066406993cb5e63c3 MD5 | raw file
  1. <?php
  2. /**
  3. * Copyright © 2016 Magento. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Backend\Block\Widget\Grid;
  7. use Magento\Backend\Block\Widget\Grid\Column\Filter\AbstractFilter;
  8. /**
  9. * Grid column block
  10. *
  11. * @author Magento Core Team <core@magentocommerce.com>
  12. */
  13. class Column extends \Magento\Backend\Block\Widget
  14. {
  15. /**
  16. * Parent grid
  17. *
  18. * @var \Magento\Backend\Block\Widget\Grid
  19. */
  20. protected $_grid;
  21. /**
  22. * Column renderer
  23. *
  24. * @var \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
  25. */
  26. protected $_renderer;
  27. /**
  28. * Column filter
  29. *
  30. * @var AbstractFilter
  31. */
  32. protected $_filter;
  33. /**
  34. * Column css classes
  35. *
  36. * @var string|null
  37. */
  38. protected $_cssClass = null;
  39. /**
  40. * Renderer types
  41. *
  42. * @var array
  43. */
  44. protected $_rendererTypes = [
  45. 'action' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Action',
  46. 'button' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Button',
  47. 'checkbox' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Checkbox',
  48. 'concat' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Concat',
  49. 'country' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Country',
  50. 'currency' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Currency',
  51. 'date' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Date',
  52. 'datetime' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Datetime',
  53. 'default' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Text',
  54. 'draggable-handle' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\DraggableHandle',
  55. 'input' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Input',
  56. 'massaction' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Massaction',
  57. 'number' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Number',
  58. 'options' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Options',
  59. 'price' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Price',
  60. 'radio' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Radio',
  61. 'select' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Select',
  62. 'store' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Store',
  63. 'text' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Longtext',
  64. 'wrapline' => 'Magento\Backend\Block\Widget\Grid\Column\Renderer\Wrapline',
  65. ];
  66. /**
  67. * Filter types
  68. *
  69. * @var array
  70. */
  71. protected $_filterTypes = [
  72. 'datetime' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Datetime',
  73. 'date' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Date',
  74. 'range' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Range',
  75. 'number' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Range',
  76. 'currency' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Range',
  77. 'price' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Price',
  78. 'country' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Country',
  79. 'options' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Select',
  80. 'massaction' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Massaction',
  81. 'checkbox' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Checkbox',
  82. 'radio' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Radio',
  83. 'skip-list' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\SkipList',
  84. 'store' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Store',
  85. 'theme' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Theme',
  86. 'default' => 'Magento\Backend\Block\Widget\Grid\Column\Filter\Text',
  87. ];
  88. /**
  89. * Column is grouped
  90. * @var bool
  91. */
  92. protected $_isGrouped = false;
  93. /**
  94. * @return void
  95. */
  96. public function _construct()
  97. {
  98. if ($this->hasData('grouped')) {
  99. $this->_isGrouped = (bool)$this->getData('grouped');
  100. }
  101. parent::_construct();
  102. }
  103. /**
  104. * Should column be displayed in grid
  105. *
  106. * @return bool
  107. */
  108. public function isDisplayed()
  109. {
  110. return true;
  111. }
  112. /**
  113. * Set grid block to column
  114. *
  115. * @param \Magento\Backend\Block\Widget\Grid $grid
  116. * @return $this
  117. */
  118. public function setGrid($grid)
  119. {
  120. $this->_grid = $grid;
  121. // Init filter object
  122. $this->getFilter();
  123. return $this;
  124. }
  125. /**
  126. * Get grid block
  127. *
  128. * @return \Magento\Backend\Block\Widget\Grid
  129. */
  130. public function getGrid()
  131. {
  132. return $this->_grid;
  133. }
  134. /**
  135. * Retrieve html id of filter
  136. *
  137. * @return string
  138. */
  139. public function getHtmlId()
  140. {
  141. return $this->getGrid()->getId() . '_' . $this->getGrid()->getVarNameFilter() . '_' . $this->getId();
  142. }
  143. /**
  144. * Get html code for column properties
  145. *
  146. * @return string
  147. */
  148. public function getHtmlProperty()
  149. {
  150. return $this->getRenderer()->renderProperty();
  151. }
  152. /**
  153. * Get Header html
  154. * @return string
  155. */
  156. public function getHeaderHtml()
  157. {
  158. return $this->getRenderer()->renderHeader();
  159. }
  160. /**
  161. * Get column css classes
  162. *
  163. * @return string
  164. */
  165. public function getCssClass()
  166. {
  167. if ($this->_cssClass === null) {
  168. if ($this->getAlign()) {
  169. $this->_cssClass .= 'a-' . $this->getAlign();
  170. }
  171. // Add a custom css class for column
  172. if ($this->hasData('column_css_class')) {
  173. $this->_cssClass .= ' ' . $this->getData('column_css_class');
  174. }
  175. if ($this->getEditable()) {
  176. $this->_cssClass .= ' editable';
  177. }
  178. $this->_cssClass .= ' col-' . $this->getId();
  179. }
  180. return $this->_cssClass;
  181. }
  182. /**
  183. * Get column css property
  184. *
  185. * @return string
  186. */
  187. public function getCssProperty()
  188. {
  189. return $this->getRenderer()->renderCss();
  190. }
  191. /**
  192. * Set is column sortable
  193. *
  194. * @param bool $value
  195. * @return void
  196. */
  197. public function setSortable($value)
  198. {
  199. $this->setData('sortable', $value);
  200. }
  201. /**
  202. * Get header css class name
  203. * @return string
  204. */
  205. public function getHeaderCssClass()
  206. {
  207. $class = $this->getData('header_css_class');
  208. $class .= false === $this->getSortable() ? ' no-link' : '';
  209. $class .= ' col-' . $this->getId();
  210. return $class;
  211. }
  212. /**
  213. * @return bool
  214. * @SuppressWarnings(PHPMD.BooleanGetMethodName)
  215. */
  216. public function getSortable()
  217. {
  218. return $this->hasData('sortable') ? (bool)$this->getData('sortable') : true;
  219. }
  220. /**
  221. * Add css class to column header
  222. *
  223. * @param string $className
  224. * @return void
  225. */
  226. public function addHeaderCssClass($className)
  227. {
  228. $classes = $this->getData('header_css_class') ? $this->getData('header_css_class') . ' ' : '';
  229. $this->setData('header_css_class', $classes . $className);
  230. }
  231. /**
  232. * Get header class names
  233. * @return string
  234. */
  235. public function getHeaderHtmlProperty()
  236. {
  237. $str = '';
  238. if ($class = $this->getHeaderCssClass()) {
  239. $str .= ' class="' . $class . '"';
  240. }
  241. return $str;
  242. }
  243. /**
  244. * Retrieve row column field value for display
  245. *
  246. * @param \Magento\Framework\DataObject $row
  247. * @return string
  248. */
  249. public function getRowField(\Magento\Framework\DataObject $row)
  250. {
  251. $renderedValue = $this->getRenderer()->render($row);
  252. if ($this->getHtmlDecorators()) {
  253. $renderedValue = $this->_applyDecorators($renderedValue, $this->getHtmlDecorators());
  254. }
  255. /*
  256. * if column has determined callback for framing call
  257. * it before give away rendered value
  258. *
  259. * callback_function($renderedValue, $row, $column, $isExport)
  260. * should return new version of rendered value
  261. */
  262. $frameCallback = $this->getFrameCallback();
  263. if (is_array($frameCallback)) {
  264. $renderedValue = call_user_func($frameCallback, $renderedValue, $row, $this, false);
  265. }
  266. return $renderedValue;
  267. }
  268. /**
  269. * Retrieve row column field value for export
  270. *
  271. * @param \Magento\Framework\DataObject $row
  272. * @return string
  273. */
  274. public function getRowFieldExport(\Magento\Framework\DataObject $row)
  275. {
  276. $renderedValue = $this->getRenderer()->renderExport($row);
  277. /*
  278. * if column has determined callback for framing call
  279. * it before give away rendered value
  280. *
  281. * callback_function($renderedValue, $row, $column, $isExport)
  282. * should return new version of rendered value
  283. */
  284. $frameCallback = $this->getFrameCallback();
  285. if (is_array($frameCallback)) {
  286. $renderedValue = call_user_func($frameCallback, $renderedValue, $row, $this, true);
  287. }
  288. return $renderedValue;
  289. }
  290. /**
  291. * Retrieve Header Name for Export
  292. *
  293. * @return string
  294. */
  295. public function getExportHeader()
  296. {
  297. if ($this->getHeaderExport()) {
  298. return $this->getHeaderExport();
  299. }
  300. return $this->getHeader();
  301. }
  302. /**
  303. * Decorate rendered cell value
  304. *
  305. * @param string $value
  306. * @param array|string $decorators
  307. * @return string
  308. */
  309. protected function &_applyDecorators($value, $decorators)
  310. {
  311. if (!is_array($decorators)) {
  312. if (is_string($decorators)) {
  313. $decorators = explode(' ', $decorators);
  314. }
  315. }
  316. if (!is_array($decorators) || empty($decorators)) {
  317. return $value;
  318. }
  319. switch (array_shift($decorators)) {
  320. case 'nobr':
  321. $value = '<span class="nobr">' . $value . '</span>';
  322. break;
  323. }
  324. if (!empty($decorators)) {
  325. return $this->_applyDecorators($value, $decorators);
  326. }
  327. return $value;
  328. }
  329. /**
  330. * Set column renderer
  331. *
  332. * @param \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer $renderer
  333. * @return $this
  334. */
  335. public function setRenderer($renderer)
  336. {
  337. $this->_renderer = $renderer;
  338. return $this;
  339. }
  340. /**
  341. * Set renderer type class name
  342. *
  343. * @param string $type type of renderer
  344. * @param string $className renderer class name
  345. * @return void
  346. */
  347. public function setRendererType($type, $className)
  348. {
  349. $this->_rendererTypes[$type] = $className;
  350. }
  351. /**
  352. * Get renderer class name by renderer type
  353. *
  354. * @return string
  355. */
  356. protected function _getRendererByType()
  357. {
  358. $type = strtolower($this->getType());
  359. $rendererClass = isset(
  360. $this->_rendererTypes[$type]
  361. ) ? $this->_rendererTypes[$type] : $this->_rendererTypes['default'];
  362. return $rendererClass;
  363. }
  364. /**
  365. * Retrieve column renderer
  366. *
  367. * @return \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
  368. */
  369. public function getRenderer()
  370. {
  371. if ($this->_renderer === null) {
  372. $rendererClass = $this->getData('renderer');
  373. if (empty($rendererClass)) {
  374. $rendererClass = $this->_getRendererByType();
  375. }
  376. $this->_renderer = $this->getLayout()->createBlock($rendererClass)->setColumn($this);
  377. }
  378. return $this->_renderer;
  379. }
  380. /**
  381. * Set column filter
  382. *
  383. * @param string $filterClass filter class name
  384. * @return void
  385. */
  386. public function setFilter($filterClass)
  387. {
  388. $filterBlock = $this->getLayout()->createBlock($filterClass);
  389. $filterBlock->setColumn($this);
  390. $this->_filter = $filterBlock;
  391. }
  392. /**
  393. * Set filter type class name
  394. *
  395. * @param string $type type of filter
  396. * @param string $className filter class name
  397. * @return void
  398. */
  399. public function setFilterType($type, $className)
  400. {
  401. $this->_filterTypes[$type] = $className;
  402. }
  403. /**
  404. * Get column filter class name by filter type
  405. *
  406. * @return string
  407. */
  408. protected function _getFilterByType()
  409. {
  410. $type = $this->getFilterType() ? strtolower($this->getFilterType()) : strtolower($this->getType());
  411. $filterClass = isset($this->_filterTypes[$type]) ? $this->_filterTypes[$type] : $this->_filterTypes['default'];
  412. return $filterClass;
  413. }
  414. /**
  415. * Get filter block
  416. *
  417. * @return AbstractFilter|false
  418. */
  419. public function getFilter()
  420. {
  421. if ($this->_filter === null) {
  422. $filterClass = $this->getData('filter');
  423. if (false === (bool)$filterClass && false === ($filterClass === null)) {
  424. return false;
  425. }
  426. if (!$filterClass) {
  427. $filterClass = $this->_getFilterByType();
  428. if ($filterClass === false) {
  429. return false;
  430. }
  431. }
  432. $this->_filter = $this->getLayout()->createBlock($filterClass)->setColumn($this);
  433. }
  434. return $this->_filter;
  435. }
  436. /**
  437. * Get filter html code
  438. *
  439. * @return null|string
  440. */
  441. public function getFilterHtml()
  442. {
  443. $filter = $this->getFilter();
  444. $output = $filter ? $filter->getHtml() : '&nbsp;';
  445. return $output;
  446. }
  447. /**
  448. * Check if column is grouped
  449. *
  450. * @return bool
  451. */
  452. public function isGrouped()
  453. {
  454. return $this->_isGrouped;
  455. }
  456. }