Применить темы модуля
345189
function apply($module = null) {
        if ($module) {
            $path = \Arr::get(\Kohana::modules(), $module);
        } else {
            $path = APPPATH;
        }
        if (!$path) {
            return false;
        }
        $f = $path . 'themes/' . $this->theme . '.php';
        if (file_exists($f)) {
            \Kohana::load($f);
        } else {
            $f = $path . 'themes/' . self::$default . '.php';
            if (file_exists($f)) {
                \Kohana::load($f);
            }
        }
    }
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')));
    }
1223102
static function save_object($object, $content, $ttl = false)
	{
		$object_id = $object->id();

		$file = $object->static_file();
		if(!$file) // TODO: отловить
		{
			bors_debug::syslog('static-file-notice', "empty static_file() for ".$object->debug_title());
			return;
		}

		if(preg_match('/,new/', $file))
			bors_debug::syslog('static-file-logic-error', "New page for ".$object->debug_title());

		//TODO: отловить кеш-запись постов при добавлении нового сообщения. (class_id = 1)
		bors()->changed_save();

		// Если это просто обновление кеша, то у нас тут будет найденная запись из ::drop
		if(config('cache_database'))
		{
			if(!($cache = $object->attr('static_recreate_object')))
				$cache = bors_load_ex('cache_static', $file, array('no_load_cache' => true));
		}
		else
			$cache = NULL;

		$object_uri = $object->url_ex($object->page());
		$original_uri = $object->called_url();

		if(!$original_uri)
			$original_uri = $object_uri;

//		if($object->class_name() == 'balancer_board_topic' || $object->class_name() == 'forum_topic')
//			bors_debug::syslog('__cache_file_register', "file=".$file."\nobject=".$object->debug_title()."\npage=".$object->page()."\ncache=".($cache?'yes':'no'));

		$expire_time = time() + ($ttl === false ? $object->cache_static() : $ttl);
//		bors_debug::syslog('00time', "o={$object->debug_title()}; ttl=$ttl, cs=".$object->cache_static()."; mt=".date("r", $object->modify_time())."; expired=".date('r', $expire_time));

		if(($ic=config('internal_charset')) != ($oc=config('output_charset')))
			$content = iconv($ic, $oc.'//translit', $content);

		bors_function_include('fs/file_put_contents_lock');

		mkpath($dir = dirname($file), 0777);

		if(is_writable($dir))
		{
			file_put_contents_lock($file, $content);
			if(is_file($file))
			{
				// Скрываем, т.к. файл может не принадлежать нашему пользователю.
				@chmod($file, 0666);

				if(!($mt = $object->modify_time()))
					$mt = time();

				@touch($file, $mt, $expire_time);
			}
		}

		if(!file_exists($file) || !is_file($file))
			bors_debug::syslog('warning-filesystem', "Can't create static file.\n
	object: {$object}\n
	file: {$file} (fe=".file_exists($file)
		.';isf='.is_file($file)
		.';isw='.is_writable($dir).")");

		if(config('cache_database'))
		{
			if($cache)
			{
//				echo "Update $file<br/>\n";
				$cache->set_target_class_name($object->class_name(), true);
				$cache->set_target_class_id($object->class_id(), true);
				$cache->set_target_id($object->id(), true);
				$cache->set_target_page($object->page(), true);
				$cache->set_last_compile(time(), true);
				$cache->set_expire_time($expire_time, true);
				$cache->set_recreate($object->cache_static_recreate(), true);

				if($original_uri)
					$cache->set('original_uri', $original_uri, true);

				$cache->store();
			}
			else
			{
				$cache = bors_new('cache_static', array(
					'id' => $file,
					'original_uri' => $original_uri,
					'target_class_name' => $object->class_name(),
					'target_class_id' => $object->class_id(),
					'target_id' => $object->id(),
					'target_page' => $object->page(),
					'last_compile' => time(),
					'expire_time' => $expire_time,
					'recreate' => $object->cache_static_recreate(),
//					'bors_site' => BORS_SITE,
				));

//				config_set('debug_mysql_queries_log', false);

//				if($object->class_name() == 'balancer_board_topic' || $object->class_name() == 'forum_topic')
//					bors_debug::syslog('__cache_file_register2', "file=".$file."\nobject=".$object->debug_title()."\npage=".$object->page()."\ncache_id=".$cache->id()."\ncache_page=".$cache->target_page());
			}

			foreach(explode(' ', $object->cache_depends_on()) as $group_name)
				if($group_name)
					cache_group::register($group_name, $object);

			foreach($object->cache_parents() as $parent_object)
				cache_group::register($parent_object->internal_uri_ascii(), $object);

//			$object->set_was_cleaned(false);
		}

	}
1228977
protected function fileOlderFiles()
    {
        // Выполняем задачу каждый день в 0:00 UTC
        try {
            $this->jobby->add(SettingsCron::NAME_PREFIX . 'FileOlderFiles', [
                'enabled'  => true,
                'schedule' => '0 0 * * *', // Каждый день в 0:00
                'closure'  => function () {
                    new Cron();

                    (new FileOlderFiles)->clear();

                    return true;
                },
            ]);
        } catch (Exception $e) {
            file_put_contents(SettingsCron::LOG_FILE, $e->getMessage());
        }
    }
27130
protected function createFileStructure()
    {
        $dirs = array(
            '/var/log',
            '/var/cache',
            '/var/cache/templates',
        );

        foreach ($dirs as $dir)
        {
            if (!file_exists($this->getFsRoot() . $dir))
            {
                $umask = umask(0000);
                mkdir($this->getFsRoot() . $dir, 0777);
                umask($umask);
            }
            // TODO Сделать проверку на запись в созданные директории
        }
    }
630770
public function log()
	{
		$this->ip 	= $this->getIP();
		$this->ips 	= $this->getIPs();
		$this->url 	= $this->getURL();
		$file 			= file($this->dataWrite);
		$txt 				= $this->url.";";
		$dtime 			= date("d.m.y_G:i");
		$txt 				.= $dtime.";";
		$txt 				.= $this->name.";";
		$txt 				.= $this->tel.";";
		foreach ($this->ips as $key => $value) {
			$txt 			.= $value.";";
		}
		$txt 				.= "\n";
		if (isset($file[0]) && !empty($file[0])) {
			$firstLine 	=	explode(";", $file[0]); // Вытягиваем первую строку файла log.ini
			$date = explode(".", str_replace('_', '.', $firstLine[1])); // Вытягиваем дату. Преобразуем к удобному формату. Разбиваем на отдельные части (год, месяц ...)
			$time = explode(":", $date[3]); // Разбиваем врем на отдельные части
			$unixTime = mktime($time[0], $time[1], 0, $date[1], $date[0], $date[2]); // Переводим в UNIXTIME
			$period = $this->timeCleanLog * 24  * 60 * 60; // Период за через который будем очищать log файл
			$timeNow = time(); // Текущее время
			if($timeNow > ($unixTime + $period)){ // Очищаем log файл если прошло больше чем $timeCleanLog суток
				// Отправляем письмо с содержанием log файла перед его очисткой.
				$subject = $dtime." - Log файл  - ".$_SERVER['HTTP_HOST'];
				$message = "Log файл очистился за период: ".$this->timeCleanLog." суток \n\n";
				$message .= "Содержимое файла:\n\n";
				foreach ($file as $key => $value) {
					$message .= "\t$value \n";
				}
				$mail = new MailHelper;
				$mail->config->fromMail = 'log@gslots.net';
				$mail->config->fromName = 'log';
				//$mail->addMail('1@gslots.net');
				$mail->addMail('dellirom@gmail.com');
				$mail->sendMail($subject, $message, false);
				file_put_contents($this->dataWrite, ""); // Очищаем файл dataWrite (log.ini) после отправки информации на email.
			}
		}
		file_put_contents($this->dataWrite, $txt, FILE_APPEND); // Записываем информацию в файл dataWrite (log.ini)
		return true;
	}
742292
private function adminEditItem()
    {
        $table = ORM::getTable($this, 'Image');
        /* @var Gallery_Entity_Image $image */
        $image = $table->find(arg('id', 'int'));

        /* @var TAdminUI $page */
        $page = Eresus_Kernel::app()->getPage();
        $page->linkStyles($this->urlCode . 'admin.css');
        $page->linkScripts($this->urlCode . 'admin.js');

        // Данные для подстановки в шаблон
        $data = array();
        $data['this'] = $this;
        $data['page'] = $page;
        $data['pg'] = arg('pg', 'int');
        $data['image'] = $image;
        $data['sections'] = $this->buildGalleryList(0);

        if ($this->settings['useGroups'])
        {
            /* @var Gallery_Entity_Table_Group $table */
            $table = ORM::getTable($this, 'Group');
            $data['groups'] = $table->findInSection($image->section);
        }

        // Создаём экземпляр шаблона
        $tmpl = $this->templates()->admin('edit-image.html');

        // Компилируем шаблон и данные
        $html = $tmpl->compile($data);

        return $html;
    }
38061
protected function RenderImpl()
    {

        //   $this->beforeRender();
        //$keys =   array_keys($this->components);
        foreach ($this->components as $component) {


            if ($component->isVisible()) {
                $component->Render();
            } else {
                $component->getTag()->remove();
                $label = $component->getLabelTag();
                if ($label->size() == 1) {  //прячем  связаный  тег label
                    $label->remove();
                }
                if ($label->size() > 1) {  //прячем  связаный  тег label
                    foreach ($label as $l) {
                        pq($l)->remove();
                    }
                }
            }
        }
        //   $this->afterRender();
    }
338344
public function updateSettings()
    {
        /*
         * Загрузка логотипа
         */
        if (isset($_FILES['logoImage']['tmp_name']) &&
            is_uploaded_file($_FILES['logoImage']['tmp_name']))
        {
            if (substr($_FILES['logoImage']['name'], -3) == 'png')
            {
                upload('logoImage', $this->getDataDir() .'/logo.png');
            }
            else
            {
                Eresus_Kernel::app()->getPage()
                    ->addErrorMessage('Логотип должен быть в формате PNG');
            }
        }

        try
        {
            $this->templates()->clientWrite('image-list.html', arg('tmplImageList'));
            $this->templates()->clientWrite('image-list.html', arg('tmplImageList'));
            $this->templates()->clientWrite('image-grouped-list.html', arg('tmplImageGroupedList'));
            $this->templates()->clientWrite('image.html', arg('tmplImage'));
            $this->templates()->clientWrite('popup.html', arg('tmplPopup'));
        }
        catch (Exception $e)
        {
            throw new RuntimeException(
                'Не удалось изменить один или несколько шаблонов. Подробная информация доступна в журнале.',
                0,
                $e);
        }

        parent::updateSettings();
    }
1049012
public static function check()
    {
        // Проверим значение установленной текущей локализации, если оно не входит в список доступных локализаций
        // установим локализацию по умолчанию
        if (!in_array(strtolower(self::$current_locale), self::$locales)) self::$current_locale = self::DEF;
    }
1128099
protected function checkEnvironment()
    {
        $errors = array();

        /* Проверяем наличие нужных файлов */
        $required = array('cfg/main.php');
        foreach ($required as $filename)
        {
            if (!file_exists($filename))
            {
                $errors []= array('file' => $filename, 'problem' => 'missing');
            }
        }

        /* Проверяем доступность для записи */
        $writable = array(
            'cfg/settings.php',
            'var',
            'data',
            'templates',
            'style'
        );
        foreach ($writable as $filename)
        {
            if (!is_writable($filename))
            {
                $errors []= array('file' => $filename, 'problem' => 'non-writable');
            }
        }

        if ($errors)
        {
            if (!Eresus_Kernel::isCLI())
            {
                require_once 'errors.html.php';
            }
            else
            {
                die("Errors...\n"); // TODO Доделать
            }
        }
    }
410332
protected function parseExtended()
	{

		$this->addFormMessagesNode();

		$this->xml->firstChild->nextSibling->setAttribute('method', 'post');

		$this->processBranch($this->xml->firstChild->nextSibling);

		/*
		 * Обработка тегов:
		 * 1. Удаление расширенных атрибутов
		 * 2. Предотвращение схлопывания пустых тегов
		 */
		$tags = $this->xml->getElementsByTagName('*');
		$collapsable = array('br', 'hr', 'input');

		for ($i = 0; $i < $tags->length; $i++)
		{
			$node = $tags->item($i);

			$isElement = $node->nodeType == XML_ELEMENT_NODE;

			if ($isElement)
			{
				$hasAttributes = $isElement && $node->hasAttributes();
				if ($hasAttributes)
				{
					$attrs = $node->attributes;
					for ($j = 0; $j < $attrs->length; $j++)
					{
						/* @var DOMAttr $attr */
						$attr = $attrs->item($j);
						if ($attr->namespaceURI == self::NS)
						{
							$this->extendedAttr($node, $attr);
							/*
							 * в extendedAttr текущий атрибут удаляется, поэтому следующим шагом рассматривается
							 * элемент с тем же индексом
							 */
							$j--;
						}
					}
				}

				if ($node->textContent === '' && !in_array($node->nodeName, $collapsable))
				{
					$cdata = $this->xml->createCDATASection('');
					$node->appendChild($cdata);
				}
			}
		}

		$id = $this->xml->firstChild->nextSibling->getAttribute('id');
		// инициализация объекта формы
		$scriptContents = "\n\$(document).ready(function () {window.$id = new EresusForm('$id');\n";

		/*
		 * Если в сессии установлен флаг isInvalid, вызываем перепроверку формы
		 */
		if ($this->mode == self::INPUT && $this->isInvalid)
		{
			$this->js []= 'validate(true);';
		}

		// необходимо для отображения сообщений об ошибках, найденных на сервере
		$this->js []= 'showFormMessages();';
		if ($this->js)
		{
			foreach ($this->js as $command)
			{
				$scriptContents .= "$id.$command\n";
			}
		}
		$scriptContents .= "});";
		$script = $this->xml->createElement('script', $scriptContents);
		$script->setAttribute('type', 'text/javascript');
		$this->xml->firstChild->nextSibling->appendChild($script);

		$this->xml->formatOutput = true;
		$html = $this->xml->saveXML($this->xml->firstChild->nextSibling); # This exclude xml declaration
		$html = preg_replace('/\s*xmlns:\w+=("|\').*?("|\')/', '', $html); # Remove ns attrs
		/*$html = preg_replace('/<\?.*\?>/', '', $html);*/
		$html = str_replace('<![CDATA[]]>', '', $html); # Remove empty <![CDATA[]]> sections

		return $html;
	}
79361
function can($action='manage') {
        $callback = array($this, 'can__' . $action);
        if (is_callable($callback)) {
            return call_user_func($callback);
        }
        //по умолчанию разрешаем все!
        return false;
    }
676866
public function main()
    {
        Eresus_Kernel::log(__METHOD__, LOG_DEBUG, 'starting...');

        try
        {
            /* Общая инициализация */
            $this->checkEnvironment();
            $this->createFileStructure();



            /* Подключение старого ядра */
            Eresus_Kernel::log(__METHOD__, LOG_DEBUG, 'Init legacy kernel');
            include_once 'kernel-legacy.php';

            /**
             * @global Eresus Eresus
             * @todo Обратная совместимость — удалить
             * @deprecated с 3.01 используйте Eresus_Kernel::app()->getLegacyKernel()
             */
            $GLOBALS['Eresus'] = new Eresus;

            TemplateSettings::setGlobalValue('cms', $this);

            $this->initConf();
            $i18n = I18n::getInstance();
            TemplateSettings::setGlobalValue('i18n', $i18n);
            Eresus_CMS::getLegacyKernel()->init();
            TemplateSettings::setGlobalValue('Eresus', Eresus_CMS::getLegacyKernel());
            $this->runWeb();
        }
        catch (Exception $e)
        {
            Eresus_Kernel::logException($e);
            ob_end_clean();
            $this->fatalError($e, false);
        }
        return 0;
    }
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);
    }
1123536
public static function getCatalogByTerm($term_current, $limit = 4) {
    $build = [];
    $pids = [];
    $site_commerces = [];

    $user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

    $db = \Drupal::database();

    // Дочерние термины для которого получаем перечень товаров.
    $terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($term_current->getVocabularyId(), $term_current->id(), NULL, TRUE);
    if (count($terms)) {
      foreach ($terms as $term) {
        $pids = [];
        if ($term->field_view->value) {
          $query = $db->select('site_commerce_field_data', 'n');

          if (!$user->hasRole('site commerce administer online store')) {
            $query->condition('n.status', 1);
            $query->condition('n.status_catalog', 1);
          }

          $query->fields('n', array('pid'));
          $query->innerJoin('site_commerce__field_category', 't', 't.entity_id=n.pid');
          $query->condition('t.field_category_target_id', $term->id());
          $query->range(0, $limit);
          $query->orderBy('weight');
          $result = $query->execute();

          foreach ($result as $row) {
            $pids[] = $row->pid;
          }

          if ($pids) {
            $count_term_products = \Drupal::service('site_commerce.database')->countProducts(1, $term->id());
            $site_commerces[$term->id()]['view_all'] = FALSE;
            $site_commerces[$term->id()]['count_term_products'] = $count_term_products;
            if ($count_term_products > $limit) {
              $site_commerces[$term->id()]['view_all'] = TRUE;
            }
            $site_commerces[$term->id()]['name'] = $term->getName();

            $site_commerces[$term->id()]['summary'] = "";
            $site_commerces[$term->id()]['summary'] = $term->get('field_category_summary')->value;
            $site_commerces[$term->id()]['tid'] = $term->id();
            $site_commerces[$term->id()]['site_commerce'] = \Drupal::entityTypeManager()->getStorage('site_commerce')->loadMultiple($pids);
          }
        }
      }
    }

    // Товары в текущей категории.
    $pids = [];
    $query = $db->select('site_commerce_field_data', 'n');
    if (!$user->hasRole('site commerce administer online store')) {
      $query->condition('n.status', 1);
      $query->condition('n.status_catalog', 1);
    }
    $query->fields('n', array('pid'));
    $query->innerJoin('site_commerce__field_category', 't', 't.entity_id=n.pid');
    $query->condition('t.field_category_target_id', $term_current->id());
    $query->orderBy('weight');
    $pager = $query->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit(80);
    $result = $pager->execute();

    foreach ($result as $row) {
      $pids[] = $row->pid;
    }

    if ($pids) {
      $count_term_products = \Drupal::service('site_commerce.database')->countProducts(1, $term_current->id());
      $site_commerces[$term_current->id()]['view_all'] = FALSE;
      $site_commerces[$term_current->id()]['count_term_products'] = $count_term_products;

      // Заголовок для дополнительных товаров или услуг.
      $site_commerces[$term_current->id()]['name'] = "";
      if (count($terms)) {
        $site_commerces[$term_current->id()]['name'] = t('Additional products (services) in the category «@category»', ['@category' => $term_current->getName()]);
      }

      $site_commerces[$term_current->id()]['summary'] = "";
      $site_commerces[$term_current->id()]['view_all'] = FALSE;
      $site_commerces[$term_current->id()]['tid'] = "";
      $site_commerces[$term_current->id()]['site_commerce'] = \Drupal::entityTypeManager()->getStorage('site_commerce')->loadMultiple($pids);
    }

    if (count($site_commerces)) {
      $build['products'] = array(
        '#theme' => 'site_commerce_catalog_products',
        '#site_commerces' => $site_commerces,
        '#attached' => array(
          'library' => array(
            'site_commerce/card',
          ),
        ),
        '#cache' => [
          'tags' => ['taxonomy_term:' . $term_current->id()],
          'contexts' => ['languages'],
          'max-age' => Cache::PERMANENT,
        ],
      );

      // Добавляет пейджер на страницу.
      if (!count($terms)) {
        $build['pager'] = array(
          '#type' => 'pager',
          '#quantity' => 2,
        );
      }
    }

    return $build;
  }
273973
private function edit()
    {
        $Eresus = Eresus_CMS::getLegacyKernel();
        $item = $Eresus->db->selectItem($this->table['name'], "`id`='" . arg('id') . "'");
        $item['section'] = explode('|', $item['section']);
        $sections = $this->menuBranch();
        array_unshift($sections[0], 'ВСЕ РАЗДЕЛЫ');
        array_unshift($sections[1], 'all');
        $form = array(
            'name' => 'formEdit',
            'caption' => 'Изменить баннер',
            'width' => '95%',
            'fields' => array(
                array('type' => 'hidden', 'name' => 'update', 'value' => $item['id']),
                array('type' => 'edit', 'name' => 'caption', 'label' => '<b>Заголовок</b>',
                    'width' => '100%', 'maxlength' => '255', 'pattern' => '/.+/',
                    'errormsg' => 'Заголовок не может быть пустым!'),
                array('type' => 'listbox', 'name' => 'section', 'label' => '<b>Разделы</b>', 'height' => 5,
                    'items' => $sections[0], 'values' => $sections[1]),
                array('type' => 'edit', 'name' => 'block', 'label' => '<b>Блок баннера</b>',
                    'width' => '100px', 'maxlength' => 15,
                    'comment' => 'Для вставки баннера используйте макрос <b>$(Banners:имя_блока)</b>',
                    'pattern' => '/.+/', 'errormsg' => 'Не указан блок баннера!'),
                array('type' => 'edit', 'name' => 'priority', 'label' => 'Приоритет', 'width' => '20px',
                    'comment' => 'Если для одного раздела и одного блока задано несколько баннеров, будет ' .
                        'показан с большим приоритетом', 'default' => 0, 'pattern' => '/\d+/',
                    'errormsg' => 'Приоритет задается только цифрами!'),
                array('type' => 'edit', 'name' => 'showFrom', 'label' => 'Начало показов',
                    'width' => '100px', 'comment' => 'ГГГГ-ММ-ДД', 'default' => gettime('Y-m-d'),
                    'pattern' => '/[12]\d{3,3}-[01]\d-[0-3]\d/', 'errormsg' => 'Неправильный формат даты!'),
                array('type' => 'edit', 'name' => 'showTill', 'label' => 'Конец показов',
                    'width' => '100px', 'comment' => 'ГГГГ-ММ-ДД; Пустое - без ограничений',
                    'pattern' => '/(\d{4,4}-[01]\d-[0-3]\d)|(^$)/', 'errormsg' => 'Неправильный формат даты!'),
                array('type' => 'edit', 'name' => 'showCount', 'label' => 'Макс. кол-во показов',
                    'width' => '100px', 'comment' => '0 - без ограничений', 'default' => 0,
                    'pattern' => '/(\d+)|(^$)/', 'errormsg' => 'Кол-во показов задается только цифрами!'),
                //array ('type' => 'edit', 'name' => 'mail', 'label' => 'e-mail владельца',
                //'width' => '200px', 'maxlength' => '63'),
                array('type' => 'checkbox', 'name' => 'active', 'label' => 'Активировать'),
                array('type' => 'header', 'value' => 'Свойства баннера'),
                array('type' => 'file', 'name' => 'image', 'label' => 'Картинка или Flash', 'width' => '50',
                    'comment' => '<a></a>'),
                array('type' => 'edit', 'name' => 'width', 'label' => 'Ширина', 'width' => '100px',
                    'comment' => 'только для Flash'),
                array('type' => 'edit', 'name' => 'height', 'label' => 'Высота', 'width' => '100px',
                    'comment' => 'только для Flash'),
                array('type' => 'edit', 'name' => 'url', 'label' => 'URL для ссылки', 'width' => '100%',
                    'maxlength' => '255'),
                array('type' => 'select', 'name' => 'target', 'label' => 'Открывать',
                    'items' => array('в новом окне', 'в том же окне')),
                array('type' => 'header', 'value' => 'HTML-код баннера'),
                array('type' => 'memo', 'name' => 'html',
                    'label' => 'HTML-код (Если задан HTML-код, то предыдущие свойства игнорируются и могут' .
                        'не заполняться)',
                    'height' => '4'),
                array('type' => 'divider'),
                array('type' => 'checkbox', 'name' => 'flushShowCount',
                    'label' => 'Обнулить кол-во показов'),
            ),
            'buttons' => array('ok', 'apply', 'cancel'),
        );

        /** @var TAdminUI $page */
        $page = Eresus_Kernel::app()->getPage();
        $result = $page->renderForm($form, $item);
        return $result;
    }