/** * Отображает блок * * @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)); } }
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(); }
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)); } }
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)); }
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`')); }
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 }
/** * Обрабатывает перемещение блока * @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; } }
/** * Обрабатывает запрос на проверку связи блока с какой-либо страницей * * @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; } }
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(); }