From 07054ece819966f27cafe68a6019c088d8de6e8b Mon Sep 17 00:00:00 2001 From: mokaddem Date: Tue, 6 Jul 2021 12:34:53 +0200 Subject: [PATCH] new: [helpers:listTable] Added listTable --- src/View/Helper/BootstrapHelper.php | 172 +++++++++++++++++++++++++++- 1 file changed, 168 insertions(+), 4 deletions(-) diff --git a/src/View/Helper/BootstrapHelper.php b/src/View/Helper/BootstrapHelper.php index b5502d2..136ef03 100644 --- a/src/View/Helper/BootstrapHelper.php +++ b/src/View/Helper/BootstrapHelper.php @@ -65,10 +65,16 @@ class BootstrapHelper extends Helper public function table($options, $data) { - $bsTable = new BoostrapTable($options, $data); + $bsTable = new BoostrapTable($options, $data, $this); return $bsTable->table(); } + public function listTable($options, $data) + { + $bsListTable = new BoostrapListTable($options, $data, $this); + return $bsListTable->table(); + } + public function button($options) { $bsButton = new BoostrapButton($options); @@ -203,6 +209,7 @@ class BootstrapTabs extends BootstrapGeneric 'card' => false, 'header-variant' => 'light', 'body-variant' => '', + 'body-class' => [], 'nav-class' => [], 'nav-item-class' => [], 'content-class' => [], @@ -321,7 +328,13 @@ class BootstrapTabs extends BootstrapGeneric $html .= $this->genNav(); if ($this->options['card']) { $html .= $this->closeNode('div'); - $html .= $this->openNode('div', ['class' => array_merge(['card-body'], ["bg-{$this->options['body-variant']}", "text-{$this->options['body-text-variant']}"])]); + $html .= $this->openNode('div', [ + 'class' => array_merge( + ['card-body'], + $this->options['body-class'] ?? [], + ["bg-{$this->options['body-variant']}", "text-{$this->options['body-text-variant']}"] + ) + ]); } $html .= $this->genContent(); if ($this->options['card']) { @@ -337,7 +350,13 @@ class BootstrapTabs extends BootstrapGeneric $html .= $this->openNode('div', ['class' => array_merge(['col-' . $this->options['vertical-size'], ($this->options['card'] ? 'card-header border-right' : '')], ["bg-{$this->options['header-variant']}", "text-{$this->options['header-text-variant']}", "border-{$this->options['header-border-variant']}"])]); $html .= $this->genNav(); $html .= $this->closeNode('div'); - $html .= $this->openNode('div', ['class' => array_merge(['col-' . (12 - $this->options['vertical-size']), ($this->options['card'] ? 'card-body2' : '')], ["bg-{$this->options['body-variant']}", "text-{$this->options['body-text-variant']}"])]); + $html .= $this->openNode('div', [ + 'class' => array_merge( + ['col-' . (12 - $this->options['vertical-size']), ($this->options['card'] ? 'card-body2' : '')], + $this->options['body-class'] ?? [], + ["bg-{$this->options['body-variant']}", "text-{$this->options['body-text-variant']}"] + ) + ]); $html .= $this->genContent(); $html .= $this->closeNode('div'); $html .= $this->closeNode('div'); @@ -487,7 +506,7 @@ class BoostrapTable extends BootstrapGeneric { private $bsClasses = null; - function __construct($options, $data) { + function __construct($options, $data, $btHelper) { $this->allowedOptionValues = [ 'variant' => array_merge(BootstrapGeneric::$variants, ['']) ]; @@ -495,6 +514,7 @@ class BoostrapTable extends BootstrapGeneric { $this->fields = $data['fields']; $this->items = $data['items']; $this->caption = !empty($data['caption']) ? $data['caption'] : ''; + $this->btHelper = $btHelper; } private function processOptions($options) @@ -603,6 +623,11 @@ class BoostrapTable extends BootstrapGeneric { { if (isset($field['formatter'])) { $cellContent = $field['formatter']($value, $row); + } else if (isset($field['element'])) { + $cellContent = $this->btHelper->getView()->element($field['element'], [ + 'data' => [$value], + 'field' => ['path' => '0'] + ]); } else { $cellContent = h($value); } @@ -619,6 +644,145 @@ class BoostrapTable extends BootstrapGeneric { } } +class BoostrapListTable extends BootstrapGeneric { + private $defaultOptions = [ + 'striped' => true, + 'bordered' => false, + 'borderless' => false, + 'hover' => true, + 'small' => false, + 'variant' => '', + 'tableClass' => [], + 'bodyClass' => [], + ]; + + private $bsClasses = null; + + function __construct($options, $data, $btHelper) { + $this->allowedOptionValues = [ + 'variant' => array_merge(BootstrapGeneric::$variants, ['']) + ]; + $this->processOptions($options); + $this->fields = $data['fields']; + $this->item = $data['item']; + $this->caption = !empty($data['caption']) ? $data['caption'] : ''; + $this->btHelper = $btHelper; + } + + private function processOptions($options) + { + $this->options = array_merge($this->defaultOptions, $options); + $this->checkOptionValidity(); + } + + public function table() + { + return $this->genTable(); + } + + private function genTable() + { + $html = $this->openNode('table', [ + 'class' => [ + 'table', + "table-{$this->options['variant']}", + $this->options['striped'] ? 'table-striped' : '', + $this->options['bordered'] ? 'table-bordered' : '', + $this->options['borderless'] ? 'table-borderless' : '', + $this->options['hover'] ? 'table-hover' : '', + $this->options['small'] ? 'table-sm' : '', + !empty($this->options['variant']) ? "table-{$this->options['variant']}" : '', + !empty($this->options['tableClass']) ? (is_array($this->options['tableClass']) ? implode(' ', $this->options['tableClass']) : $this->options['tableClass']) : '' + ], + 'id' => $this->options['id'] ?? '' + ]); + + $html .= $this->genCaption(); + $html .= $this->genBody(); + + $html .= $this->closeNode('table'); + return $html; + } + + private function genBody() + { + $body = $this->openNode('tbody', [ + 'class' => [ + !empty($this->options['bodyClass']) ? (is_array($this->options['bodyClass']) ? implode(' ', $this->options['bodyClass']) : $this->options['bodyClass']) : '' + ], + ]); + foreach ($this->fields as $i => $field) { + $body .= $this->genRow($field); + } + $body .= $this->closeNode('tbody'); + return $body; + } + + private function genRow($field) + { + $rowValue = $this->genCell($field); + $rowKey = $this->genNode('th', [ + 'class' => [ + 'col-sm-2' + ], + 'scope' => 'row' + ], h($field['key'])); + $row = $this->genNode('tr',[ + 'class' => [ + 'd-flex', + !empty($field['_rowVariant']) ? "table-{$field['_rowVariant']}" : '' + ] + ], implode('', [$rowKey, $rowValue])); + return $row; + } + + private function genCell($field=[]) + { + if (isset($field['raw'])) { + $cellContent = h($field['raw']); + } else if (isset($field['formatter'])) { + $cellContent = $field['formatter']($this->getValueFromObject($field), $this->item); + } else if (isset($field['type'])) { + $cellContent = $this->btHelper->getView()->element($this->getElementPath($field['type']), [ + 'data' => $this->item, + 'field' => $field + ]); + } else { + $cellContent = h($this->getValueFromObject($field)); + } + return $this->genNode('td', [ + 'class' => [ + 'col-sm-10', + !empty($row['_cellVariant']) ? "bg-{$row['_cellVariant']}" : '' + ] + ], $cellContent); + } + + private function getValueFromObject($field) + { + if (is_array($field)) { + $key = $field['path']; + } else { + $key = $field; + } + $cellValue = Hash::get($this->item, $key); + return $cellValue; + } + + private function getElementPath($type) + { + return sprintf('%s%sField', + $this->options['elementsRootPath'] ?? '', + $type + ); + } + + private function genCaption() + { + return !empty($this->caption) ? $this->genNode('caption', [], h($this->caption)) : ''; + } +} + class BoostrapButton extends BootstrapGeneric { private $defaultOptions = [ 'id' => '',