示例#1
0
 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;
 }
示例#2
0
 /**
  * Возвращает размещения блоков по 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());
 }
示例#3
0
 /**
  * Обрабатывает перемещение блока
  * @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;
     }
 }
示例#4
0
文件: Page.php 项目: rosko/Tempo-CMS
 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();
     }
 }