Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Column.php
Go to the documentation of this file.
1 <?php
7 
10 
18 class Column extends Widget
19 {
25  protected $_grid;
26 
32  protected $_renderer;
33 
39  protected $_filter;
40 
46  protected $_cssClass = null;
47 
53  protected $_rendererTypes = [
54  'action' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Action::class,
55  'button' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Button::class,
56  'checkbox' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Checkbox::class,
57  'concat' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Concat::class,
58  'country' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Country::class,
59  'currency' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Currency::class,
60  'date' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Date::class,
61  'datetime' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Datetime::class,
62  'default' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Text::class,
63  'draggable-handle' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\DraggableHandle::class,
64  'input' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Input::class,
65  'massaction' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Massaction::class,
66  'number' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Number::class,
67  'options' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Options::class,
68  'price' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Price::class,
69  'radio' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Radio::class,
70  'select' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Select::class,
71  'store' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Store::class,
72  'text' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Longtext::class,
73  'wrapline' => \Magento\Backend\Block\Widget\Grid\Column\Renderer\Wrapline::class,
74  ];
75 
81  protected $_filterTypes = [
82  'datetime' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Datetime::class,
83  'date' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Date::class,
84  'range' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Range::class,
85  'number' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Range::class,
86  'currency' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Range::class,
87  'price' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Price::class,
88  'country' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Country::class,
89  'options' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Select::class,
90  'massaction' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Massaction::class,
91  'checkbox' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Checkbox::class,
92  'radio' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Radio::class,
93  'skip-list' => \Magento\Backend\Block\Widget\Grid\Column\Filter\SkipList::class,
94  'store' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Store::class,
95  'theme' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Theme::class,
96  'default' => \Magento\Backend\Block\Widget\Grid\Column\Filter\Text::class,
97  ];
98 
103  protected $_isGrouped = false;
104 
108  public function _construct()
109  {
110  if ($this->hasData('grouped')) {
111  $this->_isGrouped = (bool)$this->getData('grouped');
112  }
113 
114  parent::_construct();
115  }
116 
122  public function isDisplayed()
123  {
124  return true;
125  }
126 
133  public function setGrid($grid)
134  {
135  $this->_grid = $grid;
136  // Init filter object
137  $this->getFilter();
138  return $this;
139  }
140 
146  public function getGrid()
147  {
148  return $this->_grid;
149  }
150 
156  public function getHtmlId()
157  {
158  return $this->getGrid()->getId() . '_' . $this->getGrid()->getVarNameFilter() . '_' . $this->getId();
159  }
160 
166  public function getHtmlProperty()
167  {
168  return $this->getRenderer()->renderProperty();
169  }
170 
175  public function getHeaderHtml()
176  {
177  return $this->getRenderer()->renderHeader();
178  }
179 
185  public function getCssClass()
186  {
187  if ($this->_cssClass === null) {
188  if ($this->getAlign()) {
189  $this->_cssClass .= 'a-' . $this->getAlign();
190  }
191  // Add a custom css class for column
192  if ($this->hasData('column_css_class')) {
193  $this->_cssClass .= ' ' . $this->getData('column_css_class');
194  }
195  if ($this->getEditable()) {
196  $this->_cssClass .= ' editable';
197  }
198  $this->_cssClass .= ' col-' . $this->getId();
199  }
200  return $this->_cssClass;
201  }
202 
208  public function getCssProperty()
209  {
210  return $this->getRenderer()->renderCss();
211  }
212 
219  public function setSortable($value)
220  {
221  $this->setData('sortable', $value);
222  }
223 
228  public function getHeaderCssClass()
229  {
230  $class = $this->getData('header_css_class');
231  $class .= false === $this->getSortable() ? ' no-link' : '';
232  $class .= ' col-' . $this->getId();
233  return $class;
234  }
235 
240  public function getSortable()
241  {
242  return $this->hasData('sortable') ? (bool)$this->getData('sortable') : true;
243  }
244 
251  public function addHeaderCssClass($className)
252  {
253  $classes = $this->getData('header_css_class') ? $this->getData('header_css_class') . ' ' : '';
254  $this->setData('header_css_class', $classes . $className);
255  }
256 
261  public function getHeaderHtmlProperty()
262  {
263  $str = '';
264  if ($class = $this->getHeaderCssClass()) {
265  $str .= ' class="' . $class . '"';
266  }
267 
268  return $str;
269  }
270 
277  public function getRowField(\Magento\Framework\DataObject $row)
278  {
279  $renderedValue = $this->getRenderer()->render($row);
280  if ($this->getHtmlDecorators()) {
281  $renderedValue = $this->_applyDecorators($renderedValue, $this->getHtmlDecorators());
282  }
283 
284  /*
285  * if column has determined callback for framing call
286  * it before give away rendered value
287  *
288  * callback_function($renderedValue, $row, $column, $isExport)
289  * should return new version of rendered value
290  */
291  $frameCallback = $this->getFrameCallback();
292  if (is_array($frameCallback)) {
293  $this->validateFrameCallback($frameCallback);
294  $renderedValue = call_user_func($frameCallback, $renderedValue, $row, $this, false);
295  }
296 
297  return $renderedValue;
298  }
299 
308  private function validateFrameCallback(array $callback)
309  {
310  if (!is_object($callback[0]) || !$callback[0] instanceof Widget) {
311  throw new \InvalidArgumentException(
312  "Frame callback host must be instance of Magento\\Backend\\Block\\Widget"
313  );
314  }
315  }
316 
323  public function getRowFieldExport(\Magento\Framework\DataObject $row)
324  {
325  $renderedValue = $this->getRenderer()->renderExport($row);
326 
327  /*
328  * if column has determined callback for framing call
329  * it before give away rendered value
330  *
331  * callback_function($renderedValue, $row, $column, $isExport)
332  * should return new version of rendered value
333  */
334  $frameCallback = $this->getFrameCallback();
335  if (is_array($frameCallback)) {
336  $this->validateFrameCallback($frameCallback);
337  $renderedValue = call_user_func($frameCallback, $renderedValue, $row, $this, true);
338  }
339 
340  return $renderedValue;
341  }
342 
348  public function getExportHeader()
349  {
350  if ($this->getHeaderExport()) {
351  return $this->getHeaderExport();
352  }
353  return $this->getHeader();
354  }
355 
363  protected function &_applyDecorators($value, $decorators)
364  {
365  if (!is_array($decorators)) {
366  if (is_string($decorators)) {
367  $decorators = explode(' ', $decorators);
368  }
369  }
370  if (!is_array($decorators) || empty($decorators)) {
371  return $value;
372  }
373  switch (array_shift($decorators)) {
374  case 'nobr':
375  $value = '<span class="nobr">' . $value . '</span>';
376  break;
377  }
378  if (!empty($decorators)) {
379  return $this->_applyDecorators($value, $decorators);
380  }
381  return $value;
382  }
383 
390  public function setRenderer($renderer)
391  {
392  $this->_renderer = $renderer;
393  return $this;
394  }
395 
403  public function setRendererType($type, $className)
404  {
405  $this->_rendererTypes[$type] = $className;
406  }
407 
413  protected function _getRendererByType()
414  {
415  $type = strtolower($this->getType());
416  $rendererClass = isset(
417  $this->_rendererTypes[$type]
418  ) ? $this->_rendererTypes[$type] : $this->_rendererTypes['default'];
419 
420  return $rendererClass;
421  }
422 
428  public function getRenderer()
429  {
430  if ($this->_renderer === null) {
431  $rendererClass = $this->getData('renderer');
432  if (empty($rendererClass)) {
433  $rendererClass = $this->_getRendererByType();
434  }
435  $this->_renderer = $this->getLayout()->createBlock($rendererClass)->setColumn($this);
436  }
437  return $this->_renderer;
438  }
439 
446  public function setFilter($filterClass)
447  {
448  $filterBlock = $this->getLayout()->createBlock($filterClass);
449  $filterBlock->setColumn($this);
450  $this->_filter = $filterBlock;
451  }
452 
460  public function setFilterType($type, $className)
461  {
462  $this->_filterTypes[$type] = $className;
463  }
464 
470  protected function _getFilterByType()
471  {
472  $type = $this->getFilterType() ? strtolower($this->getFilterType()) : strtolower($this->getType());
473  $filterClass = isset($this->_filterTypes[$type]) ? $this->_filterTypes[$type] : $this->_filterTypes['default'];
474 
475  return $filterClass;
476  }
477 
483  public function getFilter()
484  {
485  if ($this->_filter === null) {
486  $filterClass = $this->getData('filter');
487  if (false === (bool)$filterClass && false === ($filterClass === null)) {
488  return false;
489  }
490  if (!$filterClass) {
491  $filterClass = $this->_getFilterByType();
492  if ($filterClass === false) {
493  return false;
494  }
495  }
496  $this->_filter = $this->getLayout()->createBlock($filterClass)->setColumn($this);
497  }
498 
499  return $this->_filter;
500  }
501 
507  public function getFilterHtml()
508  {
509  $filter = $this->getFilter();
510  $output = $filter ? $filter->getHtml() : '&nbsp;';
511  return $output;
512  }
513 
519  public function isGrouped()
520  {
521  return $this->_isGrouped;
522  }
523 }
getData($key='', $index=null)
Definition: DataObject.php:119
getRowFieldExport(\Magento\Framework\DataObject $row)
Definition: Column.php:323
$type
Definition: item.phtml:13
$_option $_optionId $class
Definition: date.phtml:13
$value
Definition: gender.phtml:16
getRowField(\Magento\Framework\DataObject $row)
Definition: Column.php:277
setData($key, $value=null)
Definition: DataObject.php:72
& _applyDecorators($value, $decorators)
Definition: Column.php:363
if($currentSelectedMethod==$_code) $className
Definition: form.phtml:31