/** * Saves the display_order * * @throws CHttpException */ public function sortModel() { if (!$this->model->hasAttribute('display_order')) { throw new CHttpException(400, 'This object cannot be ordered'); } if (Yii::app()->request->isPostRequest) { $post = Yii::app()->request->getPost($this->modelName); $page = Yii::app()->request->getPost('page'); if (!array_key_exists('display_order', $post) || !is_array($post['display_order'])) { throw new CHttpException(400, 'No objects to order were provided'); } foreach ($post['display_order'] as $displayOrder => $id) { $model = $this->model->findByPk($id); if (!$model) { throw new CHttpException(400, 'Object to be ordered not found'); } //Add one because display_order not zero indexed. //Times by page number to get correct order across pages. $model->display_order = ($displayOrder + 1) * $page; if (!$model->validate()) { throw new CHttpException(400, 'Order was invalid'); } if (!$model->save()) { throw new CHttpException(500, 'Unable to save order'); } } $this->audit('sort'); } }
/** * Generates the required Criteria object for the search. * * @param string|array $attr */ protected function generateCriteria($attr = 'search') { if (is_array($attr)) { $search = $attr; $sensitive = false; } else { $search = $this->request->getParam($attr); $sensitive = $this->request->getParam('case_sensitive', false); } if (is_array($search)) { foreach ($search as $key => $value) { if ($key === 'exact') { continue; } $exactMatch = isset($search['exact'][$key]) && $search['exact'][$key]; if (!is_array($value)) { $this->addCompare($this->criteria, $key, $value, $sensitive, 'AND', $exactMatch); } else { if ($key === 'filterid') { foreach ($value as $fieldName => $fieldValue) { if ($fieldValue > 0) { $this->addCompare($this->criteria, $fieldName, $fieldValue, $sensitive, 'AND', true); } } } if (!isset($value['value'])) { //no value provided to search against continue; } $searchTerm = $value['value']; $this->addCompare($this->criteria, $key, $searchTerm, $sensitive, 'AND', $exactMatch); if (array_key_exists('compare_to', $value) && is_array($value['compare_to'])) { foreach ($value['compare_to'] as $compareTo) { $this->addCompare($this->criteria, $compareTo, $searchTerm, $sensitive, 'OR', $exactMatch); } } } } } if ($this->model->hasAttribute('display_order')) { $this->criteria->order = 'display_order asc'; } else { $order = $this->request->getParam('d'); $sortColumn = $this->request->getParam('c'); if ($sortColumn) { $this->relationalAttribute($this->criteria, $sortColumn, $attr); if ($order) { $sortColumn .= ' DESC'; } $this->criteria->order = $sortColumn; } } }