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.
153 lines
4.0 KiB
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()
|
||
|
{
|
||
|
//
|
||
|
}
|
||
|
}
|