PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/app/code/core/Mage/Backend/Block/Widget/Grid/Column.php

https://github.com/FiveDigital/magento2
PHP | 488 lines | 237 code | 43 blank | 208 comment | 22 complexity | 923668ea73ec2403c0b365abb6fabcd7 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. <?php
  2. /**
  3. * Magento
  4. *
  5. * NOTICE OF LICENSE
  6. *
  7. * This source file is subject to the Open Software License (OSL 3.0)
  8. * that is bundled with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://opensource.org/licenses/osl-3.0.php
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@magentocommerce.com so we can send you a copy immediately.
  14. *
  15. * DISCLAIMER
  16. *
  17. * Do not edit or add to this file if you wish to upgrade Magento to newer
  18. * versions in the future. If you wish to customize Magento for your
  19. * needs please refer to http://www.magentocommerce.com for more information.
  20. *
  21. * @category Mage
  22. * @package Mage_Backend
  23. * @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
  24. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  25. */
  26. /**
  27. * Grid column block
  28. *
  29. * @category Mage
  30. * @package Mage_Backend
  31. * @author Magento Core Team <core@magentocommerce.com>
  32. */
  33. class Mage_Backend_Block_Widget_Grid_Column extends Mage_Backend_Block_Widget
  34. {
  35. /**
  36. * Parent grid
  37. *
  38. * @var Mage_Backend_Block_Widget_Grid
  39. */
  40. protected $_grid;
  41. /**
  42. * Column renderer
  43. *
  44. * @var Mage_Backend_Block_Widget_Grid_Column_Renderer_Abstract
  45. */
  46. protected $_renderer;
  47. /**
  48. * Column filter
  49. *
  50. * @var Mage_Backend_Block_Widget_Grid_Column_Filter_Abstract
  51. */
  52. protected $_filter;
  53. /**
  54. * Column css classes
  55. *
  56. * @var string|null
  57. */
  58. protected $_cssClass=null;
  59. /**
  60. * Renderer types
  61. *
  62. * @var array
  63. */
  64. protected $_rendererTypes;
  65. /**
  66. * Filter types
  67. *
  68. * @var array
  69. */
  70. protected $_filterTypes;
  71. /**
  72. * Block constructor
  73. *
  74. * @param array $data
  75. */
  76. public function __construct($data = array())
  77. {
  78. $this->_rendererTypes = array(
  79. 'date' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Date',
  80. 'datetime' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Datetime',
  81. 'number' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Number',
  82. 'currency' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Currency',
  83. 'price' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Price',
  84. 'country' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Country',
  85. 'concat' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Concat',
  86. 'action' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Action',
  87. 'options' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Options',
  88. 'checkbox' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Checkbox',
  89. 'massaction' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Massaction',
  90. 'radio' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Radio',
  91. 'input' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Input',
  92. 'select' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Select',
  93. 'text' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Longtext',
  94. 'store' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Store',
  95. 'wrapline' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Wrapline',
  96. 'default' => 'Mage_Backend_Block_Widget_Grid_Column_Renderer_Text',
  97. );
  98. $this->_filterTypes = array(
  99. 'datetime' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Datetime',
  100. 'date' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Date',
  101. 'range' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Range',
  102. 'number' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Range',
  103. 'currency' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Range',
  104. 'price' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Price',
  105. 'country' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Country',
  106. 'options' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Select',
  107. 'massaction' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Massaction',
  108. 'checkbox' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Checkbox',
  109. 'radio' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Radio',
  110. 'store' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Store',
  111. 'theme' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Theme',
  112. 'default' => 'Mage_Backend_Block_Widget_Grid_Column_Filter_Text',
  113. );
  114. parent::__construct($data);
  115. }
  116. /**
  117. * Should column be displayed in grid
  118. *
  119. * @return bool
  120. */
  121. public function isDisplayed()
  122. {
  123. return true;
  124. }
  125. /**
  126. * Set grid block to column
  127. *
  128. * @param Mage_Backend_Block_Widget_Grid $grid
  129. * @return Mage_Backend_Block_Widget_Grid_Column
  130. */
  131. public function setGrid($grid)
  132. {
  133. $this->_grid = $grid;
  134. // Init filter object
  135. $this->getFilter();
  136. return $this;
  137. }
  138. /**
  139. * Get grid block
  140. *
  141. * @return Mage_Backend_Block_Widget_Grid
  142. */
  143. public function getGrid()
  144. {
  145. return $this->_grid;
  146. }
  147. /**
  148. * Get html code for column properties
  149. *
  150. * @return string
  151. */
  152. public function getHtmlProperty()
  153. {
  154. return $this->getRenderer()->renderProperty();
  155. }
  156. /**
  157. * Get Header html
  158. * @return string
  159. */
  160. public function getHeaderHtml()
  161. {
  162. return $this->getRenderer()->renderHeader();
  163. }
  164. /**
  165. * Get column css classes
  166. *
  167. * @return string
  168. */
  169. public function getCssClass()
  170. {
  171. if (is_null($this->_cssClass)) {
  172. if ($this->getAlign()) {
  173. $this->_cssClass .= 'a-'.$this->getAlign();
  174. }
  175. // Add a custom css class for column
  176. if ($this->hasData('column_css_class')) {
  177. $this->_cssClass .= ' '. $this->getData('column_css_class');
  178. }
  179. if ($this->getEditable()) {
  180. $this->_cssClass .= ' editable';
  181. }
  182. }
  183. return $this->_cssClass;
  184. }
  185. /**
  186. * Get column css property
  187. *
  188. * @return string
  189. */
  190. public function getCssProperty()
  191. {
  192. return $this->getRenderer()->renderCss();
  193. }
  194. /**
  195. * Set is column sortable
  196. *
  197. * @param boolean $value
  198. */
  199. public function setSortable($value)
  200. {
  201. $this->setData('sortable', $value);
  202. }
  203. /**
  204. * Get header css class name
  205. * @return string
  206. */
  207. public function getHeaderCssClass()
  208. {
  209. $class = $this->getData('header_css_class');
  210. $class .= false === $this->getSortable() ? ' no-link' : '';
  211. return $class;
  212. }
  213. /**
  214. * @return bool
  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. * @param $className
  223. */
  224. public function addHeaderCssClass($className)
  225. {
  226. $classes = $this->getData('header_css_class') ? $this->getData('header_css_class') . ' ' : '';
  227. $this->setData('header_css_class', $classes . $className);
  228. }
  229. /**
  230. * Get header class names
  231. * @return string
  232. */
  233. public function getHeaderHtmlProperty()
  234. {
  235. $str = '';
  236. if ($class = $this->getHeaderCssClass()) {
  237. $str.= ' class="'.$class.'"';
  238. }
  239. return $str;
  240. }
  241. /**
  242. * Retrieve row column field value for display
  243. *
  244. * @param Varien_Object $row
  245. * @return string
  246. */
  247. public function getRowField(Varien_Object $row)
  248. {
  249. $renderedValue = $this->getRenderer()->render($row);
  250. if ($this->getHtmlDecorators()) {
  251. $renderedValue = $this->_applyDecorators($renderedValue, $this->getHtmlDecorators());
  252. }
  253. /*
  254. * if column has determined callback for framing call
  255. * it before give away rendered value
  256. *
  257. * callback_function($renderedValue, $row, $column, $isExport)
  258. * should return new version of rendered value
  259. */
  260. $frameCallback = $this->getFrameCallback();
  261. if (is_array($frameCallback)) {
  262. $renderedValue = call_user_func($frameCallback, $renderedValue, $row, $this, false);
  263. }
  264. return $renderedValue;
  265. }
  266. /**
  267. * Retrieve row column field value for export
  268. *
  269. * @param Varien_Object $row
  270. * @return string
  271. */
  272. public function getRowFieldExport(Varien_Object $row)
  273. {
  274. $renderedValue = $this->getRenderer()->renderExport($row);
  275. /*
  276. * if column has determined callback for framing call
  277. * it before give away rendered value
  278. *
  279. * callback_function($renderedValue, $row, $column, $isExport)
  280. * should return new version of rendered value
  281. */
  282. $frameCallback = $this->getFrameCallback();
  283. if (is_array($frameCallback)) {
  284. $renderedValue = call_user_func($frameCallback, $renderedValue, $row, $this, true);
  285. }
  286. return $renderedValue;
  287. }
  288. /**
  289. * Retrieve Header Name for Export
  290. *
  291. * @return string
  292. */
  293. public function getExportHeader()
  294. {
  295. if ($this->getHeaderExport()) {
  296. return $this->getHeaderExport();
  297. }
  298. return $this->getHeader();
  299. }
  300. /**
  301. * Decorate rendered cell value
  302. *
  303. * @param string $value
  304. * @param array|string $decorators
  305. * @return string
  306. */
  307. protected function &_applyDecorators($value, $decorators)
  308. {
  309. if (!is_array($decorators)) {
  310. if (is_string($decorators)) {
  311. $decorators = explode(' ', $decorators);
  312. }
  313. }
  314. if ((!is_array($decorators)) || empty($decorators)) {
  315. return $value;
  316. }
  317. switch (array_shift($decorators)) {
  318. case 'nobr':
  319. $value = '<span class="nobr">' . $value . '</span>';
  320. break;
  321. }
  322. if (!empty($decorators)) {
  323. return $this->_applyDecorators($value, $decorators);
  324. }
  325. return $value;
  326. }
  327. /**
  328. * Set column renderer
  329. *
  330. * @param Mage_Backend_Block_Widget_Grid_Column_Renderer_Abstract $renderer
  331. * @return Mage_Backend_Block_Widget_Grid_Column
  332. */
  333. public function setRenderer($renderer)
  334. {
  335. $this->_renderer = $renderer;
  336. return $this;
  337. }
  338. /**
  339. * Set renderer type class name
  340. *
  341. * @param string $type type of renderer
  342. * @param string $className renderer class name
  343. */
  344. public function setRendererType($type, $className)
  345. {
  346. $this->_rendererTypes[$type] = $className;
  347. }
  348. /**
  349. * Get renderer class name by renderer type
  350. *
  351. * @return string
  352. */
  353. protected function _getRendererByType()
  354. {
  355. $type = strtolower($this->getType());
  356. $rendererClass = (isset($this->_rendererTypes[$type])) ?
  357. $this->_rendererTypes[$type] :
  358. $this->_rendererTypes['default'];
  359. return $rendererClass;
  360. }
  361. /**
  362. * Retrieve column renderer
  363. *
  364. * @return Mage_Backend_Block_Widget_Grid_Column_Renderer_Abstract
  365. */
  366. public function getRenderer()
  367. {
  368. if (is_null($this->_renderer)) {
  369. $rendererClass = $this->getData('renderer');
  370. if (empty($rendererClass)) {
  371. $rendererClass = $this->_getRendererByType();
  372. }
  373. $this->_renderer = $this->getLayout()->createBlock($rendererClass)
  374. ->setColumn($this);
  375. }
  376. return $this->_renderer;
  377. }
  378. /**
  379. * Set column filter
  380. *
  381. * @param string $filterClass filter class name
  382. */
  383. public function setFilter($filterClass)
  384. {
  385. $filterBlock = $this->getLayout()->createBlock($filterClass);
  386. $filterBlock->setColumn($this);
  387. $this->_filter = $filterBlock;
  388. }
  389. /**
  390. * Set filter type class name
  391. * @param string $type type of filter
  392. * @param string $className filter class name
  393. */
  394. public function setFilterType($type, $className)
  395. {
  396. $this->_filterTypes[$type] = $className;
  397. }
  398. /**
  399. * Get column filter class name by filter type
  400. *
  401. * @return mixed
  402. */
  403. protected function _getFilterByType()
  404. {
  405. $type = strtolower($this->getType());
  406. $filterClass = (isset($this->_filterTypes[$type])) ?
  407. $this->_filterTypes[$type] :
  408. $this->_filterTypes['default'];
  409. return $filterClass;
  410. }
  411. /**
  412. * Get filter block
  413. *
  414. * @return Mage_Backend_Block_Widget_Grid_Column_Filter_Abstract|bool
  415. */
  416. public function getFilter()
  417. {
  418. if (is_null($this->_filter)) {
  419. $filterClass = $this->getData('filter');
  420. if (false === (bool) $filterClass && false === is_null($filterClass)) {
  421. return false;
  422. }
  423. if (!$filterClass) {
  424. $filterClass = $this->_getFilterByType();
  425. if ($filterClass === false) {
  426. return false;
  427. }
  428. }
  429. $this->_filter = $this->getLayout()->createBlock($filterClass)
  430. ->setColumn($this);
  431. }
  432. return $this->_filter;
  433. }
  434. /**
  435. * Get filter html code
  436. *
  437. * @return null|string
  438. */
  439. public function getFilterHtml()
  440. {
  441. $filter = $this->getFilter();
  442. $output = $filter ? $filter->getHtml() : '&nbsp;';
  443. return $output;
  444. }
  445. }