public function __construct($config = null, $format = 'native', $default = array()) { if (!is_null($config)) { if ($format == 'FieldSet') { $_inputConfig = $config; $inputConfig = array(); $config = array(); foreach ($_inputConfig as $key => $field) { if (isset($field['i18n']) && $field['i18n']) { unset($field['i18n']); $langs = I18nActiveRecord::getLangs(); foreach ($langs as $langId => $langTitle) { $_field = $field; if (is_string($_field['label']) && $_field['label']) { $_field['label'] .= ' [' . Yii::t('languages', $langTitle) . ']'; } if (is_string($_field['hint']) && $_field['hint']) { $_field['hint'] .= ' [' . Yii::t('languages', $langTitle) . ']'; } $_field['name'] = $langId . '_' . $_field['name']; $inputConfig[] = $_field; } } else { $inputConfig[] = $field; } } foreach ($inputConfig as $key => $field) { $name = $field['name']; unset($field['name']); if (isset($default[$name])) { $field['default'] = $default[$name]; } if (is_array($field['label'])) { $field['label'] = $field['label'][Yii::app()->language]; } if (is_array($field['hint'])) { $field['hint'] = $field['hint'][Yii::app()->language]; } if (isset($field['rules'])) { foreach ($field['rules'] as $i => $rule) { array_unshift($rule, $name); $field['rules'][$i] = $rule; } } if (empty($field['rules'])) { $field['rules'] = array(array($name, 'safe')); } $config[$name] = $field; } } $this->configure($config); } }
/** * Responds to {@link CModel::onBeforeSave} event. * Sets the values of the creation or modified attributes as configured * * @param CModelEvent event parameter */ protected function prepareSerialAttributes() { if (method_exists($this->getOwner(), 'i18n')) { $langs = array_keys(I18nActiveRecord::getLangs(Yii::app()->language)); $intersect = array_intersect($this->serialAttributes, $this->getOwner()->i18n()); foreach ($intersect as $attribute) { foreach ($langs as $lang) { $this->serialAttributes[] = $lang . '_' . $attribute; } } } }
public function install() { $defaultRoles = array(self::ADMINISTRATOR => 'Administrator', self::EDITOR => 'Editor', self::AUTHOR => 'Author'); foreach ($defaultRoles as $roleId => $roleName) { $role = new self(); $role->name = $roleId; $role->title = Yii::t('cms', $roleName); $langs = array_keys(I18nActiveRecord::getLangs(Yii::app()->language)); foreach ($langs as $lang) { $role->{$lang . '_title'} = Yii::t('cms', $roleName, array(), null, $lang); } $role->save(false); } }
public static function localizedLabels($labels) { $l = array(); $langs = I18nActiveRecord::getLangs(Yii::app()->language); foreach ($labels as $k => $v) { $l[$k] = $v; if (in_array($k, self::i18n())) { foreach (array_keys($langs) as $lang) { $l[$lang . '_' . $k] = $v . ' [' . Yii::t('languages', $langs[$lang]) . ']'; } } } return $l; }
public function init() { if (!is_file(Yii::getPathOfAlias('config.general') . '.php')) { // ToDo: Сделать вызов инсталлятора Yii::app()->end(); } ini_set('mbstring.internal_encoding', 'UTF-8'); ini_set('mbstring.func_overload', 2); if (Yii::app()->settings->getValue('timezone')) { $timezone = Yii::app()->settings->getValue('timezone'); if (Yii::app()->user->data && Yii::app()->user->data->timezone) { $timezone = Yii::app()->user->data->timezone; } date_default_timezone_set($timezone); $tz = date("Z"); $tz = sprintf('%s%02d:%02d', $tz < 0 ? '-' : '+', abs($tz / 3600), abs($tz % 3600) / 60); Yii::app()->db->createCommand('set @@session.time_zone = "' . $tz . '";')->execute(); } $language = 'en'; $langs = array_keys(I18nActiveRecord::getLangs()); if (Yii::app()->request->preferredLanguage && in_array(Yii::app()->request->preferredLanguage, $langs)) { $language = Yii::app()->request->preferredLanguage; } if (Yii::app()->settings->getValue('language')) { $language = Yii::app()->settings->getValue('language'); } if (isset($_REQUEST['language']) && in_array($_REQUEST['language'], $langs)) { $language = $_REQUEST['language']; } if (!in_array($language, $langs)) { $language = $langs[0]; } Yii::app()->language = $language; // $e = Yii::app()->user->checkAccess('read', array('object' => array('Page', 1))); // echo intval($e); // Yii::app()->end(); if (!Yii::app()->request->isAjaxRequest) { Yii::app()->getClientScript()->registerCssFile(Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('application.assets.css')) . '/icons/' . Yii::app()->params['icons'] . '.css'); } ContentUnit::loadUnits(); Yii::app()->getClientScript()->packages = (require Yii::getPathOfAlias('application.config') . '/packages.php'); }
/** * Создает новую страницу */ public function actionAdd() { $page = Page::defaultObject(); if (isset($_POST['Page'])) { $page->parent_id = $_POST['Page']['parent_id']; $_POST['Page']['url'] = $page->parent->url . '/' . $_POST['Page']['alias']; $langs = array_keys(I18nActiveRecord::getLangs(Yii::app()->language)); foreach ($langs as $lang) { $alias_param = $lang . '_alias'; $url_param = $lang . '_url'; if (isset($_POST['Page'][$alias_param])) { $_POST['Page'][$url_param] = $page->parent->{$url_param} . '/' . $_POST['Page'][$alias_param]; } } } $form_array = Page::form(); $form_array['id'] = 'PageAdd'; $form_array['activeForm'] = Form::ajaxify($form_array['id']); $form_array['buttons']['go'] = array('type' => 'submit', 'label' => Yii::t('cms', 'Save and Go'), 'title' => Yii::t('cms', 'Save and Go to the new page')); $form = new Form($form_array); $form->id = $form_array['id']; $form->model = $page; $this->performAjaxValidation($page); if ($form->submitted('save') || $form->submitted('go')) { $page = $form->model; // if ($form->validate()) { if ($page->save(false)) { // Проверяем каждую область и вставляем блоки с родительской страницы в сквозных областях $page->fill(); if ($form->submitted('go')) { $alias_param = Yii::app()->language . '_alias'; $url = $this->createAbsoluteUrl('view/index', array('pageId' => $page->id, 'alias' => $page->{$alias_param}, 'url' => $page->generateUrl(true, $alias_param))); echo CJavaScript::jsonEncode(array('url' => $url, 'id' => $page->id)); Yii::app()->user->setFlash('add', 'Page has been created successfully'); Yii::app()->end(); } } // } } $caption = array('icon' => 'add', 'label' => Yii::t('cms', 'New page')); $this->render('/form', array('form' => $form, 'caption' => $caption)); }
protected function validateAttribute($object, $attribute) { if ($object->id == 1) { $this->allowEmpty = true; } $langs = array_keys(I18nActiveRecord::getLangs()); $attr = $attribute; $p = explode('_', $attribute); if (in_array($p[0], $langs)) { $attr = $p[1]; } foreach ($langs as $lang) { $this->attributeName = $lang . '_' . $attr; $value = $object->{$this->attributeName}; $p = explode('/', $value); if (!$this->allowEmpty && ($value == '' || empty($p[count($p) - 1])) || in_array($value, $this->restrictedUrls())) { $this->addError($object, $attribute, Yii::t('yii', '{attribute} is invalid.')); } parent::validateAttribute($object, $attribute); } }
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; } $value = $this->hasModel() ? $this->model->{$this->attribute} : $this->value; if (!is_array($value)) { $unser = @unserialize($value); $value = $unser === FALSE ? $value : $unser; } $langs = I18nActiveRecord::getLangs(Yii::app()->language); $this->render('ListEdit', array('id' => $id, 'name' => $name, 'items' => $value, 'langs' => $langs)); }
public function parsePathInfo($pathInfo) { if (isset($_GET['language'])) { $langs = I18nActiveRecord::getLangs(); if (!isset($langs[$_GET['language']])) { if (isset($_GET['url'])) { $_REQUEST['url'] = $_GET['url'] = $_GET['language'] . '/' . $_GET['url']; } elseif (isset($_GET['alias'])) { $_REQUEST['url'] = $_GET['url'] = $_GET['language'] . '/' . $_GET['alias']; unset($_GET['alias']); unset($_REQUEST['alias']); } else { if ($this->fullUrl) { $_REQUEST['url'] = $_GET['url'] = $_GET['language']; } else { $_REQUEST['alias'] = $_GET['alias'] = $_GET['language']; } } unset($_GET['language']); unset($_REQUEST['language']); } } }
foreach ($langs as $lang) { $js .= <<<JS \$('#{$form->uniqueId} #Page_{$lang}_alias').bind('keyup change',function() { \$(this).val(cmsSanitizeAlias(\$(this).val())); \$('#{$form->uniqueId} #Page_{$lang}_url').val(cmsMakeUrl(cmsSanitizeAlias(\$(this).val()), \$('#{$form->uniqueId} #Page_{$lang}_url').val())); }); JS; } } $cs->registerScript('page_js', $js, CClientScript::POS_READY); } else { if ($showTitle === false) { $js = "\$('#{$form->uniqueId} .field_title').hide();"; $cs->registerScript('hide_title', $js, CClientScript::POS_READY); } else { $langs = array_keys(I18nActiveRecord::getLangs(Yii::app()->language)); if (empty($langs)) { $js = "\$('#{$form->uniqueId} .field_title').prependTo('#{$form->uniqueId} .ui-tabs-panel:eq(0)')"; } else { $js = "\$('#{$form->uniqueId}_field_title').prependTo('#{$form->uniqueId} .ui-tabs-panel:eq(0)')"; } $cs->registerScript('move_title', $js, CClientScript::POS_READY); } } $js = ''; if (Yii::app()->settings->getValue('showWidgetAppearance') && $form['widget']->model) { $txtAppearance = Yii::t('cms', 'Appearance'); $js .= <<<JS if (\$('#{$form->uniqueId} .field_template').length) { \$('#{$form->uniqueId} ul.ui-tabs-nav a').each(function() {
public function init() { parent::init(); $this->params['languages'] = I18nActiveRecord::getLangs(); }
public function installTable($className, $tableName = '') { if (!$this->allowAccess()) { return false; } if (!is_object($className) && !class_exists($className)) { return false; } $options = ' ENGINE=InnoDB DEFAULT CHARSET=utf8 '; if (!$tableName && method_exists($className, 'tableName')) { $tableName = call_user_func(array($className, 'tableName')); } Yii::app()->getCache()->delete('yii:dbschema' . Yii::app()->getDb()->connectionString . ':' . Yii::app()->getDb()->username . ':' . $tableName); if (method_exists($className, 'scheme') && $tableName) { $scheme = call_user_func(array($className, 'scheme')); if (method_exists($className, 'baseScheme') && $tableName) { $scheme = CMap::mergeArray(call_user_func(array($className, 'baseScheme')), $scheme); } if (method_exists($className, 'i18n')) { $i18n_columns = call_user_func(array($className, 'i18n')); $langs = array_keys(I18nActiveRecord::getLangs()); $columns = array(); foreach ($scheme as $k => $v) { if (in_array($k, $i18n_columns)) { foreach ($langs as $lang) { $columns[$lang . '_' . $k] = $v; } } else { $columns[$k] = $v; } } } else { $columns = $scheme; } if (!Yii::app()->db->createCommand('show tables like "' . $tableName . '"')->queryColumn()) { Yii::app()->db->createCommand()->createTable($tableName, $columns, $options); if (method_exists($className, 'install')) { call_user_func(array($className, 'install')); } } elseif (method_exists($className, 'getTableSchema')) { $tableSchema = call_user_func(array($className, 'model'))->getTableSchema(); $simpleScheme = self::getSimpleScheme($tableSchema); $add_columns = array_diff_assoc($columns, $simpleScheme); foreach ($add_columns as $k => $v) { if (isset($simpleScheme[$k])) { Yii::app()->db->createCommand()->alterColumn($tableName, $k, $v); } else { Yii::app()->db->createCommand()->addColumn($tableName, $k, $v); if (isset($langs) && is_array($langs)) { $underscorePos = strpos($k, '_'); if ($underscorePos !== false) { $prefix = substr($k, 0, $underscorePos); $base = substr($k, $underscorePos + 1); if (isset($simpleScheme[$base]) && in_array($prefix, $langs)) { Yii::app()->getDb()->createCommand('update `' . $tableName . '` set `' . $k . '` = `' . $base . '`')->execute(); } } } } } } } }
/** * Обрабатывает запрос на редактирование блока * * @param int $pageWidgetId id редактируемого страничного блока * @param int $widgetId id редактируемого блока * @param int $pageId id страницы, на которой размещается блок * (используется, если предполагается создание нового блока) * @param int $prevPageWidgetId id блока, после которого размещается текущий блок * (используется, если предполагается создание нового блока) * @param string $area название области страницы где размещается блок * (используется, если предполагается создание нового блока) * (используется, если предполагается создание нового блока) * @param string $modelClass имя класса модели редактируемой записи * @param string $widgetClass имя класса виджета редактируемого блока * @param int $recordId id редактируемой записи * @param int $sectionId * @param string foreignAttribute * @param string $return тип возвращаемого ответа (json, html) */ public function actionEdit($pageWidgetId = 0, $widgetId = 0, $pageId = 0, $prevPageWidgetId = 0, $area = 'main', $modelClass = '', $widgetClass = '', $recordId = 0, $sectionId = 0, $foreignAttribute = '', $return = 'html') { $ret = true; // Обрабатываем входящие параметры и находим (или создаем) необходимые объекты $pageWidgetId = (int) $pageWidgetId; $widgetId = (int) $widgetId; $recordId = (int) $recordId; $pageId = (int) $pageId; // Если указан id страничного блока if ($pageWidgetId > 0) { $pageWidget = PageWidget::model()->with('widget')->findByPk($pageWidgetId); if ($pageWidget) { $widget = $pageWidget->widget; $widgetClass = $widget->class; $content = $widget->content; $content->scenario = 'edit'; } // Если указан id блока в общем } elseif ($widgetId > 0) { $widget = Widget::model()->findByPk($widgetId); $widgetClass = $widget->class; if ($widget) { $content = $widget->content; $content->scenario = 'edit'; } // Если указан класс и id модели } elseif ($recordId > 0 && $modelClass) { $content = call_user_func(array($modelClass, 'model'))->findByPk($recordId); $content->scenario = 'edit'; // Если указан только класс виджета } elseif ($widgetClass || $modelClass) { if ($widgetClass) { $modelClass = call_user_func(array($widgetClass, 'modelClassName')); } if (method_exists($modelClass, 'defaultObject')) { $content = call_user_func(array($modelClass, 'defaultObject')); } else { $content = new $modelClass(); } $content->scenario = 'add'; } else { $ret = false; } if (!isset($widget) && $content && $content->hasAttribute('widget_id')) { if (!empty($content->widget_id)) { $widget = $content->widget; $widgetClass = $widget->class; } elseif ($content->scenario == 'add') { $widget = new Widget(); } } $modelClass = get_class($content); $langs = array_keys(I18nActiveRecord::getLangs(Yii::app()->language)); // Если блок новый, заполняем его исходными данными if (isset($widget) && $widgetClass && $widget->isNewRecord) { $widget->class = $widgetClass; $widget->title = call_user_func(array($modelClass, 'modelName')); foreach ($langs as $lang) { $widget->{$lang . '_title'} = call_user_func(array($modelClass, 'modelName'), $lang); } } // Если указывается внешний ключ $sectionId = (int) $sectionId; if ($sectionId && $foreignAttribute && $content->hasAttribute($foreignAttribute)) { $content->{$foreignAttribute} = $sectionId; } // Делаем форму редактирования $id = 'WidgetEdit' . $modelClass; $widgetFormArray = call_user_func(array($modelClass, 'form')); $widgetFormArray['type'] = 'form'; $widgetFormArray['id'] = $id; $showTitle = true; if (isset($widgetFormArray['title'])) { if ($widgetFormArray['title'] === false) { $showTitle = false; } unset($widgetFormArray['title']); } // В окно редактирования свойств подключаем диалог для управления размещением // todo: нужно исправить урл // if (isset($pageWidget)) { // $widgetFormArray['elements'][] = Form::tab('Размещение', '/?r=widget/setDialog&pageId='.$pageWidget->page_id.'&widgetId='.$pageWidget->widget_id.'&pageWidgetId='.$pageWidget->id); // } $formArray = array('id' => $id, 'activeForm' => Form::ajaxify($id), 'action' => Yii::app()->request->getUrl(), 'buttons' => array('save' => array('type' => 'submit', 'label' => Yii::t('cms', 'Save'), 'title' => Yii::t('cms', 'Save and close window')), 'apply' => array('type' => 'submit', 'label' => Yii::t('cms', 'Apply'), 'title' => Yii::t('cms', 'Save and continue editing')))); if ($content->scenario == 'add') { $formArray['activeForm']['clientOptions']['afterValidate'] = 'js:function(f,d,h)' . <<<JS {cmsAjaxSubmitForm(f,d,h, { onSuccess: function(html) { var params = \$(html).find('form').attr('action').split('&'); for (var i=0; i<params.length; i++) { var a = params[i].split('='); if (a[0] == 'pageWidgetId') { var pageWidgetId = a[1]; } if (a[0] == 'widgetId') { var widgetId = a[1]; } } var prevPageWidgetId = '{$prevPageWidgetId}'; var areaName = '{$area}'; var widgetClass = '{$widgetClass}'; var pageId = '{$pageId}'; if (\$('#cms-pagewidget-'+pageWidgetId).length==0) { if (prevPageWidgetId != '0') { var prevPageWidget = \$('#cms-pagewidget-'+prevPageWidgetId); } else { var prevPageWidget = \$('#cms-area-'+areaName).find('.cms-empty-area-buttons').eq(0); } prevPageWidget.after('<div id="cms-pagewidget-'+pageWidgetId+'" class="cms-pagewidget cms-widget-'+widgetClass+'" rel="'+widgetClass+'" rev="'+widgetId+'" style="cursor:move;"></div>'); } var pageWidget = \$('#cms-pagewidget-'+pageWidgetId); if (pageWidget.length) { var origBg = pageWidget.css('backgroundColor'); cmsReloadPageWidget(pageWidgetId, '.cms-pagewidget[rev='+widgetId+']', function() { cmsAreaEmptyCheck(); }); pageWidget.css('backgroundColor', '#FFFF00').animate({ backgroundColor: origBg }, 2500); \$.scrollTo('#cms-pagewidget-'+pageWidgetId, 'normal', { offset: -10 }); } } }); } JS; } if (substr($widgetFormArray['elements'][0], 0, 2) != Form::TAB_DELIMETER || substr($widgetFormArray['elements'][0], -2) != Form::TAB_DELIMETER) { $formArray['title'] = ''; } if (method_exists($modelClass, 'modelName')) { if (is_subclass_of($modelClass, 'Content')) { $caption = array('icon' => call_user_func(array($modelClass, 'icon')), 'label' => call_user_func(array($modelClass, 'modelName'))); } else { $caption = array('icon' => $content->icon(), 'label' => $content->modelName()); } } else { } if (isset($widget)) { $formArray['elements']['widget'] = array('type' => 'form', 'id' => $id, 'elements' => array('title' => array('type' => 'text', 'maxlength' => 255, 'size' => 60))); if (Yii::app()->settings->getValue('showWidgetAppearance')) { $formArray['elements']['widget']['elements']['template'] = array('type' => 'TemplateSelect', 'className' => $widgetClass, 'hideDefault' => false, 'empty' => Yii::t('cms', '«accordingly to general settings»')); $widgetFormArray['elements'][] = Form::tab(Yii::t('cms', 'Appearance')); } } $formArray['elements']['content'] = $widgetFormArray; $form = new Form($formArray); if (isset($widget)) { $form['widget']->model = $widget; } $form['content']->model = $content; // ajax-валидация if (isset($widget)) { $this->performAjaxValidation(array($widget, $content)); } else { $this->performAjaxValidation($content); } // Проверка и сохранение if ($form->submitted('save') || $form->submitted('apply')) { if (isset($widget)) { $widget = $form['widget']->model; } $content = $form['content']->model; if ($form->validate()) { if (isset($widget)) { $isWidgetNew = $widget->isNewRecord; if ($isWidgetNew && $content->isMaxLimitReached()) { $ret = false; } if ($ret && $widget->save(false)) { $formArray['action'] .= '&widgetId=' . $widget->id; // Если блок новый, размещаем его на текущей странице if ($isWidgetNew) { $prevPageWidgetId = (int) $prevPageWidgetId; $order = $prevPageWidgetId > 0 ? PageWidget::model()->findByPk($prevPageWidgetId)->order : -1; if ($content->hasAttribute('page_id') && $content->page_id > 0) { $pageWidget = $widget->setOnPage($content->page_id, $area, -1); } else { $pageWidget = $widget->setOnPage($pageId, $area, $order); } $formArray['action'] .= '&pageWidgetId=' . $pageWidget->id; } $content->widget_id = $widget->id; $content->save(false); } } else { $content->save(false); $formArray['action'] .= '&modelClass=' . get_class($content); $formArray['action'] .= '&recordId=' . $content->id; } } } $form = new Form($formArray); if (isset($widget)) { $form['widget']->model = $widget; } $form['content']->model = $content; // Формируем ответ if ($return == 'html') { if ($ret) { $this->render('/form', compact('form', 'showTitle', 'caption', 'prevPageWidgetId', 'pageId', 'area')); } else { throw new CHttpException(500, Yii::t('cms', 'The requested page does not exist.')); } } elseif ($return == 'json') { echo CJavaScript::jsonEncode(array('pageWidgetId' => $pageWidget->id, 'widgetId' => $widget->id, 'contentId' => $content->id, 'status' => (int) $ret)); } }
public static function defaultObject() { $obj = new self(); $d = date("Y-m-d H:i:s"); $obj->title = Yii::t('cms', 'New page createad at {time}', array('{time}' => $d)); $obj->alias = self::sanitizeAlias(date("Ymd His")); $obj->url = '/' . $obj->alias; $langs = array_keys(I18nActiveRecord::getLangs(Yii::app()->language)); foreach ($langs as $lang) { $obj->{$lang . '_title'} = Yii::t('cms', 'New page createad at {time}', array('{time}' => $d), null, $lang); $obj->{$lang . '_alias'} = self::sanitizeAlias(date("Ymd His")); $obj->{$lang . '_url'} = '/' . $obj->{$lang . '_alias'}; } $obj->active = true; $obj->order = 0; return $obj; }