columnName = $columnName; $this->label = $label; } /** * Specifies a list column rendering mode. Supported modes are: * - text - text column, aligned left * - number - numeric column, aligned right * @param string $type Specifies a render mode as described above */ public function displayAs($type, $config) { $this->type = strtolower($type) ?: $this->type; $this->config = $this->evalConfig($config); return $this; } /** * Process options and apply them to this object. * @param array $config * @return array */ protected function evalConfig($config) { if (isset($config['width'])) { $this->width = $config['width']; } if (isset($config['cssClass'])) { $this->cssClass = $config['cssClass']; } if (isset($config['headCssClass'])) { $this->headCssClass = $config['headCssClass']; } if (isset($config['searchable'])) { $this->searchable = $config['searchable']; } if (isset($config['sortable'])) { $this->sortable = $config['sortable']; } if (isset($config['clickable'])) { $this->clickable = $config['clickable']; } if (isset($config['invisible'])) { $this->invisible = $config['invisible']; } if (isset($config['valueFrom'])) { $this->valueFrom = $config['valueFrom']; } if (isset($config['default'])) { $this->defaults = $config['default']; } if (isset($config['select'])) { $this->sqlSelect = $config['select']; } if (isset($config['relation'])) { $this->relation = $config['relation']; } if (isset($config['format'])) { $this->format = $config['format']; } if (isset($config['path'])) { $this->path = $config['path']; } if (isset($config['align']) && \in_array($config['align'], ['left', 'right', 'center'])) { $this->align = $config['align']; } return $config; } /** * Returns a HTML valid name for the column name. * @return string */ public function getName() { return HtmlHelper::nameToId($this->columnName); } /** * Returns a value suitable for the column id property. * @param string $suffix Specify a suffix string * @return string */ public function getId($suffix = null) { $id = 'column'; $id .= '-'.$this->columnName; if ($suffix) { $id .= '-'.$suffix; } return HtmlHelper::nameToId($id); } /** * Returns the column specific aligment css class. * @return string */ public function getAlignClass() { return $this->align ? 'list-cell-align-' . $this->align : ''; } /** * Returns a raw config item value. * @param string $value * @param string $default * @return mixed */ public function getConfig($value, $default = null) { return array_get($this->config, $value, $default); } /** * Returns this columns value from a supplied data set, which can be * an array or a model or another generic collection. * @param mixed $data * @param mixed $default * @return mixed */ public function getValueFromData($data, $default = null) { $columnName = $this->valueFrom ?: $this->columnName; return $this->getColumnNameFromData($columnName, $data, $default); } /** * Internal method to extract the value of a column name from a data set. * @param string $columnName * @param mixed $data * @param mixed $default * @return mixed */ protected function getColumnNameFromData($columnName, $data, $default = null) { /* * Array column name, eg: column[key][key2][key3] */ $keyParts = HtmlHelper::nameToArray($columnName); $result = $data; /* * Loop the column key parts and build a value. * To support relations only the last column should return the * relation value, all others will look up the relation object as normal. */ foreach ($keyParts as $key) { if ($result instanceof Model && $result->hasRelation($key)) { $result = $result->{$key}; } else { if (is_array($result) && array_key_exists($key, $result)) { $result = $result[$key]; } elseif (!isset($result->{$key})) { return $default; } else { $result = $result->{$key}; } } } return $result; } }