Показать сообщение отдельно

  #6  
Старый 20.02.2009, 10:49
Kuzya
Участник форума
Регистрация: 27.04.2008
Сообщений: 224
Провел на форуме:
140661

Репутация: 313
По умолчанию

В самом начале мы создаём ссылку на супер-объект CI для того что бы пользоваться всеми его возможностями, в том числе библиотеками. Мы ведь не можем пользоваться «$this» т.к. находимся не в объекте, а в обычной функции. Далее сравниваем первый сегмент и начинаем проверку только если содержимое этого сегмента «admin». То есть обычные пользователи под эту проверку никак не попадут. Ну и далее по алгоритму. В конце, при отображении формы авторизации (admin/admin_login_form.php) мы указываем методу «parse» третьим параметром «true» для того что бы он не скидывал код в буффер вывода а возвращал в нашу переменную «code». Код шаблона этой формы.

Код:
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td height="137" valign="top" background="/images/bgt.gif">
      <table width="100" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td><img src="/images/head.jpg" width=378 height=96 alt=""></td>
          <td><img src="/images/thead.gif" width=372 height=31 alt=""><br>
            <img src="/images/name.jpg" width=372 height=27 alt=""><br>
            <a href=" "><img src="/images/slogan.jpg" width=372 height=18 border=0 alt=""><br>
            </a><img src="/images/index_05.jpg" width=372 height=20 alt=""></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<form action='/admin/' method='POST'>
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
            <td width="81" valign="top"><img src="/images/rc.gif" width=55 height=24 alt=""></td>
            <td>
                <span class='stylesbold'>Пароль:</span>
            </td>
            <td>
                <input type='password' name='password' value=''/>
            </td>
        </tr>
        <tr>
            <td width="81" valign="top"><img src="/images/rc.gif" width=55 height=24 alt=""></td>
            <td colspan='2'>
                <input type='submit' value='Войти' />
            </td>
        </tr>
    </table>
</form>
4. Фотогалерея. Пользовательская часть.
Сейчас мы напишем пользовательскую часть нашей галереи. В ней будет не так много функционала как в админ-панели. Мы сделаем следующее:
1.Просмотр списка фотоальбомов
2.Просмотр содержимого альбома
3.Голосование за фотоальбом.
Начнём с первого пункта. Для пользовательской части мы будем использовать контроллеры с теми именами что и для администраторской. Создайте пустой контроллер «Albums» (если Вы не забыли, он является контроллером по умолчанию в нашем приложении) и в его конструкторе подключите модель работы с альбомами. Она будет общая для обоих частей сайта.

PHP код:
function __construct()
{
    
parent::Controller();

    
$this->load->model('Albums_model');

Затем напишем функцию «index» которая будет выводить список доступных альбомов. Она столь же проста как и её администраторский аналог.

PHP код:
function index()
{
    
$albums $this->Albums_model->getAlbumsArray();

    
$data = Array();
    
$data['albums'] = $albums;

    
$this->parser->parse('header',Array());
    
$this->parser->parse('albums_list',$data);
    
$this->parser->parse('footer',Array());

Вот код шаблона который используется для отображения списка.

Код:
<BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td height="137" valign="top" background="/images/bgt.gif">
      <table width="100" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td><img src="/images/head.jpg" width=378 height=96 alt=""></td>
          <td><img src="/images/thead.gif" width=372 height=31 alt=""><br>
            <img src="/images/name.jpg" width=372 height=27 alt=""><br>
            <a href=" "><img src="/images/slogan.jpg" width=372 height=18 border=0 alt=""><br>
            </a><img src="/images/index_05.jpg" width=372 height=20 alt=""></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table width="750" border="0" cellspacing="0" cellpadding="0" class="styles">
  <tr>
    <td width="81" valign="top"><img src="/images/rc.gif" width=55 height=24 alt=""></td>
    <td width="669">
    {albums}
      <p>&nbsp;</p>
      <p align="left"><a class='stylesbold' href='/albums/album_view/{t_name}/'>{name}</a></p>
      <p align="left">{about}</p>
    {/albums}
    </td>
  </tr>
</table>
Всё практически одно и тоже по сравнению с администраторской панелью. Обратите внимание на ссылку просмотра фотоальбома. Она имеет следующий вид «/albums/album_view/транслитерационное_имя_аль бома». Методу «album_view» будет передаваться содержимое поля «t_name». В самом же методе, для получения данных альбома, мы будем использовать функцию модели «getAlbumData», но так как ей нужен номер альбома, а не его транслитерационное имя, то мы добавим в модель ещё одну функцию - «getAlbumIdByTName». Как видно из названия - она должна получать номер альбома по указанному нами содержимому поля «t_name».

PHP код:
function getAlbumIdByTName($t_name)
{
    
// Указываем какое поле нужно выбрать
    
$this->db->select('id');
    
// Создаём условие
    
$this->db->where('t_name',$t_name);
    
$query $this->db->get('albums');
    if(!
$query->num_rows()) return false;
    
$row $query->result_array();

    return 
$row[0]['id'];

Теперь можно создать и метод «album_view». Он очень похож на метод редактирования альбома, за исключением того что в начале мы вызываем метод «getAlbumByTName».

PHP код:
function album_view($t_name)
{
    
$album_id $this->Albums_model->getAlbumIdByTName($t_name);

    
$album                          $this->Albums_model->getAlbumData($album_id);
    
$album['photos_count'] = $this->Albums_model->getPhotosCount($album_id);
    
$album['photos']            = $this->Albums_model->getAlbumPhotosArray($album_id);

    
$this->parser->parse('header',Array());
    
$this->parser->parse('album_view',$album);
    
$this->parser->parse('footer',Array());

Вид «album_view» имеет следующий код.

Код:
<BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td height="137" valign="top" background="/images/bgt.gif">
      <table width="100" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td><img src="/images/head.jpg" width=378 height=96 alt=""></td>
          <td><img src="/images/thead.gif" width=372 height=31 alt=""><br>
            <img src="/images/name.jpg" width=372 height=27 alt=""><br>
            <a href=" "><img src="/images/slogan.jpg" width=372 height=18 border=0 alt=""><br>
            </a><img src="/images/index_05.jpg" width=372 height=20 alt=""></td>
        </tr>
      </table>
    </td>
  </tr>
</table>
<table width="750" border="0" cellspacing="0" cellpadding="0" class="styles">
  <tr>
    <td width="81" valign="top"><img src="/images/rc.gif" width=55 height=24 alt=""></td>
    <td width="669">
      <p align="left">
          <span class='stylesbold'>{name}</span>
      </p>
      <p align="left">{about}</p>
      <p align="left">
          Рейтинг: {rating}
          (<a href='/albums/rating_inc/{id}/'>+</a> / <a href='/albums/rating_dec/{id}/'>-</a>)
      </p>
      <table width='100%' align='center'>
          <tr>
              {photos}
                  <td>
                      <img src='/photos/photo_view/{photo_id}/150/' /><br /><br />
                  </td>
              {/photos}
          </tr>
      </table>
    </td>
  </tr>
</table>
Ну а метод photo_view мы просто скопируем из контроллера админ-части, добавив в начало кода загрузку библиотеки «image_lib». Поместим его в контроллер «Photos»

PHP код:
class Photos extends Controller
{
    function 
photo_view($photo_id,$width 100)
    {
        
$photo_id intval($photo_id);
        
$width    intval($width);
        
        
$this->load->model('Photos_model');

        
$this->load->library('Image_lib');
        
// Получение данных из БД
        
$photo $this->Photos_model->getPhotoData($photo_id);
        
// Составляем полный путь к картинке из корня приложения
        
$path  './photos/'.$photo['file_name'];
        
// Формируем данные для изменения размера
        
$config['source_image'] = $path;
        
$config['maintain_ratio'] = true;
        
$config['width'] = $width;
        
$config['height'] = 100;
        
$config['dynamic_output'] = TRUE;

        
$this->image_lib->initialize($config);
        
// Изменяем размер и выводим в браузер результат
        
$this->image_lib->resize();
    }

Займёмся теперь рейтингами альбомов. Как Вы уже заметили, в шаблоне есть 2 ссылки на увеличение и уменьшение рейтинга - «/albums/rating_inc/{id}/» и «/albums/rating_dec/{id}/» соответственно. Эти методы будут вызывать в модели функцию увеличения/уменьшения рейтинга и обратно переносить пользователя на просмотр альбома. Вот код который должен располагаться в модели.

PHP код:
function rating_inc($album_id)
{
    
// Формируем запрос типа SET rating=rating+1
    
$this->db->set('rating''rating+1'false);
    
// Устанавливаем условие
    
$this->db->where('id',$album_id);
    
// Вызываем запрос на обновление таблицы "albums"
    
$this->db->update('albums');

PHP код:
function rating_dec($album_id)
{
    
// Формируем запрос типа SET rating=rating-1
    
$this->db->set('rating''rating-1'false);
    
// Устанавливаем условие
    
$this->db->where('id',$album_id);
    
// Вызываем запрос на обновление таблицы "albums"
    
$this->db->update('albums');

Обратите внимание на то что методу «set» третьим параметром передаётся «false», что запрещает обрамлять кавычками содержимое поля. Если бы этого параметра не было то код запроса стал таким «SET rating='rating+1'», а с ним - «SET rating=rating+1». Ну и займёмся функциями модели. Принцип работы у них следующий. Сначала мы вызываем увеличение или уменьшение рейтинга указанного альбома. Затем получаем его данные с помощью метода «getAlbumData». От этих данных нам нужно лишь содержимое ячейки «t_name» для того что бы перебросить пользователя обратно. Ну и с помощью функции «redirect» мы переносим пользователя снова на страницу просмотра фотографий.

PHP код:
function rating_inc($album_id)
{
    
$album_id intval($album_id);

    
$this->load->helper('url');
    
// Увеличение рейтинга
    
$this->Albums_model->rating_inc($album_id);
    
// Получение данных альбома
    
$album $this->Albums_model->getAlbumData($album_id);
    
// Редирект на просмотр альбома
    
redirect('/albums/album_view/'.$album['t_name']);
}

function 
rating_dec($album_id)
{
    
$album_id intval($album_id);

    
$this->load->helper('url');
    
// Уменьшение рейтинга
    
$this->Albums_model->rating_dec($album_id);
    
// Получение данных альбома
    
$album $this->Albums_model->getAlbumData($album_id);
    
// Редирект на просмотр альбома
    
redirect('/albums/album_view/'.$album['t_name']);

Вот и всё. Пользовательская часть тоже закончена.