Web-мастер: курс молодого бойца

Лента новостей на файлах

   

 Добавлено 2008-04-09 17:38:05
evgenijj
Модератор




Сообщений: 1371
Зарегистрирован: 09.11.2007

Цитировать
Лента новостей - файл news.php
<?php
if ( isset( $_GET['action'] ) )
  
$action $_GET['action'];
else 
  
$action 'newsList';

if ( !
in_array$action, array('newsList''showNews') ) ) $action 'newsList';  

if ( 
$action == 'newsList' )
  
newsList();
else
  
showNews();

function 
newsList()
{
  echo 
'<h1>Новости</h1>';
  
$file file'news.txt' );
  
$total count$file );
  if ( 
$total ) {
    echo 
'<ul>';
    for ( 
$i $total-1$i >= 0$i-- ) {
      
$tmp explode('¤'$file[$i] );
      echo 
'<li>'.$tmp[0].'<br/>';
      echo 
'<a href="'.$_SERVER['PHP_SELF'].'?action=showNews&number='.$i.'">'.$tmp[1].'</a></li>'."\n";
    }
    echo 
'</ul>'."\n";
  } else {
    echo 
'<p>Нет новостей</p>'."\n";
  }
}

function 
showNews()
{
  if ( !isset( 
$_GET['number'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  }
  
$number = (int)$_GET['number'];
  
// Получаем из файла news.txt затребванную новость
  
$file file'news.txt' );
  
$cnt count$file );
  if ( 
$number or $number >= $cnt ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  }
  
$news explode'¤'$file[$number] );
  
$news[2] = trim($news[2]);
  
$news[2] = str_replace'_CRLF_'' '$news[2] );
  echo 
'<h1>'.$news[1].'</h1>'."\n";
  echo 
'<p style="font-size:smaller">'.$news[0].'</p>'."\n";
  echo 
'<div>'.$news[2].'</div>'."\n"

?>
Административная часть - файл admin.php
<?php
define
'LOGIN''mylogin' );
define'PASSWORD''mypassword' );
define'NEW_LINE'"\n" ); // для Windows заменить на "\r\n"

session_start();
 
$actions = array( 'loginForm''login''newsList''addNewsForm''addNews'
                  
'editNewsForm''updateNews''deleteNews' );
if ( isset( 
$_GET['action'] ) ) {
  
$action $_GET['action'];
} else {
  if ( isset( 
$_SESSION['auth'] ) ) 
    
$action 'newsList';
  else
    
$action 'loginForm';
}
  
if ( !
in_array$action$actions ) ) $action 'loginForm';
switch( 
$action ) {
  case 
'loginForm':    // форма для авторизации
    
loginForm();
    break;
  case 
'login':        // проверка логина и пароля
    
login();
    break;
  case 
'newsList':     // список новостей
    
newsList();
    break;
  case 
'addNewsForm':  // форма для добавления новости
    
addNewsForm();
    break;
  case 
'addNews':      // добавить новость
    
addNews();
    break;
  case 
'editNewsForm'// форма для редактирования новости
    
editNewsForm();
    break;
  case 
'updateNews':   // обновить новость
    
updateNews();
    break;
  case 
'deleteNews':   // удалить новость
    
deleteNews();
    break;
}

function 
loginForm()
{
  echo 
'<h1>Вход</h1>';
  echo 
'<form action="'.$_SERVER['PHP_SELF'].'?action=login" method="post">'."\n";
  echo 
'Имя: <input type="text" name="name" value="" /><br/>'."\n";
  echo 
'Имя: <input type="password" name="pass" value="" /><br/>'."\n";
  echo 
'<input type="submit" name="submit" value="Отправить" />'."\n";
  echo 
'</form>'."\n";
}

function 
login()
{
  if ( !isset( 
$_POST['name'] ) or !isset( $_POST['name'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=loginForm' );
    die();
  }
  if ( 
$_POST['name'] == LOGIN and $_POST['pass'] == PASSWORD ) {
    
$_SESSION['auth'] = true;
  }
  
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
  die();
}

function 
newsList()
{
  
// Доступ только для авторизованного пользователя
  
if ( !isset( $_SESSION['auth'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=loginForm' );
    die();
  }
  echo 
'<h1>Новости</h1>';
  echo 
'<p><a href="'.$_SERVER['PHP_SELF'].'?action=addNewsForm">Добавить</a></p>'."\n";
  
$file file'news.txt' );
  
$total count$file );
  if ( 
$total ) {
    echo 
'<table border="1">'."\n";
    echo 
'<tr><th>N</th><th>Дата</th><th>Заголовок</th><th>Ред.</th><th>Удл.</th></tr>'."\n";
    for ( 
$i $total-1$i >= 0$i-- ) {
      
$tmp explode('¤'$file[$i] );
      echo 
'<tr><td>'.$i.'</td><td>'.$tmp[0].'</td><td>'.$tmp[1].'</td>';
      echo 
'<td><a href="'.$_SERVER['PHP_SELF'].'?action=editNewsForm&number='.$i.'">Ред.</a></td>';
      echo 
'<td><a href="'.$_SERVER['PHP_SELF'].'?action=deleteNews&number='.$i.'">Удл.</a></td></tr>'."\n";
    }
    echo 
'</table>'."\n";
  } else {
    echo 
'<p>Нет новостей</p>'."\n";
  } 
}

function 
addNewsForm()
{
  if ( !isset( 
$_SESSION['auth'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=loginForm' );
    die();
  }
  echo 
'<h1>Добавить новость</h1>';
  echo 
'<form action="'.$_SERVER['PHP_SELF'].'?action=addNews" method="post">'."\n";
  echo 
'Заголовок: <input type="text" name="title" value="" /><br/>'."\n";
  echo 
'Новость:<br/> <textarea name="body"></textarea><br/>'."\n";
  echo 
'<input type="submit" name="submit" value="Отправить" />'."\n";
  echo 
'</form>'."\n"
}

function 
addNews()
{
  if ( !isset( 
$_SESSION['auth'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=loginForm' );
    die();
  }
  if ( empty( 
$_POST['title'] ) or empty( $_POST['body'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  }
  
$date date('d:m:Y');
  
$title trim$_POST['title'] );
  
$body trim$_POST['body'] );
  
// Когда из поля textarea передаются данные, содержащие 
  // перевод строки, то они передаются в виде CRLF
  // CR - возврат каретки, LF - перевод строки;
  // Поскольку мы записываем новости в файл, где одна
  // новость - одна строка, то нам надо избавиться от
  // перевода строки. При редактировании новости произведем
  // обратную замену.
  
$body str_replace("\r\n"'_CRLF_'$body);
  
// Добавляем новость  
  
if ( $fp fopen('news.txt''a') ) {
    
// Ставим на файл исключительную блокировку
    
if ( flock($fpLOCK_EX) ) {
      
fwrite$fp$date.'¤'.$title.'¤'.$body.NEW_LINE );
      
flock$fpLOCK_UN );
    }
    
fclose$fp );
  }
  
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
  die();
}

function 
editNewsForm()
{
  if ( !isset( 
$_SESSION['auth'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=loginForm' );
    die();
  }
  if ( !isset( 
$_GET['number'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  }
  
$number = (int)$_GET['number'];
  
// Получаем из файла news.txt новость для редактирования
  
$file file'news.txt' );
  
$cnt count$file );
  if ( 
$number or $number >= $cnt ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  }
  
$news explode'¤'$file[$number] );
  
$news[2] = trim($news[2]);
  
$news[2] = str_replace'_CRLF_'"\r\n"$news[2] );
  echo 
'<h1>Редактировать новость</h1>';
  echo 
'<form action="'.$_SERVER['PHP_SELF'].'?action=updateNews&number='.$number.'" method="post">'."\n";
  echo 
'Заголовок: <input type="text" name="title" value="'.$news[1].'" /><br/>'."\n";
  echo 
'Новость:<br/> <textarea name="body">'.$news[2].'</textarea><br/>'."\n";
  echo 
'<input type="submit" name="submit" value="Отправить" />'."\n";
  echo 
'</form>'."\n"
}

function 
updateNews()
{
  if ( !isset( 
$_SESSION['auth'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=loginForm' );
    die();
  }
  if ( !isset( 
$_GET['number'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  }
  if ( empty( 
$_POST['title'] ) or empty( $_POST['body'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  }
  
$number = (int)$_GET['number'];
  
// Получаем из файла news.txt новость для редактирования
  
$file file'news.txt' );
  
$cnt count$file );
  if ( 
$number or $number >= $cnt ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  }
  
$title trim$_POST['title'] );
  
$body trim$_POST['body'] );
  
$body str_replace"\r\n"'_CRLF_'$body ); 
  
$tmp explode'¤'$file[$number] );
  
$file[$number] = $tmp[0].'¤'.$title.'¤'.$body.NEW_LINE;
  
// Перезаписываем файл
  
if ( $fp fopen('news.txt''w') ) {
    if (
flock($fpLOCK_EX)) {
      foreach ( 
$file as $line fwrite($fp$line);
      
flock($fpLOCK_UN);
    }
    
fclose($fp);
  }
  
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
  die();
}

function 
deleteNews()
{
  if ( !isset( 
$_SESSION['auth'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=loginForm' );
    die();
  }
  if ( !isset( 
$_GET['number'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  } 
  
$number = (int)$_GET['number'];
  
// Получаем из файла news.txt новость для удаления
  
$file file'news.txt' );
  
$cnt count$file );
  if ( 
$number or $number >= $cnt ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
    die();
  }
  
// Удаляем новость
  
unset($file[$number]);
  
// Перезаписываем файл
  
if ( $fp fopen('news.txt''w') ) {
    if ( 
flock($fpLOCK_EX) ) {
      foreach ( 
$file as $line fwrite$fp$line );
      
flock($fpLOCK_UN);
    }
    
fclose($fp);
  }
  
header'Location: '.$_SERVER['PHP_SELF'].'?action=newsList' );
  die();
}
?>



Денежные купюры пронумерованы для того, чтобы когда-нибудь я мог сложить их все одну к одной, по порядку.
Наверх  Посмотреть профиль   Сайт автора  

 Добавлено 2008-04-09 21:18:26
UserID
Модератор


Сообщений: 153
Зарегистрирован: 29.12.2007

Цитировать
evgenijj мне нравится как ты кодишь :) меньше файлов, больше кода. Пять баллов. Я думаю что скрипты лучше дополнительно закачивать архивом, и сделать отдельный раздел с перечнем скриптов.


Master...
Наверх  Посмотреть профиль   Отредактировано автором 09.04.2008

 Добавлено 2008-04-13 16:35:37
evgenijj
Модератор




Сообщений: 1371
Зарегистрирован: 09.11.2007

Цитировать
UserID пишет:
сделать отдельный раздел с перечнем скриптов
Давно уже хочу сделать на сайте раздел "Скрипты". Но не так, как это зачастую делают - валят в кучу все, что удалось найти в Сети (причем, большая часть вообще не работает), а сделать подборку (как бы это сказать) учебных скриптов. На все случаи жизни. С подробными комментариями. Чтобы в них можно было легко разобраться, и на основе учебного написать свой скрипт - с дополнительными возможностями, с дизайном и т.п. Предварительный список такой
1. Гостевая книга на файлах
2. Гостевая книга с использованием БД
3. Лента новостей на файлах
4. Лента новостей с использованием БД
5. Чат на файлах
6. Чат с использованием БД
7. Каталог статей с разделением по категориям (возможно, с возможностью оставлять комментарии)
8. Отправка e-mail с сайта (с возможностью вложения файлов)
9. Каталог продукции фирмы
10. Интернет-магазин
11. Регистрация и авторизация
12. Форум
и т.п.


Денежные купюры пронумерованы для того, чтобы когда-нибудь я мог сложить их все одну к одной, по порядку.
Наверх  Посмотреть профиль   Сайт автора  

 Добавлено 2010-08-24 16:46:32
Snic


Сообщений: 242
Зарегистрирован: 18.12.2007

Цитировать
А если обращаться не по номеру строки, а по url (ЧПУ) ;)


Лень - двигатель прогресса, имхо :)
Наверх  Посмотреть профиль    
   
Быстрый ответ
 
Цвет шрифта: Закрыть все теги
Сообщение
Защитный код