debugEnabled = (bool)$debugEnabled; $this->table = $this->db->prefix . 'gg_photos_pos'; } /** * Updates the position * @param array $data * @return bool */ public function update(array $data) { if (!isset($data['elements']) || count($data['elements']) < 1) { return false; } $this->clearScope($data['scope'], $data['scope_id']); foreach ($data['elements'] as $element) { $this->updatePosition(array( 'photo_id' => (int)$element['photo_id'], 'position' => (int)$element['position'], 'scope_id' => (int)$data['scope_id'], 'scope' => $data['scope'], )); } return true; } /** * Updates position for the single row. * @param array $row * @return bool */ public function updatePosition(array $row) { $query = $this->getQueryBuilder() ->insertInto($this->table) ->fields(array_keys($row)) ->values(array_values($row)); if (!$this->db->query($query->build())) { return false; } return true; } /** * Clears the positions in the selected scope. * @param string $scope Scope type. * @param int $id Scope ID. */ public function clearScope($scope = self::SCOPE_MAIN, $id = 0) { $query = $this->getQueryBuilder() ->deleteFrom($this->table) ->where('scope', '=', $scope) ->andWhere('scope_id', '=', (int)$id); $this->db->query($query->build()); } /** * Returns the positions of the element in the specific scope. * @param int $id Element Id. * @param string $scope Scope type. * @param int $scopeId Scope Id. * @return int */ public function getPosition($id, $scope = self::SCOPE_MAIN, $scopeId = 0) { $query = $this->getQueryBuilder() ->select('position') ->from($this->table) ->where('scope', '=', $scope) ->andWhere('scope_id', '=', (int)$scopeId) ->andWhere('photo_id', '=', (int)$id); if (null === $row = $this->db->get_row($query->build())) { return 0; } return $row->position; } public function getPositions($scope = self::SCOPE_MAIN, $scopeId = 0) { $query = $this->getQueryBuilder() ->select('position, photo_id') ->from($this->table) ->where('scope', '=', $scope) ->andWhere('scope_id', '=', (int)$scopeId); if (null === $row = $this->db->get_results($query->build())) { return 0; } return $row; } /** * get the current position in scope * @param string $scope * @param int $scopeId * @return int current position in scope */ public function getCurrentPosition($scope = self::SCOPE_MAIN, $scopeId = 0){ $query = $this->getQueryBuilder() ->select('max(position) as position') ->from($this->table) ->where('scope','=',$scope) ->andWhere('scope_id', '=', (int)$scopeId); if (null === $row = $this->db->get_row($query->build())) { return 0; } return (int)$row->position + 1; } /** * Extends the photo object with the 'position' property. * @param array|object $photo Photo object. * @param string $scope Scope type. * @param int $scopeId Scope Id. * @return array|object */ public function setPosition($photo, $scope = self::SCOPE_MAIN, $scopeId = 0) { $isArray = false; if (is_array($photo)) { $photo = (object)$photo; $photos = $this->getPositions($scope, $scopeId); $isArray = true; return $photos; } else { $photo->position = $this->getPosition($photo->id, $scope, $scopeId); } return $isArray ? (array)$photo : $photo; } /** * Sorts an array of the photos by thier position. * @param array $photos An array of the photos. * @return array */ /** * Sorts an array of the photos by thier position. * @param array $photos An array of the photos. * @return array */ public function sort(array $photos, $sort = null) { $isObjectCollection = false; $position = array(); $sorted = array(); if (empty($photos)) { return array(); } if($sort == null){ $sort = array( 'sortby' => 'position', 'sortto' => 'asc' ); } // If it is collection of the StdClass, them we are convert it to array. if (is_object($photos[0])) { $isObjectCollection = true; $photos = array_map(array($this, 'toArray'), $photos); } /* echo "
";
var_dump($photos[1]);
echo "";
*/
// Sortto flag.
if($sort['sortto'] == 'asc' || empty($sort['sortto'])){
$sort_flag = SORT_ASC;
} else {
$sort_flag = SORT_DESC;
}
// If $photos is collection of the objects, then conver rows to the objs.
if ($isObjectCollection) {
return array_map(array($this, 'toObject'), $this->sortBy($photos, $sort['sortby'], $sort_flag));
}
// ... or simply return array
return $photos;
}
/**
* Sorted by photos
* @param array $photos
* @param string $sortby Tag when be sorted ('title','position'...)
* @param flag $flag Sorted flag (ASC, DESC)
* @return array $photos
*/
private function sortBy(array $photos, $sortby, $flag)
{
switch ($sortby) {
//По дате добавления
case 'adate':
$date = array();
foreach($photos as $key => $row){
$date[$key] = $row['timestamp'];
}
array_multisort($date, $flag, $photos);
break;
//По дате создания
case 'date':
$date = array();
foreach($photos as $key => $row){
$date[$key] = $row['attachment']['date'];
}
array_multisort($date, $flag, $photos);
break;
//По размеру
case 'size':
$date = array();
foreach($photos as $key => $row){
$date[$key] = $row['attachment']['filesizeInBytes'];
}
array_multisort($date, $flag, $photos);
break;
//По имени
case 'name':
$title = array();
foreach($photos as $key => $row){
$title[$key] = $row['attachment']['name'];
}
array_multisort($title, $flag, $photos);
break;
//По тегам
case 'tags':
$date = array();
foreach($photos as $key => $row){
if(isset($row['tags'])){
$date[$key] = $row['tags'];
} else {
$date[$key] = $row['position'];
}
}
array_multisort($date, $flag, $photos);
break;
// В случайном порядке
case 'randomly':
$countPhoto = count($photos);
for($ind1 = 0; $ind1 < $countPhoto; $ind1++) {
$rndSorArr[] = rand()%500;
}
array_multisort($rndSorArr, $photos);
break;
//По позиции
default:
$position = array();
foreach ($photos as $key => $row) {
$position[$key] = $row['position'];
}
array_multisort($position, $flag, $photos);
break;
}
return $photos;
}
/**
* Casts the element to array.
* @param object $element
* @return array
*/
public function toArray($element)
{
return (array)$element;
}
/**
* Casts the element to object
* @param array $element
* @return object
*/
public function toObject($element)
{
return (object)$element;
}
}