Skip to content

Commit

Permalink
Remove Input usage, rearrange code, fix docblock
Browse files Browse the repository at this point in the history
  • Loading branch information
Kyslik committed Sep 7, 2016
1 parent d43ec1e commit 48f7093
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 121 deletions.
8 changes: 4 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@
],
"require": {
"php": ">=5.6.4",
"Illuminate/Support": "^5",
"Illuminate/Database": "^5"
"Illuminate/Support": "5.1.*|5.2.*|5.3.*",
"Illuminate/Database": "5.1.*|5.2.*|5.3.*"
},
"require-dev": {
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "~5.0"
"phpunit/phpunit": "~5.0",
"orchestra/testbench": "3.3.*"
},
"autoload": {
"psr-4": {
Expand Down
234 changes: 117 additions & 117 deletions src/ColumnSortable/Sortable.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,125 +2,19 @@

namespace Kyslik\ColumnSortable;

use BadMethodCallException;
use ErrorException;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Kyslik\ColumnSortable\Exceptions\ColumnSortableException;
use BadMethodCallException;
use ErrorException;

/**
* Sortable trait.
*/
trait Sortable
{
/**
* @param $query
* @param array|null $default
*
* @return mixed
*/
public function scopeSortable($query, array $default = null)
{
if (Input::has('sort') && Input::has('order')) {
return $this->queryOrderBuilder($query, Input::only(['sort', 'order']));
} elseif (!is_null($default)) {
$default_array = $this->formatDefaultArray($default);
if (Config::get('columnsortable.allow_request_modification', true) && !empty($default_array)) {
Request::merge($default_array);
}
return $this->queryOrderBuilder($query, $default_array);
} else {
return $query;
}
}

/**
* @param $query
* @param HasOne $relation
*
* @return query
*/
private function queryJoinBuilder($query, HasOne $relation)
{
$relatedModel = $relation->getRelated();
$relatedKey = $relation->getForeignKey(); // table.key
$relatedTable = $relatedModel->getTable();

$parentModel = $relation->getParent();
$parentTable = $parentModel->getTable();
$parentKey = $parentTable . '.' . $parentModel->primaryKey; // table.key

return $query->select($parentTable . '.*')->join($relatedTable, $parentKey, '=', $relatedKey);
}

/**
* @param $query
* @param array $a
*
* @return query
*/
private function queryOrderBuilder($query, array $a)
{
$model = $this;

$order = array_get($a, 'order', 'asc');
if (!in_array($order, ['asc', 'desc'])) {
$order = Config::get('columnsortable.default_order', 'asc');
}

$sort = array_get($a, 'sort', null);
if (!is_null($sort)) {
if ($oneToOneSort = $this->getOneToOneSortOrNull($sort)) {
$relationName = $oneToOneSort[0];
$sort = $oneToOneSort[1];

try {
$relation = $query->getRelation($relationName);
$query = $this->queryJoinBuilder($query, $relation);
} catch (BadMethodCallException $e) {
throw new ColumnSortableException($relationName, 1, $e);
} catch (ErrorException $e) {
throw new ColumnSortableException($relationName, 2, $e);
}

$model = $relation->getRelated();
}

if ($this->columnExists($model, $sort)) {
return $query->orderBy($sort, $order);
}
}

return $query;
}

/**
* @param array $a
*
* @return array
*/
private function formatDefaultArray(array $a)
{
$order = Config::get('columnsortable.default_order', 'asc');
reset($a);

if ((bool) count(array_filter(array_keys($a), 'is_string'))) {
$sort = key($a);
$order = array_get($a, $sort, $order);
} else {
$sort = current($a);
}

if (!$sort) {
return [];
}

return ['sort' => $sort, 'order' => $order];
}

/**
* @param array $parameters
*
Expand All @@ -134,7 +28,7 @@ public static function link(array $parameters)
} else {
$title = $parameters[1];
}

$sort = $sortOriginal = $parameters[0];
unset($parameters);

Expand All @@ -156,11 +50,11 @@ public static function link(array $parameters)
}
}

if (Input::get('sort') == $sortOriginal && in_array(Input::get('order'), ['asc', 'desc'])) {
if (Request::get('sort') == $sortOriginal && in_array(Request::get('order'), ['asc', 'desc'])) {
$asc_suffix = Config::get('columnsortable.asc_suffix', '-asc');
$desc_suffix = Config::get('columnsortable.desc_suffix', '-desc');
$icon = $icon . (Input::get('order') === 'asc' ? $asc_suffix : $desc_suffix);
$order = Input::get('order') === 'desc' ? 'asc' : 'desc';
$icon = $icon . (Request::get('order') === 'asc' ? $asc_suffix : $desc_suffix);
$order = Request::get('order') === 'desc' ? 'asc' : 'desc';
} else {
$icon = Config::get('columnsortable.sortable_icon');
$order = Config::get('columnsortable.default_order_unsorted', 'asc');
Expand All @@ -171,7 +65,8 @@ public static function link(array $parameters)
'order' => $order,
];

$queryString = http_build_query(array_merge(array_filter(Request::except('sort', 'order', 'page')), $parameters));
$queryString = http_build_query(array_merge(array_filter(Request::except('sort', 'order', 'page')),
$parameters));
$anchorClass = Config::get('columnsortable.anchor_class', null);
if ($anchorClass !== null) {
$anchorClass = 'class="' . $anchorClass . '"';
Expand All @@ -180,18 +75,18 @@ public static function link(array $parameters)
$iconAndTextSeparator = Config::get('columnsortable.icon_text_separator', '');

$clickableIcon = Config::get('columnsortable.clickable_icon', false);
$trailingTag = $iconAndTextSeparator . '<i class="' . $icon . '"></i>' . '</a>' ;
$trailingTag = $iconAndTextSeparator . '<i class="' . $icon . '"></i>' . '</a>';
if ($clickableIcon === false) {
$trailingTag = '</a>' . $iconAndTextSeparator . '<i class="' . $icon . '"></i>';
}

return '<a ' . $anchorClass . ' href="'. url(Request::path() . '?' . $queryString) . '"' . '>' . htmlentities($title) . $trailingTag;
return '<a ' . $anchorClass . ' href="' . url(Request::path() . '?' . $queryString) . '"' . '>' . htmlentities($title) . $trailingTag;
}

/**
* @param $sort
*
* @return array|null
* @throws ColumnSortableException
*/
private static function getOneToOneSortOrNull($sort)
{
Expand All @@ -207,6 +102,87 @@ private static function getOneToOneSortOrNull($sort)
return null;
}

/**
* @param \Illuminate\Database\Query\Builder $query
* @param array|null $default
*
* @return \Illuminate\Database\Query\Builder
*/
public function scopeSortable($query, array $default = null)
{
if (Request::has('sort') && Request::has('order')) {
return $this->queryOrderBuilder($query, Request::only(['sort', 'order']));
} elseif (!is_null($default)) {
$default_array = $this->formatDefaultArray($default);
if (Config::get('columnsortable.allow_request_modification', true) && !empty($default_array)) {
Request::merge($default_array);
}
return $this->queryOrderBuilder($query, $default_array);
} else {
return $query;
}
}

/**
* @param \Illuminate\Database\Query\Builder $query
* @param array $a
* @return \Illuminate\Database\Query\Builder
* @throws ColumnSortableException
*/
private function queryOrderBuilder($query, array $a)
{
$model = $this;

$order = array_get($a, 'order', 'asc');
if (!in_array($order, ['asc', 'desc'])) {
$order = Config::get('columnsortable.default_order', 'asc');
}

$sort = array_get($a, 'sort', null);
if (!is_null($sort)) {
if ($oneToOneSort = $this->getOneToOneSortOrNull($sort)) {
$relationName = $oneToOneSort[0];
$sort = $oneToOneSort[1];

try {
$relation = $query->getRelation($relationName);
$query = $this->queryJoinBuilder($query, $relation);
} catch (BadMethodCallException $e) {
throw new ColumnSortableException($relationName, 1, $e);
} catch (ErrorException $e) {
throw new ColumnSortableException($relationName, 2, $e);
}

$model = $relation->getRelated();
}

if ($this->columnExists($model, $sort)) {
return $query->orderBy($sort, $order);
}
}

return $query;
}

/**
* @param \Illuminate\Database\Query\Builder $query
* @param HasOne $relation
*
* @return \Illuminate\Database\Query\Builder
*/
private function queryJoinBuilder($query, HasOne $relation)
{
$relatedModel = $relation->getRelated();
$relatedKey = $relation->getForeignKey(); // table.key
$relatedTable = $relatedModel->getTable();

$parentModel = $relation->getParent();
$parentTable = $parentModel->getTable();
$parentKey = $parentTable . '.' . $parentModel->primaryKey; // table.key

return $query->select($parentTable . '.*')->join($relatedTable, $parentKey, '=', $relatedKey);
}

/**
* @param $model
* @param $column
Expand All @@ -221,4 +197,28 @@ private function columnExists($model, $column)
return in_array($column, $model->sortable);
}
}

/**
* @param array $a
*
* @return array
*/
private function formatDefaultArray(array $a)
{
$order = Config::get('columnsortable.default_order', 'asc');
reset($a);

if ((bool)count(array_filter(array_keys($a), 'is_string'))) {
$sort = key($a);
$order = array_get($a, $sort, $order);
} else {
$sort = current($a);
}

if (!$sort) {
return [];
}

return ['sort' => $sort, 'order' => $order];
}
}

0 comments on commit 48f7093

Please sign in to comment.