Рейтинг@Mail.ru
 

Шаг 7

Архивирование файлов

Для начала нужно как то упорядочить хранение информации. Сделаем папку data (не путать с date, data - это данные а не дата) рядом со скриптом. Права доступа на неё нужно выставить 777, но это если под LINUX'ом. Под виндой не нужно, так сойдет. Здесь мы будем хранить перлы почитателей.

Дальше нам нужно изменить пути и названия файлов, что бы все было на своих местах. Файлы мы будем обзывать номерами по порядку. Прямо нагло, без всяких расширений - 1, 2, 3 и т.д. Что бы не пыхтеть потом, отрезая ненужные хвосты. Это и будут номера страниц.

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

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

Только один маленький штрих - переменная $files объявлена статической, то есть бессмертной. Пока скрипт работает, она не исчезнет, не в пример другим, которые стираются сразу, как отработает функция. Это нужно для того, что бы не бегать к файловой системе при каждом вызове функции. Хватит и одного раза.

Теперь остается достать максимальное значене, то есть последнюю страницу и работать с ней. А остальные пусть пока пылятся в архиве.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?php


/**   
* The guest book   
* Гостевая книга   
* @author IT studio IRBIS-team   
* @copyright © 2009 IRBIS-team   
*/   
/////////////////////////////////////////////////////////   
/**   
* We establish the charset and level of errors   
* Устанавливаем кодировку и уровень ошибок   
*/   
    
header("Content-Type: text/html; charset=utf-8");   
    
error_reporting(E_ALL);  
  
     
///////////////////////////////////////////////////////////// 
//                       FUNCTIONS 
//                        ФУНКЦИИ 
/////////////////////////////////////////////////////////////     
/**     
* Function of reading of a directory    
* Функция чтения директории 
* @param string   
* @return array    
*/ 
    
function dirScan($dir
    {  
      
//Объявляем переменную статичной 
        
static $files
         
//При первом вызове функции она пуста, по этому 
            
if(empty($files)) 
            {
               
//Сканируем директорию, вытаскивая в массив все названия файлов 
                
$files scandir($dir);
               
//Убираем из массива служебные записи (точка и две точки) 
                
$files array_diff($files, array('.''..')); 
            } 
      
//Если массив пустой, то пишем в него номер 1 При следующем вызове функции
      //массив уже не будет пустым, так как объявлен бессмертным конструкцией static 
        
$files count($files) ? $files : array('1'); 
       
//На выход                 
        
return $files
    } 
    
/**     
* bb-tags and smilies replacement function     
* Функция замены bb-тегов и смайликов  
* @param string  
* @return string    
*/ 
    
function bbTags($text
    {    
        
$bb = array(
                    
'[B]'
                    
'[/B]'
                    
'[I]'
                    
'[/I]'
                    
'[S]'
                    
'[/S]'
                    
'[U]'
                    
'[/U]'
                    
'[:)]'
                    
'[:(]'
                    
'[;)]'
                    
'[:D]' 
                   
);  

        
$tag = array(
                     
'<b>'
                     
'</b>'
                     
'<i>'
                     
'</i>'
                     
'<s>'
                     
'</s>'
                     
'<u>'
                     
'</u>',  
                     
'<img src="smiles/1.gif" />'
                     
'<img src="smiles/2.gif" />',  
                     
'<img src="smiles/3.gif" />'
                     
'<img src="smiles/4.gif" />' 
                
); 
                 
        return 
str_ireplace($bb$tag$text);             
    } 
     
         
///////////////////////////////////////////////////////////////// 
//                        VARIABLES 
//                        ПЕРЕМЕННЫЕ 
///////////////////////////////////////////////////////////////// 
     
     
    
$text1 = !empty($_POST['text1'])?$_POST['text1']:null;   
    
$text2 = !empty($_POST['text2'])?$_POST['text2']:null;  
    
$info  = array();  
    
$posts = array(); 

         
///////////////////////////////////////////////////////////////// 
//                        SCRIPT 
//                        СКРИПТ 
/////////////////////////////////////////////////////////////////
     
    
if(!empty($_POST['ok']))   
    {   
        if(!
$text1)   
            
$info[] = 'Текстовое поле не заполнено.'
               
        if(!
$text2)   
            
$info[] = 'Текстовая область не заполнена.';  
              
        if(
count($info) == 0
        {   
              
             
$file max(dirScan('data')); 
              
             if(
file_exists('data/'$file)) 
             {    
                 
$posts unserialize(file_get_contents('data/'$file)); 
                 
$keys array_keys($posts); 
                 
$id max($keys) + 1;
               
// Подсчитываем количество постов в файле 
                 
$num count($posts); 
             } 
             else  
// Если файла нет, значит будет первый 
                 
$num $id 1
           
// Если количество постов больше 5       
            
if($num >= 5
            { 
           
// Увеличиваем номер файла (значит запишется новый файл) 
                
++$file;
           
// Уничтожаем массив с постами, нам нужен новый массив 
                
unset($posts); 
            }                    
           
// Формируем свежий массив для нового файла, ну а дальше по плану.                         
            
$posts[$id]['date'] = date('d-m-Y'); 
            
$posts[$id]['name'] = $text1
            
$posts[$id]['mess'] = $text2;  
            
            
file_put_contents('data/'$fileserialize($posts));   

            
header('location: http://'$_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);   
            exit();   
        }   
    }   
    else   
        
$info[] = 'Напишите что-нибудь';
   
///////////////////////////////////////////////////////////////// 
//                        VIEW 
//                    ОТОБРАЖЕНИЕ 
/////////////////////////////////////////////////////////////////
?>   
<form action="" method="post">   
Логин:<br />   
<input name="text1" type="text" value="<?php echo htmlspecialchars($text1?>"/><br />   
Сообщение:<br />   
<textarea name="text2" cols="40" rows="10"><?php echo htmlspecialchars($text2);?></textarea><br />   
<input name="ok" type="submit" />   
</form>   
<?php   

    
echo implode('<br>'$info) .'<br>'
//Берем самый большой элемент массива. Это будет самый свежий файл.  
    
$file max(dirScan('data')); 
//Проверяем
    
if(file_exists('data/'$file)) 
    { 
//Читаем и так далее 
        
$posts unserialize(file_get_contents('data/'$file)); 
                 
        foreach(
$posts as $id => $post
        { 
            
$date $post['date'];         
            
$name htmlspecialchars($post['name']); 
            
$mess nl2br(bbTags(htmlspecialchars($post['mess'])));                 
?>         
<div style="border:1px solid; width:70%; background-color:#66FFFF; min-height:100px; margin:5px; padding:5px">         
<?php echo $date?> / <strong><?php echo $name?></strong> 
<hr width="30%" align="left" /> 
<?php echo $mess?> 
</div> 
<?php 
         
}  
    }



Все работает, но чего то не хватает. Правильно - самой навигации. То есть ссылок вида
| 1 | 2 | 3 | 4 |

Сейчас восполним пробел.