Example #1
0
 protected function afterDelete()
 {
     parent::afterDelete();
     // 删除图片
     @unlink(Helper::mediaPath(self::UPLOAD_ORIGINAL_IMAGE_PATH . $this->image_path, FRONTEND));
     @unlink(Helper::mediaPath(self::UPLOAD_THUMBNAIL_IMAGE_PATH . $this->image_path, FRONTEND));
 }
Example #2
0
 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);
     }
 }
Example #3
0
 /**
  * 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;
             }
         }
     }
 }
Example #4
0
 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;
 }
Example #5
0
 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);
     }
 }
Example #6
0
 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');
 }
Example #7
0
 /**
  * Создает новую страницу
  */
 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));
 }
Example #8
0
 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);
     }
 }
Example #9
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;
     }
     $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));
 }
Example #10
0
 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']);
         }
     }
 }
Example #11
0
 protected function afterDelete()
 {
     parent::afterDelete();
     // 删除图片
     @unlink(Helper::mediaPath(self::UPLOAD_LARGE_IMAGE_PATH . $this->banner_path, FRONTEND));
 }
Example #12
0
 public static function model($className = __CLASS__)
 {
     return parent::model($className);
 }
Example #13
0
        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() {
Example #14
0
    /**
     * Обрабатывает запрос на редактирование блока
     *
     * @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));
        }
    }
Example #15
0
 public function init()
 {
     parent::init();
     $this->params['languages'] = I18nActiveRecord::getLangs();
 }
Example #16
0
 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;
 }
Example #17
0
 protected function afterDelete()
 {
     // 删除内链关键词
     InternalLinkKeyword::model()->deleteAllByAttributes(array('related_type' => 'page', 'related_id' => $this->page_id));
     parent::afterDelete();
 }
Example #18
0
 public function beforeDelete()
 {
     $this->content->delete();
     return parent::beforeDelete();
 }
Example #19
0
 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();
                             }
                         }
                     }
                 }
             }
         }
     }
 }