PHP

Статичecкие страницы

Шаг 1
Подготовка
В прошлом разделе мы сделали гостевую книгу. Но слишком много чести для одной маленькой брошюрки использовать такую большую структуру.

Сейчас сделаем нормальную, как у всех порядочных людей, главную страницу. А за одно и кучу других. Оптом, что бы не мучаться потом, когда потребуется добавить пару - тройку.

Так как добавлять и удалять страницы мы будем из админки, с неё и начнем.
Для начала нам нужно определить место, где мы будем хранить контент. Так как контент статичных страниц не меняется иногда годами, а обращаются к нему часто, то нет смысла хранить его в базе данных. Вполне достаточно и файловой системы. Да и понадежнее будет.

У нас есть уже директория setup, вот туда и будем складывать контент страниц. Что бы не плодить каталоги.. Права на директорию нужно выставить так, что бы скрипт смог безнаказанно организовывать там файлы. Чаще всего это 777.

Изготовим шаблон формы и прицепим во вьюшку.

Вот тут по подробнее. Для редактирования контента страниц нам потребуется визуальный редактор. Нет смысла сочинять свой, в сети полно свободно распростроняемых, очень недурных редакторов. Тут, как говорится - на вкус и цвет. Мне понравился этот. Легкий, удобный, просто настраиваемый. Вроде все в нем есть вплоть до загрузки картинок. Прикручивается несколькими строчками.

Так как это отдельное, самодостаточное приложение, положим его в корень в папку editor и прикрепим к главному шаблону админки.

Ах, да... Нет у нас никакого шаблона админки. Он у нас общий до сих пор. Ну тогда нужно сделать таковой, за одно и облагородить, что бы админка была как админка, а не как кистень.

В общем то листинг шаблонов выкладывать нет смысла, все равно там стили и картинки. Так что возьмите уже готовый, там и редактор прикручен. Правда, как оказалось, он не работает в Хроме, но я этот браузер не люблю и под него подстраиваться в админке не вижу смысла. Фанаты могут прикрутить свой, это совсем не сложно.

На что следует обратить внимание.

1. Появилась новая функция в libs/default.php
/** 
* Active links 
* Активные ссылки         
*/     
    function active($page) 
    { 
       global $GET; 
        if($GET['page'] == $page) 
            return 'class="active"'; 
    } 

Она нужна для того, что бы подсветить активные ссылки.

2. Меню в админке теперь появляется только для авторизованных пользоватилей. Мы вынесли подключение в индекс, воспользовавшись нашим шаблонизатором:
<?php

    if(!empty($_SESSION['admin']))   
    { 
     /** 
     * The switch of modules 
     * Переключатель страниц 
     */       
        switch($GET['page'])  
        {  
            case 'meta':     
                include IRB_ROOT .'admin/meta/router.php';  
            break; 
              
            case 'exit':     
                include IRB_ROOT .'admin/sequrity/exit.php';  
            break;
            
            case 'main':     
                include IRB_ROOT .'admin/main/router.php';  
            break;
            
            case 'guest':     
                include IRB_ROOT .'admin/guest/router.php';  
            break;
                                    
            default: 
                include IRB_ROOT .'admin/meta/router.php';  
            break;     
        }
        
    $tpl = getTpl('admin_menu');
    $admin_menu = parseTpl($tpl, array());    
             
    }
    else
    {
        $admin_menu = '';
        include IRB_ROOT .'admin/sequrity/enter.php'; 
    }    

Так как данных нам передавать не нужно, вторым параметром поставим пустой массив. А в шаблоне админки на месте меню просто выведем эту переменную ($admin_menu).

Ну вот, все готово к созданию модуля статичных страниц. Теперь нам нужно попытаться сохранить то, что мы напишем в редакторе. Сам по себе принцип крайне прост. Берем данные из $_POST и записываем их в файл. Это на случай, если файла еще нет. А если есть - то же самое, только сначала нам нужно вытащить его содержимое в редактор, что бы не переписывать все заново из-за одной гнусной опечатки.
Но раз это будет редактирование страниц, то значит сделаем подобающий случаю контроллер - edit_controller.php и переместим все туда. А в главном контроллере сделаем возможность добавить разные страницы, выбрать для редактирования или удалить их.

admin/main/edit_controller.php
<?php

/**  
* The administration panel. Controller  
* Панель администрирования. Контроллер   
* @author IT studio IRBIS-team  
* @copyright © 2009 IRBIS-team  
*/  
/////////////////////////////////////////////////////////  

/**  
* Generation of page of an error at access out of system  
* Генерация страницы ошибки при доступе вне системы  
*/  
    if(!defined('IRB_KEY'))  
    {  
       header("HTTP/1.1 404 Not Found");        
       exit(file_get_contents('../../404.html'));  
    }  
////////////////////////////////////////////////////////// 

/**  
* Edit page 
* Редактируем страницу  
*/      
    if($ok) 
    { 
        file_put_contents(IRB_ROOT .'setup/'. $GET['id'] .'.txt', $POST['value1']); 
        reDirect();     
    }  
     
/**  
* Read page 
* Читаем страницу  
*/          
        
    $page      = ''; 
    $edittext  = '';
            
    if(file_exists(IRB_ROOT .'setup/'. $GET['id'] .'.txt')) 
       $edittext = file_get_contents(IRB_ROOT .'setup/'. $GET['id'] .'.txt'); 
    else 
    { 
       header("HTTP/1.1 404 Not Found");       
       exit(file_get_contents(IRB_ROOT .'404.html')); 
    }

Все, можно попробовать. Запись теперь сохраняется и её можно редактировать.

Шаг 2
Редактируем страницы


Так как у страницы должно быть не только английское название для ссылки, но и русское (вернее на выбранном языке), то хранить эти данные лучше всего в массиве.
Мы уже делали что то подобное, когда делали гостевую книгу на файлах и позже, когда собирали модуль для установки мета-тегов. Так что совсем не сложно. В admin/main/read_controller.php пишем этот скрипт:
<?php

/**  
* The administration panel. Controller  
* Панель администрирования. Контроллер   
* @author IT studio IRBIS-team  
* @copyright © 2009 IRBIS-team  
*/  
/////////////////////////////////////////////////////////  

/**  
* Generation of page of an error at access out of system  
* Генерация страницы ошибки при доступе вне системы  
*/  
    if(!defined('IRB_KEY'))  
    {  
       header("HTTP/1.1 404 Not Found");        
       exit(file_get_contents('../../404.html'));  
    }  
////////////////////////////////////////////////////////// 

/**  
* Function of generation of a menu of pages 
* Функция генерации меню страниц 
* @param array 
* @return string 
*/  
    function createMenu($links = array()) 
    { 
        if(count($links)) 
        { 
            $menu = "<ul class=\"pages_menu\">\n"; 
            foreach($links as $num => $link) 
                $menu .= "<li> 
                          <input name=\"form[array1][]\" type=\"checkbox\" value=\"". $num ."\" /> 
                          <a href=\"". href('rem=edit', 'id='. $link[0], 'num='. $num) ."\">". $link[1] ."</a>  
                          </li>\n"; 
     
            return $menu ."</ul>\n"; 
         }     
    } 
//////////////////////////////////////////////////////////////// 
        
    if(file_exists(IRB_ROOT .'setup/menu.txt')) 
       $links = unserialize(file_get_contents(IRB_ROOT .'setup/menu.txt')); 
    else 
       $links = array(); 

/**  
* New page 
* Новая страница  
*/      
    if($ok && $POST['value1'] && $POST['value2']) 
    { 
        $url = mb_strtolower($POST['value1']); 
        $reserve = array(); 
         
        if(count($links)) 
            foreach($links as $num => $link) 
                $reserve[] = $link[0]; 
             
        if(!preg_match("#^[a-z]+$#ui", $url)) 
            $info[] = IRB_LANG_INVALID_DATA; 
        elseif(in_array($url, $reserve)) 
            $info[] = IRB_LANG_DOUBLE_LINK; 
        else 
        { 
            $keys = array_keys($links);  
            $id = max($keys) + 1; 
            $links[$id] = array($url, htmlspecialchars($POST['value2'])); 
             
            file_put_contents(IRB_ROOT .'setup/'. $url .'.txt', ''); 
            file_put_contents(IRB_ROOT .'setup/menu.txt', serialize($links));         
     
            reDirect();     
        }      
    } 
          
/**  
* Page removal  
* Удаление страницы  
*/              
    if($delete) 
    { 
        foreach($links as $num => $link) 
            if(in_array($num, $POST['array1'])) 
                unlink(IRB_ROOT .'setup/'. $link[0] .'.txt'); 
            else 
                $new_links[$num] = $link;     

        file_put_contents(IRB_ROOT .'setup/menu.txt', serialize($new_links));         

        reDirect();     
    } 

Надеюсь уже не пугают такие объёмы кода?

Что здесь.
Ну функция генерации меню уже знакома, затруднений вызвать не должна. Даже с теми изменениями, которые мы в неё внесли.

Дальше мы пытаемся прочитать файл, в котором хранятся ссылки на статичные страницы. Если такого нет - выдаем пустой массив. Если есть, рассериализовываем массив и делаем с помощью функции меню для редактирования.
Массив выглядит примерно так:
Array
(
    [1] => Array
        (
            [0] => first
            [1] => Первая страница
        )

    [2] => Array
        (
            [0] => two
            [1] => Вторая страница
        )

)

Тоесть у нас есть порядковый номер, название латиницей для URL и текст на родном языке для самой ссылки.

Вызов функции прямо в шаблоне.

А вот и сам шаблон:
<!-- ./skins/tpl/admin/main/show.tpl begin --> 
<form action="" method="post">  
<div style="padding:10px"> 
<div  style="float:left; padding-left:100px"> 
<h3>Статичные страницы</strong></h3> 
<b style="color:#FF0000"><?php echo getInfo($info); ?></b>  
<h4>Название для URL (только латиница)</h4>   
<input name="form[value1]" type="text" size="70" value="<?php echo $POST['value1']; ?>" />   
<h4>Название для ссылки </h4> 
<input name="form[value2]" type="text" size="70" value="<?php echo $POST['value2']; ?>" /> 
<br /><br /> 
<br />  
<input name="ok" type="submit" value="Добавить" />    
</div> 
<div style="float:right;width:300px; padding:10px 0px 0px 50px"> 
<h4>Редактировать</h4>  
<?php echo createMenu($links); ?><br /> 
<br /> 
<input name="delete" style=" margin-left:50px;color:red" type="submit" value="Удалить" onclick="return confirm('Удалить?')" /> 
</div> 
<div style="clear:both"></div> 
</div> 
</form>  
<!-- ./skins/tpl/admin/main/show.tpl end -->

Следом идет блок добавления новой страницы. По образу и подобию гостевой книги формируем массив с автоинкриментным идентификатором, сериализуем его и пишем в файл. Кроме того. сразу же создаем пустой файл для будущего контента страницы.

Вот тут два важных момента.
1. Нежелательно пускать в название файла ничего кроме латиницы. Вопервых это портит вид адресной строки, а вовторых, самое главное, может законфликтовать с файловой системой.
2. Нельзя допустить повторения ссылки. Не может в одном каталоге быть двух файлов с одинаковыми именами. Они просто перезапишутся.

А по сему мы соорудили мало-мальскую валидацию.

Ну и завершает процессию блок удаления страницы. Тут как и в гостевой книге - если идентификатор есть в массиве $POST['array1'], уничтожаем файл. А если нет - записываем в новый массив. Тем самым исключая неугодную ссылку из списка.


Осталось привести в порядок вьюшку:
admin/modules/main/view.php
<?php

/** 
* View 
* Отображение 
* @author IT studio IRBIS-team 
* @copyright © 2009 IRBIS-team 
*/ 
///////////////////////////////////////////////////////// 

/** 
* Generation of page of an error at access out of system 
* Генерация страницы ошибки при доступе вне системы 
*/ 
    if(!defined('IRB_KEY')) 
    { 
       header("HTTP/1.1 404 Not Found");       
       exit(file_get_contents('../../404.html')); 
    }     
/////////////////////////////////////////////////////////// 

    $POST = htmlChars($POST); 
     
/**   
* The switch of templates  
* Переключатель шаблонов  
*/  

    switch($GET['rem'])  
    {  
        case 'read':  
            include IRB_ROOT .'skins/tpl/admin/main/show.tpl';  
        break;  
          
        case 'edit':  
             include IRB_ROOT .'skins/tpl/admin/main/form_edit.tpl';  
        break;  
          
        default:          
            include IRB_ROOT .'skins/tpl/admin/main/show.tpl';  
    }

и прописать пару констант в языковой файл:
    define('IRB_LANG_NO_SELECT',        'Не выбрано'); 
    define('IRB_LANG_INVALID_DATA',     'Ошибка заполнения'); 
    define('IRB_LANG_DOUBLE_LINK',      'Такая ссылка не допустима');

и переменную для кнопки удаления в файл переменных:
/**   
* Buttons   
* Кнопки   
*/    
    $ok       = !empty($_POST['ok']) ? true : false;   
    $delete   = !empty($_POST['delete']) ? true : false;

Ну вот кажется тут и все. Можно пробовать.

Шаг 3
Наводим порядок


Ну а теперь нужно привести в порядок контроллер редактирования страниц.
admin/modules/main/edit_controller.php
<?php

/**  
* The administration panel. Controller  
* Панель администрирования. Контроллер   
* @author IT studio IRBIS-team  
* @copyright © 2009 IRBIS-team  
*/  
/////////////////////////////////////////////////////////  

/**  
* Generation of page of an error at access out of system  
* Генерация страницы ошибки при доступе вне системы  
*/  
    if(!defined('IRB_KEY'))  
    {  
       header("HTTP/1.1 404 Not Found");        
       exit(file_get_contents('../../404.html'));  
    }  
////////////////////////////////////////////////////////// 

    if(file_exists(IRB_ROOT .'setup/menu.txt')) 
       $links = unserialize(file_get_contents(IRB_ROOT .'setup/menu.txt')); 
    else 
       $links = array('', array('','')); 
        
/**  
* Edit page 
* Редактируем страницу  
*/      
    if($ok && $POST['value1']) 
    { 

        $links[$GET['num']][1] = htmlspecialchars($POST['value1']); 
             
        file_put_contents(IRB_ROOT .'setup/menu.txt', serialize($links));                
        file_put_contents(IRB_ROOT .'setup/'. $GET['id'] .'.txt', $POST['value2']); 
         
        reDirect();         
    
    }  
     
/**  
* Read page 
* Читаем страницу  
*/                   
    $page      = $links[$GET['num']][1]; 
    $edittext  = ''; 
                
    if(file_exists(IRB_ROOT .'setup/'. $GET['id'] .'.txt')) 
       $edittext = file_get_contents(IRB_ROOT .'setup/'. $GET['id'] .'.txt'); 
    else 
    { 
       header("HTTP/1.1 404 Not Found");       
       exit(file_get_contents(IRB_ROOT .'404.html')); 
    } 

Тут мы почти все проходили, добавилась только возможность редактировать ссылку, её текст.

Немного изменилась форма, добавилось поле:
<!-- ./skins/tpl/admin/main/show.tpl begin --> 
<form action="" method="post">  
<div style="padding:10px"> 
<div  style="float:left; padding-left:100px"> 
<h3>Статические страницы</strong></h3> 
<b style="color:#FF0000"><?php echo getInfo($info); ?></b>  
<h4>Название для URL (только латиница)</h4>   
<input name="form[value1]" type="text" size="70" value="<?php echo $POST['value1']; ?>" />   
<h4>Название для ссылки </h4> 
<input name="form[value2]" type="text" size="70" value="<?php echo $POST['value2']; ?>" /> 
<br /><br /> 
<br />  
<input name="ok" type="submit" value="Добавить" />    
</div> 
<div style="float:right;width:300px; padding:10px 0px 0px 50px"> 
<h4>Редактировать</h4>  
<?php echo createMenu($links); ?><br /> 
<br /> 
<input name="delete" style=" margin-left:50px;color:red" type="submit" value="Удалить" onclick="return confirm('Удалить?')" /> 
</div> 
<div style="clear:both"></div> 
</div> 
</form>  
<!-- ./skins/tpl/admin/main/show.tpl end -->

Ну а теперь нам нужно что то решить с метатегами для уновь утвержденного плану. Делается это очень просто.
Когда данные хранятся правильно - по полочкам, как положено, работать с ними одно удовольствие. У нас они в массиве, а не в каких нибудь текстовых файлах, которые нужно парсить-марсить и т.д.
Функция генерации меню для модулей в контроллере установки метаданных легким движением руки првращается в функцию генерации меню для всех страниц.
Точно тоже самое произойдет и с функцией выбора текущего модуля. Обратите внимание, что теперь мы передаем в функцию аргумент - массив страниц из установочного файла.
admin/meta/read_controller.php
<?php

/**  
* Controller  
* Контроллер   
* @author IT studio IRBIS-team  
* @copyright © 2009 IRBIS-team  
*/  
/////////////////////////////////////////////////////////  

/**  
* Generation of page of an error at access out of system  
* Генерация страницы ошибки при доступе вне системы  
*/  
    if(!defined('IRB_KEY'))  
    {  
       header("HTTP/1.1 404 Not Found");        
       exit(file_get_contents('../../404.html'));  
    }  
////////////////////////////////////////////////////////// 
    
      
/**  
* Function of generation of a menu of modules 
* Функция генерации меню  модулей 
*/  
    function getMenu($pages)  
    {  
          // Получаем массив названий модулей
        global $CONFIG_SETTING;
    
        // Форимируем меню ввиде списка
        $menu  = "<ul  class=\"pages_menu\">\n";
         
        // Сначала разбираем предустановленный массив
        foreach($CONFIG_SETTING as $link => $name)       
            $menu .= '<li>   
                      <a href="'. href('rem='. $link) .'" >'. $name ."</a>  
                      </li>\n";        
         
        // затем тот, который в файле
        foreach($pages as $num => $page)        
            $menu .= '<li>   
                      <a href="'. href('rem='. $page[0]) .'" >'. $page[1] ."</a>  
                      </li>\n";   
              
        return $menu . "</ul>\n";  
    } 
                 
        
/**  
* Function of generation of a menu of modules 
* Функция генерации меню  модулей 
*/  
    function getModul($pages)  
    {  
          // Глобальные массивы только для чтения
        global $CONFIG_SETTING, $GET;        
        $menu = $CONFIG_SETTING;

        // Объединяем массивы                
        foreach($pages as $num => $page)        
            $menu[$page[0]] = $page[1];

        // Возвращаем выбранное название    
        return !empty($menu[$GET['rem']]) ? $menu[$GET['rem']] : IRB_LANG_NO_SELECT;  
    } 

/** 
* Formation of an array of menu options 
* Формирование массива ссылок меню. 
*/ 
 
       // Если есть установочный файл, читаем и десериализуем
        if(file_exists(IRB_ROOT .'setup/menu.txt')) 
           $pages = unserialize(file_get_contents(IRB_ROOT .'setup/menu.txt')); 
        else //Если нет - пустой массив
           $pages = array(NULL, array(NULL, NULL));                   
/** 
* Installation of the data for meta-tags 
* Установка данных для мета-тегов. 
*/     
    if(!file_exists(IRB_ROOT .'/setup/meta.txt')) // Проверяем наличие файла. Если нет - формируем.
    {  
        // Заполняем ассоциативный массив  элементами-массивами с атрибутами мета-тегов по числу модулей
        $arrays = array_fill(1, count($CONFIG_SETTING), array( 
                                                       'title'       => IRB_LANG_NO_TITLE, 
                                                       'keywords'    => IRB_LANG_NO_KEYWORDS, 
                                                       'description' => IRB_LANG_NO_DESCRIPTION  
                                                       )); 
        // Создаем массив, где ключами - названия модулей, элементами - массивы с метаданными
        $meta = array_combine($CONFIG_SETTING, $arrays);                                              
    }   
    else // Если файл есть - читаем и десереализуем массив
        $meta = unserialize(file_get_contents(IRB_ROOT .'/setup/meta.txt'));  
     
    if($ok) // Если нажата кнопка
    { 
       // Заменяем в выбранном массиве элементы данными, полученными из формы 
        $meta[$GET['rem']] = array('title'       => $POST['value1'], 
                                   'keywords'    => $POST['value2'], 
                                   'description' => $POST['value3'] 
                                   ); 
        // Записываем сериализованный массив                 
        file_put_contents(IRB_ROOT .'setup/meta.txt', serialize($meta));

    }

Теперь мы можем формировать метатеги для любых, свежеиспеченных статическихх страничек.
Единственный минус - метатеги не будут удаляться вместе со страницами. Но. Они будут редактироваться - раз, особо много места не займут - два, мне лениво писать блок удаления - три. Кому интересно может сам дополнить контроллер необходимым функционалом.

Вот теперь у нас в админке полный порядок. Осталось вывести все это на сам сайт.

Шаг 4
Вывод на сайт
Ну а теперь все это нужно явить взору нетерпеливого юзера. Модуль у нас уже есть, контроллер модуля прост до безумия:
<?php

/** 
* Controller 
* Контроллер 
* @author IT studio IRBIS-team 
* @copyright © 2009 IRBIS-team 
*/ 
///////////////////////////////////////////////////////// 

/** 
* Generation of page of an error at access out of system 
* Генерация страницы ошибки при доступе вне системы 
*/ 
    if(!defined('IRB_KEY')) 
    { 
       header("HTTP/1.1 404 Not Found");       
       exit(file_get_contents('../../404.html')); 
    }  
////////////////////////////////////////////////////////// 

 /**  
* Function of generation of a menu of pages 
* Функция генерации меню страниц 
* @param array 
* @return string 
*/  
    function createMenu($links = array()) 
    { 
        if(!empty($links[1])) 
        { 
            $menu = "<ul class=\"pages_menu\">\n"; 
            foreach($links as $num => $link) 
                $menu .= "<li> 
                          <a href=\"". href('id='. $link[0]) ."\">". $link[1] ."</a>  
                          </li>\n"; 
     
            return $menu ."</ul>\n"; 
         }     
    }    
//////////////////////////////////////////////////////////////// 
        
    if(file_exists(IRB_ROOT .'setup/menu.txt')) 
       $links = unserialize(file_get_contents(IRB_ROOT .'setup/menu.txt')); 
    else 
       $links = array('', array('','')); 
        
    $GET['id'] = !empty($GET['id'])?$GET['id']:$links[1][0];    
    $page_content = '';            
/**  
* Read page 
* Читаем страницу  
*/      
    if(file_exists('./setup/'. $GET['id'] .'.txt')) 
       $page_content = file_get_contents('./setup/'. $GET['id'] .'.txt');

Обратите внимание. Я не постеснялся функцию в этом контроллере назвать так же, как в контроллере админки. И никакого конфликта, которым вечно пугают приверженцы ООП подхода. Мол невозможно сделать так, что бы названия не пересекались.
Всё возможно, если захотеть.

Фактически мы собрали его из фрагментов прошлых скриптов.
Теперь сделаем шаблончик с локальным меню. Его можно сделать выпадающим или как душе угодно. Важно что оно будет переключать страницы внутри модуля:
<!-- ./skins/tpl/main/show.tpl begin --> 
<div style="padding:10px"> 
<div  style="float:left; padding:30px; width:150px; border:1px solid"> 
<?php echo createMenu($links); ?> 
</div> 
<div style="float:right;padding:10px; width:750px;"> 
<?php echo $page_content; ?> 
</div> 
<div style="clear:both"></div> 
</div> 
<!-- ./skins/tpl/main/show.tpl end -->

Вот и все, можно радоваться. Осталось только немного изменить формирование мета-тегов. Для этого вызовы функции перенесем из файла libs/view.php в главный индекс:
$page = $GET['page']; 
         
/**  
* The switch of modules  
* Переключатель страниц  
*/        
    switch($GET['page'])   
    {   
        case 'main':  
            include './modules/main/router.php';     
            $page = $GET['id'];   
        break; 
           
        case 'guest':      
            include './modules/guest/router.php';   
        break; 
                    
        default:  
            include './modules/main/router.php';   
        break;      
    }           
            
    $content = ob_get_contents();     
    ob_end_clean(); 
       
/**  
* Form meta-tags  
* Формируем мета-теги 
*/    
   $title       = getMeta('title', $page);   
   $keywords    = getMeta('keywords', $page); 
   $description = getMeta('description', $page);

Теперь они будут формироваться на основании либо $GET['rem'], либо $GET['id'], в зависимости от того, какой модуль в работе.

Всё однако... Получилась такая своеобразная мини CMS, на которой уже прямо сейчас можно сделать домашнюю страничку или сайт-визитку. Нужно только решить вопрос с дизайном и версткой.

Ну а тем, кто решил развивать события - проходите дальше в вагон. Будет еще очень много интересных уроков.
Добавлено: 16 Августа 2013 02:14:33 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...