示例#1
0
 /**
  * Отображает блок
  *
  * @param int $pageWidgetId id страничного блока
  */
 public function actionWidget($pageWidgetId)
 {
     $pageWidget = PageWidget::model()->with('widget')->findByPk((int) $pageWidgetId);
     if ($pageWidget) {
         $pageWidget->widget->content->widget($pageWidget->widget->class, array('pageWidget' => $pageWidget));
     }
 }
示例#2
0
 public function beforeDelete()
 {
     $pageWidgets = PageWidget::model()->findAll(array('condition' => '`area` = :area', 'params' => array('area' => 'widget' . $this->widget->id . 'ModelArea_items'), 'with' => array('widget'), 'order' => '`order`'));
     foreach ($pageWidgets as $pageWidget) {
         $pageWidget->widget->delete();
         $pageWidget->delete();
     }
     return parent::beforeDelete();
 }
示例#3
0
function smarty_function_accessdenied($params, &$smarty)
{
    echo '<h2 class="error">' . Yii::t('cms', 'Error') . '</h2>';
    echo '<p>' . Yii::t('cms', 'Access denied') . '</p>';
    $widgetLogin = ModelLogin::model()->find();
    if ($widgetLogin && $widgetLogin->widget_id) {
        $pageWidget = PageWidget::model()->find('widget_id = :widget_id', array('widget_id' => $widgetLogin->widget_id));
        $widgetLogin->run(array('pageWidget' => $pageWidget));
    }
}
示例#4
0
    public function run()
    {
        $recordExample = new $this->className();
        if (!$this->order) {
            if (method_exists($recordExample, 'listDefaultOrder')) {
                $this->order = call_user_func(array($recordExample, 'listDefaultOrder'));
            } elseif ($recordExample->hasAttribute('create')) {
                $this->order = $recordExample->hasAttribute('create') . ' DESc';
            }
        }
        if ($recordExample->hasAttribute('widget_id')) {
            $dataProvider = new CActiveDataProvider($this->className, array('criteria' => array('condition' => $this->foreignAttribute . ' = :id', 'with' => 'widget', 'params' => array(':id' => $this->model->id)), 'sort' => array('attributes' => array('title' => array('asc' => 'widget.' . Widget::getI18nFieldName('title', 'Widget'), 'desc' => 'widget.' . Widget::getI18nFieldName('title', 'Widget') . ' DESC', 'label' => 'Title'), '*'), 'defaultOrder' => $this->order), 'pagination' => array('pageSize' => Yii::app()->settings->getValue('defaultsPerPage'))));
        } else {
            $config = array('sort' => array('defaultOrder' => $this->order), 'pagination' => array('pageSize' => Yii::app()->settings->getValue('defaultsPerPage')));
            if ($this->hasModel() && $this->foreignAttribute) {
                $config['criteria'] = array('condition' => $this->foreignAttribute . ' = :id', 'params' => array(':id' => $this->model->id));
            }
            $dataProvider = new CActiveDataProvider($this->className, $config);
        }
        if ($this->hasModel()) {
            $id = __CLASS__ . '_' . get_class($this->model) . '_' . $this->model->id;
        } else {
            $id = __CLASS__ . $this->className;
        }
        $pageId = 0;
        $area = '';
        $pageWidgetId = 0;
        $widgetId = 0;
        if ($this->hasModel() && $this->model->hasAttribute('widget_id')) {
            $pageWidget = PageWidget::model()->find('`widget_id` = :widget_id', array(':widget_id' => $this->model->widget_id));
            if ($pageWidget) {
                $pageWidgetId = $pageWidget->id;
                $widgetId = $this->model->widget_id;
                $pageId = $pageWidget->page_id;
                $area = $pageWidget->area;
            }
        }
        $recordsGrid = $this->widget('zii.widgets.grid.CGridView', array('id' => $id, 'dataProvider' => $dataProvider, 'ajaxUpdate' => $id, 'ajaxVar' => $id, 'selectableRows' => 2, 'afterAjaxUpdate' => 'js:function(id, data)' . <<<JS
{
    cmsReloadPageWidget({$pageWidgetId}, '.cms-pagewidget[rev={$widgetId}]');
}
JS
, 'columns' => array_merge(array(array('class' => 'CCheckBoxColumn', 'id' => $id . '_check')), method_exists($recordExample, 'listColumns') ? call_user_func(array($recordExample, 'listColumns')) : ($recordExample->hasAttribute('widget_id') ? array(array('name' => 'title', 'type' => 'raw', 'header' => Yii::t('cms', 'Title'), 'value' => 'CHtml::link(CHtml::encode($data->widget->title), "#", array("onclick" => "js:javascript:cmsRecordEditForm({$data->id}, \'".get_class($data)."\', \'".$data->widget->id."\', \'' . $id . '\');return false; ", "title"=>"' . Yii::t('cms', 'Edit') . '", "ondblclick"=>""))')) : ($recordExample->hasAttribute(Yii::app()->language . '_title') ? array(array('name' => 'title', 'type' => 'raw', 'header' => Yii::t('cms', 'Title'), 'value' => 'CHtml::link(CHtml::encode($data->title), "#", array("onclick" => "js:javascript:cmsRecordEditForm({$data->id}, \'".get_class($data)."\', \'0\', \'' . $id . '\');return false; ", "title"=>"' . Yii::t('cms', 'Edit') . '", "ondblclick"=>""))')) : array())), $this->columns, array(array('class' => 'CButtonColumn', 'template' => '{view} {update} {del}', 'buttons' => array('view' => array('label' => Yii::t('cms', 'Go to page'), 'url' => '"javascript:cmsGotoRecordPage({$data->id}, \'".get_class($data)."\')"', 'visible' => '$data->hasAttribute("widget_id") && isset($data->widget)'), 'update' => array('url' => '"javascript:cmsRecordEditForm({$data->id}, \'".get_class($data)."\', \'".($data->hasAttribute("widget_id") && isset($data->widget) ? $data->widget->id : 0)."\', \'' . $id . '\');"'), 'del' => array('label' => Yii::t('cms', 'Delete'), 'imageUrl' => '/images/delete.png', 'url' => '"javascript:cmsRecordDelete({$data->id}, \'".get_class($data)."\', \'".($data->hasAttribute("widget_id") && isset($data->widget) ? $data->widget->id : 0)."\', \'' . $id . '\')"')))))), true);
        $this->render('RecordsGrid', array('id' => $id, 'foreignAttribute' => $this->foreignAttribute, 'addButtonTitle' => $this->addButtonTitle, 'pageId' => $pageId, 'area' => $area, 'recordExample' => $recordExample, 'className' => $this->className, 'recordsGrid' => $recordsGrid, 'model' => $this->model, 'pageWidgetId' => $pageWidgetId, 'widgetId' => $widgetId));
    }
示例#5
0
 public function init()
 {
     parent::init();
     $this->params['areaId'] = 'widget' . $this->params['widget']->id . 'ModelArea_items';
     $this->params['pageWidgets'] = PageWidget::model()->findAll(array('condition' => '`area` = :area', 'params' => array('area' => $this->params['areaId']), 'with' => array('widget'), 'order' => '`order`'));
 }
示例#6
0
    public function run()
    {
        list($name, $id) = $this->resolveNameID();
        if (isset($this->htmlOptions['id'])) {
            $id = $this->htmlOptions['id'];
        } else {
            $this->htmlOptions['id'] = $id;
        }
        if (isset($this->htmlOptions['name'])) {
            $name = $this->htmlOptions['name'];
        } else {
            $this->htmlOptions['name'] = $name;
        }
        if ($this->hasModel()) {
            $areaName = 'widget' . $this->model->widget->id . $id;
            $modelId = $this->model->id;
            if ($this->model->isNewRecord) {
                echo Yii::t('cms', 'Please save before using it.');
                return;
            }
            echo CHtml::activeHiddenField($this->model, $this->attribute, $this->htmlOptions);
        } else {
            $areaName = $name;
            $modelId = $id;
            echo CHtml::hiddenField($name, $this->value, $this->htmlOptions);
        }
        $value = $this->hasModel() ? $this->model->{$this->attribute} : $this->value;
        Yii::app()->controller->widget('Area', array('name' => $areaName, 'pageWidgets' => PageWidget::model()->findAll(array('condition' => '`area` = :area', 'params' => array('area' => $areaName), 'with' => array('widget'), 'order' => '`order`'))));
        ?>
<script type="text/javascript">

            // Настройки и обработчики перещения юнитов на странице
            $('#cms-area-<?php 
        echo $areaName;
        ?>
').sortable({
                placeholder: 'cms-pagewidget-highlight',
                revert: true,
                opacity:1,
                forcePlaceholderSize:true,
                cancel:'.cms-pagewidget-menu,.cms-empty-area-buttons',
                update:function(event, ui) {
                    var pageWidgetId = $(ui.item).attr('id').replace('cms-pagewidget-','');
                    var areaName = cmsGetAreaNameByPageWidget(ui.item);
                    if (!ui.sender) {
                        // Запрос на обновление текущей области
                        cmsAjaxSaveArea(cmsGetAreaByPageWidget(ui.item), areaName, <?php 
        echo intval($modelId);
        ?>
, 'pageWidgetId='+pageWidgetId);
                    }
                },
                start:function(event, ui) {
                    $(ui.helper).find('.cms-panel').hide();
                    $('.cms-area').addClass('cms-potential');
                    $('.cms-area').each(function() {
                        if ($(this).find('.cms-pagewidget').length == 0)
                            $(this).addClass('cms-empty-area');
                    });
                    cmsAreaEmptyCheck();
                },
                stop:function(event, ui) {
                    $('.cms-area').removeClass('cms-potential').removeClass('cms-empty-area');
                    cmsAreaEmptyCheck();
                }
            }).disableSelection();

            $('#cms-area-<?php 
        echo $areaName;
        ?>
 .cms-pagewidget').css('cursor', 'move');

            cmsAreaEmptyCheck();


</script>
<style type="text/css">
    #cms-area-<?php 
        echo $areaName;
        ?>
 #pagewidgetpanel_move_li {
        display:none;
    }
</style>
<?php 
    }
示例#7
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;
     }
 }
示例#8
0
 /**
  * Обрабатывает запрос на проверку связи блока с какой-либо страницей
  *
  * @param int $widgetId id блока
  * @param string $return тип возвращаемого ответа (json, html, text)
  */
 public function actionCheck($widgetId, $return = 'json')
 {
     $ret = array();
     $widgetId = (int) $widgetId;
     $widget = Widget::model()->findByPk($widgetId);
     if ($widget && $widget->content && $widget->content->hasAttribute('page_id')) {
         $page = Page::model()->findByPk($widget->content->page_id);
         $pageWidget = PageWidget::model()->find('widget_id = :widget_id AND page_id = :page_id', array(':widget_id' => $widgetId, ':page_id' => $widget->content->page_id));
         if ($page && $pageWidget) {
             $ret['page'] = array('title' => $page->title, 'url' => $this->createAbsoluteUrl('view/index', array('pageId' => $page->id, 'alias' => $page->alias, 'url' => $page->url)), 'similarToParent' => $page->isSimilarTo($page->parent_id, 'all', $widget->id));
         }
     }
     if ($return == 'json') {
         $ret['status'] = 1;
         echo CJavaScript::jsonEncode($ret);
     } else {
         echo (int) $ret;
     }
 }
示例#9
0
文件: Page.php 项目: rosko/Tempo-CMS
    public function afterDelete()
    {
        PageWidget::model()->deleteAll('page_id = :page_id', array(':page_id' => $this->id));
        // Удаляем все блоки, которые больше нигде не размещены
        $sql = 'SELECT `widget`.`id`, `widget`.`class`  FROM `' . Widget::tableName() . '` as `widget`
				LEFT JOIN `' . PageWidget::tableName() . '` as `pagewidget` ON (`widget`.`id` = `pagewidget`.`widget_id`)



		$pus = Yii::app()->db->createCommand($sql)->queryAll();
				WHERE `pagewidget`.`id` IS NULL';
        $ids = array();
        if ($pus && is_array($pus)) {
            foreach ($pus as $pu) {
                $ids[] = intval($pu['id']);
                $widgetClass = $pu['class'];
                $modelClass = call_user_func(array($widgetClass, 'modelClassName'));
                call_user_func(array($modelClass, 'model'))->deleteAll('widget_id = ' . intval($pu['id']));
            }
            $sql = 'DELETE FROM `' . Widget::tableName() . '` WHERE `id` IN (' . implode(',', $ids) . ')';
            Yii::app()->db->createCommand($sql)->execute();
        }
        return parent::afterDelete();
    }