Создание админа.
336320
public function runCreateAdmin()
    {
        $admin = $this->getContainer()->get('fos_user.user_manager')->findOneBy(
            [
                'username' => 'admin',
            ]
        );

        if (!$admin) {
            $this->runCommand(
                'fos:user:create',
                [
                    '--super-admin' => true,
                    'username' => 'admin',
                    'email' => 'admin@admin.com',
                    'password' => 'admin',
                ]
            );
        }
    }
243604
public function save() 
    {
        try {
            $m = self::getByAlias($this->alias);
        } catch (\Exception $e) {}
        
        if ($m && $m->id != $this->id) throw new Exception\CMS('Меню c таким алиасом уже существует.');
        
		self::getDbConnection()->update('menus',
			array(
				'alias' => $this->alias,
				'name'  => $this->name,
				'data'  => serialize($this->data),
			),
			array('id' => $this->id)
		);
  	}
1281177
public function adminRender()
	{
		$result = '';
		if (UserRights($this->access))
		{
			#FIXME: Временное решение #0000163
			$this->tabs['items'][0]['url'] =
				Eresus_Kernel::app()->getPage()->url(array('id' => '', 'section' => 'templates'));
			$this->tabs['items'][1]['url'] =
				Eresus_Kernel::app()->getPage()->url(array('id' => '', 'section' => 'std'));
			$this->tabs['items'][2]['url'] =
				Eresus_Kernel::app()->getPage()->url(array('id' => '', 'section' => 'css'));
			/** @var TAdminUI $page */
			$page = Eresus_Kernel::app()->getPage();
			$result .= $page->renderTabs($this->tabs);
			switch (arg('section'))
			{
				case 'css':
					$result .= $this->sectionStyles();
					break;
				case 'std':
					$result .= $this->sectionStd();
					break;
				case 'themes':
				default:
					$result .= $this->sectionTemplates();
					break;
			}
		}
		return $result;
	}
1351910
function onFormInitialized() {
		parent::onFormInitialized();
		$this->addClass('df-font'); // 2016-07-30 This CSS class will be applied to the <fieldset> DOM node.
		$this->checkbox(O::enabled, 'Setup?');
		$row1 = $this->fieldsetInline('df-checkboxes')->hide(); /** @var FInline $row1 */
		$row1->checkbox(O::bold, 'B', ['title' => 'Bold']);
		$row1->checkbox(O::italic, 'I', ['title' => 'Italic']);
		$row1->checkbox(O::underline, 'U', ['title' => 'Underline']);
		$row1->color(O::color, null, ['title' => 'Font Color']);
		$row2 = $this->fieldsetInline('df-family')->hide(); /** @var FInline $row2 */
		$row2->field(O::family, GoogleFont::class, null, ['title' => 'Font Family']);
		/** @var array(array(string => string)) $sizeValues */
		$sizeValues = [Q::P__VALUES => SizeUnit::s()->toOptionArray()];
		$row2->quantity(O::size, null, $sizeValues + ['title' => 'Font Size']);
		$row3 = $this->fieldsetInline('row3')->hide(); /** @var FInline $row3 */
		// 2015-12-13
		// Намеренно указываем в качестве подписи пустую строку, а не null,
		// чтобы получить пустые теги <label><span></span></label>
		// и потом стилизовать их своей иконкой.
		$row3->quantity(O::letter_spacing, '', $sizeValues + ['title' => 'Letter Spacing']);
		/**
		 * 2015-12-13
		 * Передаём в качестве подписи название класса Font Awesome.
		 * Такое стало возможным благодаря моему плагину
		 * @used-by \Df\Framework\Plugin\Data\Form\Element\AbstractElement::aroundGetLabelHtml()
		 * https://github.com/mage2pro/core/tree/73bed4fbb751ab47ad1bb70a8d90f455da26b500/Framework/Data/Form/Element/AbstractElementPlugin.php#L53
		 */
		/**
		 * 2015-12-13
		 *	.test {
		 *		transform : scale(1,1.5);
		 *		-webkit-transform:scale(1,1.5); // Safari and Chrome
		 *		-moz-transform:scale(1,1.5); // Firefox
		 *		-ms-transform:scale(1,1.5); // IE 9+
		 *		-o-transform:scale(1,1.5); // Opera
		 *		letter-spacing: 10px;
		 *	}
		 * https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function#scale()
		 * http://stackoverflow.com/a/16447826
		 */
		$row3->percent(O::scale_horizontal, 'fa-text-width', 100, ['title' => 'Horizontal Scale']);
		$row3->percent(O::scale_vertical, 'fa-text-height', 100, ['title' => 'Vertical Scale']);
		/**
		 * 2015-12-13
		 * Намеренно указываем в качестве подписи пустую строку, а не null,
		 * чтобы получить пустые теги <label><span></span></label>
		 * и потом стилизовать их своей иконкой.
		 */
		df_hide($this->select(O::letter_case, '', LetterCase::s(), ['title' => 'Letter Case']));
		df_fe_init($this, __CLASS__, df_fa());
	}
1172870
function run()
	{
		if(!$this->is_initialized)
			$this->init();

		if(!defined('BORS_SITE'))
			define('BORS_SITE', COMPOSER_ROOT);

		// Пробуем искать по-новому
		// ...
		// https://github.com/phpixie/http
		// http://habrahabr.ru/post/256639/

//		PHPixie пока не трогаем, там какой-то свой PSR-7.
//		$slice = new \PHPixie\Slice();
//		$http = new \PHPixie\HTTP($slice);
//		$request = $http->request();
//		r($request->server()->get('http_host'));
//		r($request->query()->uri());
//		r((string)$request->uri());

		$view = NULL;

		if($this->cfg('view.preset'))
			$view = $this->cfg('view.preset');

		// composer: zendframework/zend-diactoros
		if(!$view && class_exists('\\Zend\\Diactoros\\ServerRequestFactory'))
		{
			$request = \Zend\Diactoros\ServerRequestFactory::fromGlobals();
//			$request = \Slim\Http\Request::createFromEnvironment(new \Slim\Http\Environment($_SERVER));

//			r((string)$request->getUri());
//			r((string)$request->getMethod());

			$view = $this->route_view($request);
		}

		if($view)
		{
			$ret = $view->pre_show();

			if($ret)
				return $ret;

//			r($view);
			$response = $view->response();
			if($response)
			{
				// composer: slim/slim>3
				$app = new \Slim\App;
				$app->respond($response);
				return;
			}
		}

		// Если ничего не нашли, то запускаем старый движок.
		return \bors::run();
	}
927503
public function run($auth_id)
    {
        (new Code())->clear($auth_id);

        $user = (new FindUser())->run($auth_id);
        if (is_array($user) && count($user) == 0) {
            if (SettingsAuth::CAN_REGISTRATION_USERS) {
                $insert_user = (new InsertUser($this->dic))->run([
                    'auth_id' => $auth_id,
                ]);
                if (isset($insert_user['errors'])) {
                    return $insert_user;
                } else {
                    $user = $insert_user['data'];
                }
            } else {
                return Response::error404('Пользователь не найден');
            }
        }

        $all_codes = [];
        $auth_codes = ORM::for_table('auth_codes')
            ->select('code')
            ->find_many();
        if (is_array($auth_codes) && count($auth_codes) > 0) {
            foreach ($auth_codes as $item) {
                $all_codes[] = $item->code;
            }
        }

        $secret = RandomNumber::generate(4);
        while (in_array($secret, $all_codes)) {
            $secret = RandomNumber::generate(4);
        }

        $auth_code = ORM::for_table('auth_codes')->create();
        $auth_code->auth_id = $auth_id;
        $auth_code->code = $secret;
        $auth_code->user_id = $user['id'];
        $auth_code->created_at = $this->dic['datetimenow'];
        $auth_code->save();
        if (is_object($auth_code)) {
            if (SettingsGeneral::PRODUCTION) {
                switch (SettingsAuth::TYPE) {
                    case 'email':
                        /** @var Mailer $mailer */
                        $mailer = $this->dic['mailer'];

                        $template_name = 'AUTH_CODE';
                        $subject = 'Код для входа в приложение для пользователя: ' . $auth_id;
                        $email_tos = [$auth_id];
                        $template_data = ['[APP_NAME]' => SettingsGeneral::APP_NAME, '[SECRET]' => $secret];

                        $result = $mailer->send($template_name, $subject, $email_tos, $template_data);
                        break;

                    case 'phone':
                        /** @var SMS $sms */
                        $sms = $this->dic['sms'];

                        $result = $sms->send($auth_id, 'Код для входа: ' . $secret . ', ' . SettingsGeneral::APP_NAME);
                        break;

                    default:
                        return Response::error400('Неверный вид аутентификации, проверьте настройки');
                        break;
                }

                if ($result) {
                    return Response::data([
                        'message' => 'Письмо с кодом успешно отправлено на указанную электронную почту',
                    ]);
                } else {
                    return Response::error500('Произошла ошибка при отправке кода, попробуйте ещё раз');
                }
            } else {
                return Response::data([
                    'message' => $secret,
                ]);
            }
        } else {
            return Response::error500('Произошла ошибка при создании кода, попробуйте ещё раз');
        }
    }
324996
protected function _initAutoFilters()
    {
        //Если автоопределение колонок не включено
        if (!$this->isEnabledAutoFilters) {
            return $this;
        }

        if (!$this->dataProvider) {
            return $this;
        }

        $dataProvider = clone $this->dataProvider;
        $models = $dataProvider->getModels();


        /**
         * @var $model Model
         * @var $model ActiveRecord
         */
        $model = reset($models);

        if (!$model) {
            $modelClass = $dataProvider->query->modelClass;
            $model = new $modelClass();
        }

        $result = [];

        $result['attributeDefines'] = [];
        if (method_exists($model, 'attributes')) {
            $result['attributeDefines'] = $model->attributes();
        }

        $result['attributeLabels'] = [];
        if (method_exists($model, 'attributeLabels')) {
            $result['attributeLabels'] = $model->attributeLabels();
        }


        $rules = [];
        $fields = [];

        if ($model instanceof ActiveRecord) {
            foreach ($model::getTableSchema()->columns as $key => $column) {
                if (in_array($column->type, ['string', 'text'])) {
                    $fields[(string)$key] = [
                        'class' => StringFilterField::class,
                    ];

                    $rules[] = [(string)$key, 'safe'];
                } else if (in_array($column->type, ['integer', 'decimal'])) {

                    $realKey = $key;
                    if (!empty($key) && strcasecmp($key, 'id')) {
                        if (substr_compare($key, 'id', -2, 2, true) === 0) {
                            $key = rtrim(substr($key, 0, -2), '_');
                        } elseif (substr_compare($key, 'id', 0, 2, true) === 0) {
                            $key = ltrim(substr($key, 2, strlen($key)), '_');
                        }
                    }

                    $keyMany = Inflector::pluralize($key);

                    $keyName = lcfirst(Inflector::id2camel($key, '_'));
                    $keyManyName = lcfirst(Inflector::id2camel($keyMany, '_'));


                    if ($relation = $model->getRelation($keyName, false)) {
                        if ($relation->modelClass && $relation->link) {

                            $arr = array_keys($relation->link);
                            $idName = $arr[0];
                            $modelClassName = $relation->modelClass;

                            $query = $modelClassName::find();

                            if ($query->count() > 1000) {
                                $fields[(string)$realKey] = [
                                    'class' => NumberFilterField::class,
                                ];
                            } else {
                                $fields[(string)$realKey] = [
                                    'class'             => NumberFilterField::class,
                                    'isAllowChangeMode' => false,
                                    'field'             => [
                                        'class'    => SelectField::class,
                                        'items'    => function () use ($idName, $query) {

                                            return ArrayHelper::map(
                                                $query->all(),
                                                $idName,
                                                'asText'
                                            );
                                        },
                                        'multiple' => true,
                                    ],
                                ];
                            }

                        }

                    }

                    if (!isset($fields[(string)$realKey])) {
                        $fields[(string)$realKey] = [
                            'class' => NumberFilterField::class,
                        ];
                    }

                    $rules[] = [(string)$realKey, 'safe'];

                } else {
                    $fields[(string)$key] = [
                        'class' => StringFilterField::class,
                    ];

                    $rules[] = [(string)$key, 'safe'];
                }

            }
        } elseif (is_array($model) || is_object($model)) {
            foreach ($model as $name => $value) {
                if ($value === null || is_scalar($value) || is_callable([$value, '__toString'])) {
                    $fields[(string)$name] = [
                        'class' => StringFilterField::class,
                    ];

                    $rules[] = [(string)$name, 'safe'];
                }
            }
        }

        $result['rules'] = $rules;
        $result['fields'] = $fields;
        $this->_autoDynamicModelData = $result;

        return $this;
    }
567017
public function setTableDefinition()
    {
        $this->setTableName('gallery_images');
        $this->hasColumns(array(
            'id' => array(
                'type' => 'integer',
                'unsigned' => true,
                'autoincrement' => true,
            ),
            'section' => array(
                'type' => 'integer',
                'unsigned' => true,
                'default' => null,
            ),
            'title' => array(
                'type' => 'string',
                'length' => 255,
                'default' => null,
            ),
            'image' => array(
                'type' => 'string',
                'length' => 128,
                'default' => null,
            ),
            'thumb' => array(
                'type' => 'string',
                'length' => 128,
                'default' => null,
            ),
            'posted' => array(
                'type' => 'datetime'
            ),
            'groupId' => array(
                'type' => 'integer',
                'unsigned' => true,
                'default' => 0,
            ),
            'cover' => array(
                'type' => 'boolean',
                'default' => 0,
            ),
            'active' => array(
                'type' => 'boolean',
                'default' => 0,
            ),
            'position' => array(
                'type' => 'integer',
                'unsigned' => true,
                'default' => 0,
            ),
        ));
        // TODO Проверить индексы
        $this->index('section', array('fields' => array('section')));
        $this->index('position', array('fields' => array('position')));
        $this->index('active', array('fields' => array('active')));
        $this->index('posted', array('fields' => array('posted')));
        $this->index('find_covers', array('fields' => array('section', 'active', 'cover')));
        $this->index('images_by_time', array('fields' => array('section', 'active', 'posted')));
        $this->index('images_by_position', array('fields' => array('section', 'active', 'position')));
        /* Проверенные индексы */
        $this->index('images_by_group_idx', array('fields' => array('groupId', 'active', 'position')));
    }
427701
protected static function remind()
    {
        self::$user = null;
        if (!empty(self::$input['COOKIE']['ID'])){
            $ID = explode('|', self::$input['COOKIE']['ID']);
        }else{
            $ID = '';
        }
        // Период запоминания пользователя
        $duration = empty($ID[0])? 0 : $ID[0]; // не больше месяца (примерно)
        // Хэш пользователя для поиска (авторизации)
        $hash = empty($ID[1]) ? '' : $ID[1];
        // Если есть кука, то ищем пользователя в БД
        if ($hash){
            $result = Data::find(array(
                'from' => self::$config['users-list'],
                'select' => 'children',
                'depth' => 'max',
                'where' => array(
                    array('value', '=', $hash),
//                    array('not','is_link')
                ),
                'key' => false,
                'limit' => array(0, 1),
                'comment' => 'auth user by cookie',
            ), false);
            // Пользователь найден и не истекло время его запоминания
            if (!empty($result)){
                self::$user = $result[0];
            }
        }else{
            $hash = self::get_unique_hash();
        }
        // Новый гость
        if (!self::$user){
            self::$user = Data::create(self::$config['user'], self::$config['users-list']);
            self::$user->value($hash);
            $duration = 0;
        }
        self::remember($duration);
    }
319148
public function enable()
    {
        if ($this->enabled) {
            return;
        }
        if (!$this->fd) {
            return;
        }
        $this->enabled = true;

        if ($this->ev === null) {
            if ($this->eventLoop === null) {
                // @TODO нужно перенести куда-то выше, не годиться тут инициировать
                $this->eventLoop = EventLoop::$instance;
            }

            $this->ev = $this->eventLoop->event($this->fd, \Event::READ | \Event::PERSIST, [$this, 'onReadUdp']);
            $this->onBound();
        } else {
            $this->onAcceptEv();
        }
        $this->ev->add();
    }
1346779
function validateData(data){
  /* Создаем промис */
  return new Promise(function(resolve, reject){
    if(
      (data.password == "iddqd")
      &&(data.login == "Carmak")
    ){
      /* Все верно, пользователь авторизирован */
      resolve(data);
    }else{
      /* Ошибка при вводе данных */
      reject(new Error('Ошибка при вводе логина или пароля'));
    }
  });
}
1118366
final function onFormInitialized() {
		parent::onFormInitialized();
		$this->addClass('df-array');
		// 2015-12-29 It is an invisible template row.
		df_hide($this->field('template', $this->itemFormElement()));
		$itemId = 0; /** @var int $itemId */
		foreach ($this->v() as $key => $data) {
			/** @var string|int $key */ /** @var string|array(string => mixed) $data */
			/**
			 * 2016-07-30
			 * Раньше тут стоял код:
			 *	// 2015-12-30
			 *	// https://github.com/mage2pro/core/tree/b1f6809b7723d8426636bb892b852f408bdc5650/Framework/view/adminhtml/web/formElement/array/main.js#L131
			 *	if (\Df\Config\A::FAKE !== $key) {
			 *		$this->field($itemId++, $this->itemType(), null, $data);
			 *	}
			 * Теперь у нас ключ @see \Df\Config\A::FAKE удаляется в методе
			 * @see \Df\Config\Backend\ArrayT::processA()
			 * поэтому здесь его уже быть не должно.
			 */
			df_assert_ne(\Df\Config\A::FAKE, $key);
			$this->field($itemId++, $this->itemFormElement(), null, $data);
		}
		df_fe_init($this, __CLASS__, df_fa(), [], 'array');
	}
273618
static function activate()
    {
        if (get_magic_quotes_gpc()){
            $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
            while (list($key, $val) = each($process)){
                foreach ($val as $k => $v){
                    unset($process[$key][$k]);
                    if (is_array($v)){
                        $process[$key][stripslashes($k)] = $v;
                        $process[] = &$process[$key][stripslashes($k)];
                    }else{
                        $process[$key][stripslashes($k)] = stripslashes($v);
                    }
                }
            }
            unset($process);
        }
        // Нормализация массива $_FILES в соответствии с именованием полей формы
        if (isset($_FILES)){
            // Перегруппировка элементов массива $_FILES
            $rec_to_array = function ($array, $name) use (&$rec_to_array){
                $result = [];
                foreach ($array as $key => $value){
                    if (is_array($value)){
                        $result[$key] = $rec_to_array($value, $name);
                    }else{
                        $result[$key][$name] = $value;
                    }
                }
                return $result;
            };
            $files = [];
            foreach ($_FILES as $field => $data){
                $files[$field] = [];
                foreach ($data as $name => $value){
                    if (is_array($value)){
                        $files[$field] = F::arrayMergeRecursive($files[$field], $rec_to_array($value, $name));
                    }else{
                        $files[$field][$name] = $value;
                    }
                }
            }
        }else{
            $files = [];
        }

        self::$source = array(
            'REQUEST' => [],
            'FILES' => $files,
            'COOKIE' => isset($_COOKIE)? $_COOKIE : [],
            'RAW' => file_get_contents("php://input"), // Неформатированные данные
            'SERVER' => $_SERVER
        );
        if (isset($_SERVER['REQUEST_URI'])){
            $_SERVER['REQUEST_URI'] = preg_replace('#\?{1}#u', '&', $_SERVER['REQUEST_URI'], 1);
//            $request_uri = preg_replace('#^'.preg_quote(DIR_WEB).'#u', '/', $_SERVER['REQUEST_URI'], 1);
            parse_str('path='.$_SERVER['REQUEST_URI'], self::$source['REQUEST']);
            self::$source['SERVER']['argv'] = self::$source['REQUEST'];
            self::$source['SERVER']['argc'] = sizeof(self::$source['REQUEST']);
        }
        // Элементы пути URI
        if (isset(self::$source['REQUEST']['path']) && (self::$source['REQUEST']['path'] = rtrim(self::$source['REQUEST']['path'],'/ '))){
            self::$source['PATH'] = explode('/', trim(self::$source['REQUEST']['path'],' /'));
        }else{
            self::$source['PATH'] = [];
        }
        if (isset($_POST)){
            self::$source['REQUEST'] = array_replace_recursive(self::$source['REQUEST'], $_POST);
        }
        // Аргументы из консоли (режим CLI)
        if (php_sapi_name() == 'cli' && isset($_SERVER['argv'])){
            self::$source['REQUEST']['method'] = 'CLI';
            self::$source['SERVER']['argv'] = $_SERVER['argv'];
            self::$source['SERVER']['argc'] = $_SERVER['argc'];
        }
        self::$source['ARG'] = self::$source['SERVER']['argv'];
        // Метод запроса
        if (isset(self::$source['SERVER']['REQUEST_METHOD']) && !isset(self::$source['REQUEST']['method'])){
            self::$source['REQUEST']['method'] = self::$source['SERVER']['REQUEST_METHOD'];
        }
    }
623002
public function main()
    {
        $mainPageHTML = '';
        $dbMaterials = array();

        // Получим все материалы
        if (
        dbQuery('samsoncms\api\Material')
            ->join('user')
            ->cond('Active', 1)
            ->cond('Draft', 0)
            ->order_by('Created', 'DESC')
            ->cond('Name', "", dbRelation::NOT_EQUAL)
            ->limit(5)
            ->exec($dbMaterials)
        ) {
            // Render material rows
            $rowsHTML = '';
            foreach ($dbMaterials as $dbMaterial) {
                $rowsHTML .= $this->view('main/row')
                    ->set($dbMaterial, 'material')
                    ->set(isset($dbMaterial->onetoone['_user']) ? $dbMaterial->onetoone['_user'] : array(), 'user')
                    ->output();
            }

            for ($i = sizeof($dbMaterials); $i < 5; $i++) {
                $rowsHTML .= $this->view('main/row')->output();
            }

            // Render main template
            $mainPageHTML = $this->view('main/index')->set($rowsHTML, 'rows')->output();
        }

        // Return material block HTML on main page
        return $mainPageHTML;
    }
12975
protected function loadModel($id)
    {
        // Если модель не определена
        if (!$this->model) {
            // Определяем модель в соответствии с переданным именем класса
            $this->model = call_user_func([$this->modelClass, 'findOne'], [$id]);
        }

        // Определяем переданные поля
        $this->model->setAttributes($this->attributes);

        // Если модель не найдена, генерим Exception
        if ($this->model === null)
            throw new HttpException(404, 'Model not found');

        return $this->model;
    }
1182613
public function adminRenderContent()
    {
        $result = '';
        /* @var TAdminUI $page */
        $page = Eresus_Kernel::app()->getPage();
        switch (true)
        {
            /*
             * Управление группами
             * Этот блок должен располагаться до блока управления изображениями из-за того что иначе
             * наличие аргумента id может быть ошибочно расценено как запрос на диалог изменения
             * изображения.
             */
            case arg('action') == 'group':
                $result = $this->adminRenderGroupsList();
                break;
            case arg('group_id') !== null:
                $result = $this->adminEditGroupDialog();
                break;
            case arg('action') == 'group_create':
                $result = $this->adminAddGroupDialog();
                break;
            case arg('action') == 'group_insert':
                $this->adminInsertGroup();
                break;
            case arg('action') == 'group_update':
                $this->adminUpdateGroup();
                break;
            case arg('group_up') !== null:
                $this->adminMoveUpGroup();
                break;
            case arg('group_down') !== null:
                $this->adminMoveDownGroup();
                break;
            case arg('group_delete') !== null:
                $this->adminDeleteGroup();
                break;
            /* Управление изображениями */
            case arg('action') == 'create':
                $result = $this->adminAddItem();
                break;
            case arg('id') !== null:
                $result = $this->adminEditItem();
                break;
            case arg('update') !== null:
                $this->adminUpdateImage();
                break;
            case arg('toggle') !== null:
                $this->adminImageToggle(arg('toggle', 'int'));
                break;
            case arg('cover') !== null:
                $this->coverAction();
                break;
            case arg('delete') !== null:
                $this->delete(arg('delete', 'int'));
                break;
            case arg('up') !== null:
                $this->up(arg('up', 'int'));
                break;
            case arg('down') !== null:
                $this->down(arg('down', 'int'));
                break;
            /* Управление свойствами галереи */
            case arg('action') == 'props':
                $result = $this->adminRenderProperties();
                break;
            case arg('action') == 'props_update':
                $this->updateProperties();
                break;
            /* Действие по умолчанию */
            default:
                $result = $this->adminRenderImagesList();
                break;
        }

        /*
         * Кнопки-"вкладки"
         */
        $tabs = array('width' => '14em', 'items' => array());
        $tabs['items'] []= array(
            'caption' => 'Изображения',
            'url' => preg_replace('/&(id|pg)=\d+/', '', $page->url(null)),
        );

        if ($this->settings['useGroups'])
        {
            $tabs['items'] []= array(
                'caption' => 'Группы',
                'url' => preg_replace('/&(id|pg)=\d+/', '', $page->url(array('action' => 'group'))),
            );
        }

        $tabs['items'] []= array(
            'caption' => 'Свойства галереи',
            'url' => preg_replace('/&(id|pg)=\d+/', '', $page->url(array('action' => 'props'))),
        );

        $result = $page->renderTabs($tabs) . $result;

        return $result;
    }
1251289
static function add($action, $user = NULL, $object = NULL, $target = NULL, $attrs = array())
	{
//		print_dd(compact('object', 'user', 'target'));
		if(!$target)
			$target		= object_property($object, 'target');

		$actor		= bors_load_ex($action, NULL, compact('object', 'user', 'attrs'));

		$category	= object_property($target, 'category');
		$folder		= object_property($target, 'folder');

		$data = array(
			'handler_class_name'=> $action,
			'color' => $actor->color(),

			'object_class_name'	=> object_property($object, 'class_name'),
			'object_id'			=> object_property($object, 'id'),
			'target_class_name'	=> object_property($target, 'class_name'),
			'target_id'			=> object_property($target, 'id'),

			'category_class_name' => object_property($category, 'class_name'),
			'category_id'		=> object_property($category, 'id'),
			'folder_class_name'	=> object_property($folder, 'class_name'),
			'folder_id'			=> object_property($folder, 'id'),
		);

		if(empty($attrs['personal_only']) && ($title = $actor->public_title()))
		{
			$data['title']	= $title;
			$data['text']	= $actor->public_text();
			// Кому идёт сообщение. 0, если публичное.
			$data['user_class_id']	= 0;
			$data['user_id'] = 0;
			bors_new(config('default_events_class', __CLASS__), $data);
		}

		if($user && ($title = $actor->personal_title()))
		{
			$data['title']	= $title;
			$data['text']	= $actor->personal_text();
			// Кому идёт сообщение. 0, если публичное.
			$data['user_class_id']	= $user->class_id();
			$data['user_id']		= $user->id();
			bors_new(config('default_events_class', __CLASS__), $data);
		}
	}