public function getWidgetPageArray() { $sql = 'SELECT p.* FROM `' . Page::tableName() . '` as p INNER JOIN `' . PageWidget::tableName() . '` as pu ON pu.page_id = p.id WHERE pu.widget_id = :widget_id ORDER BY pu.id LIMIT 1'; $command = Yii::app()->db->createCommand($sql); $command->bindValue(':widget_id', $this->widget_id, PDO::PARAM_INT); $page = $command->queryRow(); $page['alias'] = $page[Yii::app()->language . '_alias']; $page['url'] = $page[Yii::app()->language . '_url']; return $page; }
/** * Возвращает размещения блоков по id блока * * @param int $widgetId id блока */ public function actionGetPageWidgetsByWidgetId($widgetId) { $widgetId = (int) $widgetId; $sql = 'SELECT `id` FROM `' . PageWidget::tableName() . '` WHERE `widget_id` = :widget_id'; $command = Yii::app()->db->createCommand($sql); $command->bindValue(':widget_id', $widgetId, PDO::PARAM_INT); echo CJavaScript::jsonEncode($command->queryColumn()); }
/** * Обрабатывает перемещение блока * @param string название области * @param array массив идентификаторов pageWidget'ов размещенных на странице, где делается перемещение * @param integer идентификатор перемещаемого pageWidget'а * @return boolean true в случае удачной операции, false - в обратном случае */ public function move($area, $pageWidgetIds, $pageWidgetId) { $transaction = Yii::app()->db->beginTransaction(); try { $pageWidget = PageWidget::model()->findByPk($pageWidgetId); $isNewArea = $pageWidget->area != $area; // Переносим блок в нужное место и сбрасываем сортировку $sql = 'UPDATE `' . PageWidget::tableName() . '` SET `area` = :area, `order` = 0 WHERE `widget_id` = :widget_id'; $command = Yii::app()->db->createCommand($sql); $command->bindValue(':area', $area, PDO::PARAM_STR); $command->bindValue(':widget_id', $this->id, PDO::PARAM_INT); $command->execute(); // Двигаем блоки на освободившееся место $sql = 'UPDATE `' . PageWidget::tableName() . '` as pu INNER JOIN ( SELECT `page_id` FROM `' . PageWidget::tableName() . '` WHERE `widget_id` = :widget_id ) as pu2 ON pu.`page_id` = pu2.`page_id` SET pu.`order`= pu.`order`-1 WHERE pu.`area` = :area AND pu.`order` > :order'; $command = Yii::app()->db->createCommand($sql); $command->bindValue(':widget_id', $this->id, PDO::PARAM_INT); $command->bindValue(':area', $pageWidget->area, PDO::PARAM_STR); $command->bindValue(':order', $pageWidget->order, PDO::PARAM_INT); $command->execute(); // Выделяем списки блоков, которые идут перед и после перемещаемого блока $pageWidgetOrder = -1; foreach ($pageWidgetIds as $i => $id) { $pageWidgetIds[$i] = intval($id); if ($pageWidgetId == $id) { $pageWidgetOrder = $i; } } $ids = array_flip($pageWidgetIds); $sql = 'SELECT `widget_id`, `id` FROM `' . PageWidget::tableName() . '` WHERE `id` IN (' . implode(', ', $pageWidgetIds) . ')'; $result = Yii::app()->db->createCommand($sql)->queryAll(); $widgetIds = array(); foreach ($result as $row) { $widgetIds[intval($ids[$row['id']])] = $row['widget_id']; } ksort($widgetIds); $preIds = array(); $postIds = array(); foreach ($widgetIds as $i => $id) { if ($i < $pageWidgetOrder) { $preIds[] = $id; } elseif ($i > $pageWidgetOrder) { $postIds[] = $id; } } $preIds = array_reverse($preIds); $co = max(count($preIds), count($postIds)); $_ids = array(); for ($i = 0; $i < $co; $i++) { $_ids[] = array('id' => isset($preIds[$i]) ? $preIds[$i] : 0, 'pre' => true); $_ids[] = array('id' => isset($postIds[$i]) ? $postIds[$i] : 0, 'pre' => false); } // Находим страницы, где нужно правильно разместить перемещаемый блок $sql = 'SELECT * FROM `' . PageWidget::tableName() . '` WHERE `page_id` IN ( SELECT `page_id` FROM `' . PageWidget::tableName() . '` WHERE `widget_id` = :widget_id ) AND `area` = :area AND `widget_id` != :widget_id ORDER BY `order`'; $command = Yii::app()->db->createCommand($sql); $command->bindValue(':area', $area, PDO::PARAM_STR); $command->bindValue(':widget_id', $this->id, PDO::PARAM_INT); $result = $command->queryAll(); $pages = array(); $pageWidgets = array(); foreach ($result as $row) { $pages[$row['page_id']][] = $row['widget_id']; $pageWidgets[$row['widget_id']][] = $row['id']; $widgets[$row['widget_id']][] = $row['page_id']; } // Отделяем страницы, где размещение пройдет просто, а где надо подумать $simplePages = $pages; foreach ($simplePages as $id => $page) { if (count(array_intersect($page, $widgetIds)) == 0) { unset($pages[$id]); } else { unset($simplePages[$id]); } } // Страницы, где в нужной области нету блоков вообще, // дополнительно обрабатывать нету нужды. // Обработка страниц, у которых нету тех блоков, которые есть на текущей if (!empty($simplePages) && is_array($simplePages)) { $onTop = count($preIds) < count($postIds); $this->setOnPagesTopOrBottom(array_keys($simplePages), $onTop, $area); } // Обработка страниц, которые кроме своих блоков имеют также те блоки, которые // присутствуют на текущей странице. Самый сложный вариант. if (!empty($pages) && is_array($pages)) { // Обходим массив с идентификаторами юнитов, которые размещены // вокруг перемещаемого блока $pageIds = array_keys($pages); foreach ($_ids as $k => $r) { $id = $r['id']; if (empty($pageIds)) { break; } if (isset($widgets[$id]) && !empty($widgets[$id]) && is_array($widgets[$id])) { $widgets[$id] = array_intersect($pageIds, $widgets[$id]); } // Если юнит размещен на какой-то странице if (isset($widgets[$id]) && !empty($widgets[$id]) && is_array($widgets[$id])) { // Подвинем соседей $sql = 'UPDATE `' . PageWidget::tableName() . '` as pu INNER JOIN (SELECT `order`, `page_id` FROM `' . PageWidget::tableName() . '` WHERE `page_id` IN (' . implode(', ', $widgets[$id]) . ') AND `widget_id` = :sibling_widget_id GROUP BY `page_id` ) as pu2 ON pu.`page_id` = pu2.`page_id` SET pu.`order` = pu.`order`+1 WHERE pu.`area` = :area AND pu.`widget_id` != :widget_id AND pu.`order` ' . ($r['pre'] ? '>' : '>=') . ' pu2.`order`'; $command = Yii::app()->db->createCommand($sql); $command->bindValue(':area', $area, PDO::PARAM_STR); $command->bindValue(':widget_id', $this->id, PDO::PARAM_INT); $command->bindValue(':sibling_widget_id', $id, PDO::PARAM_INT); $command->execute(); // Установка перемещаемого блока в нужное место $sql = 'UPDATE `' . PageWidget::tableName() . '` as pu INNER JOIN (SELECT `order`, `page_id` FROM `' . PageWidget::tableName() . '` WHERE `page_id` IN (' . implode(', ', $widgets[$id]) . ') AND `widget_id` = :sibling_widget_id GROUP BY `page_id` ) as pu2 ON pu.`page_id` = pu2.`page_id` SET pu.`order` = pu2.`order`' . ($r['pre'] ? '+1' : '-1') . ' WHERE pu.`widget_id` = :widget_id'; $command = Yii::app()->db->createCommand($sql); $command->bindValue(':widget_id', $this->id, PDO::PARAM_INT); $command->bindValue(':sibling_widget_id', $id, PDO::PARAM_INT); $command->execute(); // Из массива страниц убираем уже обработанные $pageIds = array_diff($pageIds, $widgets[$id]); } elseif ($id == 0 && $k < 2) { $this->setOnPagesTopOrBottom($pageIds, $r['pre'], $area); $pageIds = array(); } } } $transaction->commit(); return true; } catch (Exception $e) { $transaction->rollBack(); return false; } }
public function fill() { $sql = 'SELECT * FROM `' . PageWidget::tableName() . '` WHERE `page_id` = :page_id AND `area` NOT LIKE "main%"'; $command = Yii::app()->db->createCommand($sql); $command->bindValue(':page_id', $this->parent_id, PDO::PARAM_INT); $pus = $command->queryAll(); if ($pus && is_array($pus)) { $sql = 'INSERT INTO `' . PageWidget::tableName() . '` (`page_id`, `widget_id`, `order`, `area`) VALUES '; $sql_arr = array(); foreach ($pus as $pu) { $sql_arr[] = '(' . intval($this->id) . ', ' . intval($pu['widget_id']) . ', ' . intval($pu['order']) . ', "' . $pu['area'] . '")'; } $sql .= implode(',', $sql_arr); $command = Yii::app()->db->createCommand($sql); $command->execute(); } }