datatable.directory codebase https://datatable.directory/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
datatable.directory/porklib/Providers/MacroServiceProvider.php

153 lines
4.0 KiB

7 years ago
<?php
namespace MightyPork\Providers;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\ServiceProvider;
/**
* Register macros
*/
class MacroServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
/** Natural ordering */
Collection::macro('natSortBy', function ($callback, $caseSensitive = false) {
$results = [];
$callback = $this->valueRetriever($callback);
// First we will loop through the items and get the comparator from a callback
// function which we were given. Then, we will sort the returned values and
// and grab the corresponding values for the sorted keys from this array.
try {
foreach ($this->items as $key => $value) {
$results[$key] = iconv('UTF-8', 'ASCII//TRANSLIT', $callback($value, $key));
}
} catch (\ErrorException $e) {
// some iconv versions do not support translit of UTF-8
foreach ($this->items as $key => $value) {
$results[$key] = simple_translit($callback($value, $key));
}
}
uasort($results, $caseSensitive ? 'strnatcmp' : 'strnatcasecmp');
// Once we have sorted all of the keys in the array, we will loop through them
// and grab the corresponding model so we can set the underlying items list
// to the sorted version. Then we'll just return the collection instance.
foreach (array_keys($results) as $key) {
$results[$key] = $this->items[$key];
}
return new static($results);
});
/** Natural ordering - for strings */
Collection::macro('natSort', function ($caseSensitive = false) {
$results = [];
// First we will loop through the items and get the comparator from a callback
// function which we were given. Then, we will sort the returned values and
// and grab the corresponding values for the sorted keys from this array.
try {
foreach ($this->items as $key => $value) {
$results[$key] = iconv('UTF-8', 'ASCII//TRANSLIT', $value);
}
} catch (\ErrorException $e) {
// some iconv versions do not support translit of UTF-8
foreach ($this->items as $key => $value) {
$results[$key] = simple_translit($value);
}
}
uasort($results, $caseSensitive ? 'strnatcmp' : 'strnatcasecmp');
// Once we have sorted all of the keys in the array, we will loop through them
// and grab the corresponding model so we can set the underlying items list
// to the sorted version. Then we'll just return the collection instance.
foreach (array_keys($results) as $key) {
$results[$key] = $this->items[$key];
}
return new static($results);
});
/** Use this array as keys, callback to produce values */
Collection::macro('asKeys', function ($callback) {
$results = [];
$callback = $this->valueRetriever($callback);
foreach ($this->items as $value) {
$results[$value] = $callback($value);
}
return new static($results);
});
/** Trim all strings */
Collection::macro('trim', function () {
return $this->map(function($x) {
return trim($x);
});
});
/** Trim all strings */
Collection::macro('without', function ($keys) {
if (!is_array($keys)) $keys = [$keys];
return $this->filter(function($v, $k) use($keys) {
return !in_array($k, $keys);
});
});
// --- kpluck ---
Arr::macro('kpluck', function ($array, $value, $key) {
$results = [];
list($value, $key) = static::explodePluckParameters($value, $key);
foreach ($array as $origKey => $item) {
$itemValue = data_get($item, $value);
// THIS was changed to use origKey
if (is_null($key)) {
$results[$origKey] = $itemValue;
} else {
$itemKey = data_get($item, $key);
$results[$itemKey] = $itemValue;
}
}
return $results;
});
/** Pluck, but preserving keys. Single level only! */
Collection::macro('kpluck', function ($value, $key = null) {
return new Collection(Arr::kpluck($this->items, $value, $key));
});
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}