From 3a837ef6bb8445ba8e944741d6f00f763c12e714 Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Fri, 7 Jun 2024 21:48:12 +0200 Subject: initial commit --- src/Columns.php | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 src/Columns.php (limited to 'src/Columns.php') diff --git a/src/Columns.php b/src/Columns.php new file mode 100644 index 0000000..51f0cd7 --- /dev/null +++ b/src/Columns.php @@ -0,0 +1,234 @@ +items = $columns; + } + + /** + * Add a new column + * @param string $column the slug of the column + * @param string $label the label for the column + */ + public function add($columns, $label = null) + { + + if (!is_array($columns)) { + $columns = [$columns => $label]; + } + + foreach ($columns as $column => $label) { + if (is_null($label)) { + $label = str_replace(['_', '-'], ' ', ucfirst($column)); + } + + $this->add[$column] = $label; + } + + return $this; + } + + /** + * Add a column to hide + * @param string $column the slug of the column to hdie + */ + public function hide($columns) + { + if (!is_array($columns)) { + $columns = [$columns]; + } + + foreach ($columns as $column) { + $this->hide[] = $column; + } + + return $this; + } + + /** + * Set a custom callback to populate a column + * @param string $column the column slug + * @param mixed $callback callback function + */ + public function populate($column, $callback) + { + $this->populate[$column] = $callback; + + return $this; + } + + /** + * Define the postion for a columns + * @param string $columns an array of columns + */ + public function order($columns) + { + foreach ($columns as $column => $position) { + $this->positions[$column] = $position; + } + + return $this; + } + + /** + * Set columns that are sortable + * @param string $column the slug of the column + * @param string $meta_value the meta_value to orderby + * @param boolean $is_num whether to order by string/number + */ + public function sortable($sortable) + { + foreach ($sortable as $column => $options) { + $this->sortable[$column] = $options; + } + + return $this; + } + + /** + * Check if an orderby field is a custom sort option. + * @param string $orderby the orderby value from query params + */ + public function isSortable($orderby) + { + if (is_string($orderby) && array_key_exists($orderby, $this->sortable)) { + return true; + } + + foreach ($this->sortable as $column => $options) { + if (is_string($options) && $options === $orderby) { + return true; + } + if (is_array($options) && isset($options[0]) && $options[0] === $orderby) { + return true; + } + } + + return false; + } + + /** + * Get meta key for an orderby. + * @param string $orderby the orderby value from query params + */ + public function sortableMeta($orderby) + { + if (array_key_exists($orderby, $this->sortable)) { + return $this->sortable[$orderby]; + } + + foreach ($this->sortable as $column => $options) { + if (is_string($options) && $options === $orderby) { + return $options; + } + if (is_array($options) && isset($options[0]) && $options[0] === $orderby) { + return $options; + } + } + + return ''; + } + + /** + * Modify the columns for the object + * @param array $columns WordPress default columns + * @return array The modified columns + */ + public function modifyColumns($columns) + { + // if user defined set columns, return those + if (!empty($this->items)) { + return $this->items; + } + + // add additional columns + if (!empty($this->add)) { + foreach ($this->add as $key => $label) { + $columns[$key] = $label; + } + } + + // unset hidden columns + if (!empty($this->hide)) { + foreach ($this->hide as $key) { + unset($columns[$key]); + } + } + + // if user has made added custom columns + if (!empty($this->positions)) { + foreach ($this->positions as $key => $position) { + // find index of the element in the array + $index = array_search($key, array_keys($columns)); + // retrieve the element in the array of columns + $item = array_slice($columns, $index, 1); + // remove item from the array + unset($columns[$key]); + + // split columns array into two at the desired position + $start = array_slice($columns, 0, $position, true); + $end = array_slice($columns, $position, count($columns) - 1, true); + + // insert column into position + $columns = $start + $item + $end; + } + } + + return $columns; + } +} -- cgit v1.2.3