Mesaj ve Başlıkları Harici Sayfada Göstermek

phpBB 3.x sürümlerinin kurulumu ve yönetimi ile ilgili bilgilendirici çeşitli makaleler.
Cevapla
Kullanıcı avatarı
Mirach
Destek Ekibi Lideri
Destek Ekibi Lideri
Mesajlar: 1664
Kayıt: 27.03.2006, 01:06
Konum: İstanbul

Mesaj ve Başlıkları Harici Sayfada Göstermek

Mesaj gönderen Mirach »

Yazar: Anonim
Açıklama: phpbb3 sistemlerdeki mesaj ve konuların harici bir sayfada gösterilmesini anlatan yararlı bir makale.
Makalenin orijinali: Displaying posts and topics on external pages
Türkçe çeviri: Mirach

Son mesajlar yahut konular, harici bir sayfada ya da bir sitenin anasayfasında gösterebilmek çok kullanışlı olabilir. Özetle, phpBB sistemlerin yapısal fonksiyonlarıyla bunu yapmak oldukça kolay.

Header / Başlık

İlk olarak "home.php" adında bir dosya yaratın ve klasik phpBB3 header bilgilerini ekleyin. "$phpbb_root_path" değişkeni, phpBB'nin kurulu olduğu yeri belirtmelidir. Eğer dosya (home.php), phpBB ana dizininde ise (viewtopic.php, viewforum.php ile aynı yerde ise) dosya erişimi yolunu (path './') değiştirme gereği yoktur.

phpBB'nizin "forums" klasöründe kurulu olduğunu (http://www.sitem.com/forums gibi), home.php dosyanızı ise websitenizin ana dizinine (http://www.sitem.com/home.php) koymak istediğinizi varsayaraksak "$phpbb_root_path" yolu şöyle şekil alır:

Kod: Tümünü seç

$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './forums/';
Ana dizine geri dönüş erişim yolu için ise; '../' değişkenini kullanabilirsiniz. Buna ihtiyacınız var ise -örnek olarak-; phpBB'nin ana dizinde (http://www.sitem.com), veri çekecek dosyamızın bir dosyada (http://www.sitem.com/info/home.php) konumlandığını varsayalım.

Klasik header bilgileriniz şu şekilde olacaktır:

Kod: Tümünü seç

<?php
/*
* home.php 
* Description: example file for displaying latest posts and topics
* by battye (for phpBB.com MOD Team)
* September 29, 2009
*/

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);

// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup('viewforum');
bbcode.php, son mesajlar verisi çekildiğindeki bbcode isteğini cevaplamak için içerikte belirtilir.

Functions / İşlev

Bir çok kaynaktan mesaj yahut konu çekilirken; kolaylık olma adına bir işlev, sql sorgularının şartlı olduğu yerleri kullanmaya alışıktır.

Kod: Tümünü seç

/* create_where_clauses( int[] gen_id, String type )
* This function outputs an SQL WHERE statement for use when grabbing 
* posts and topics */

function create_where_clauses($gen_id, $type)
{
global $db, $auth;

    $size_gen_id = sizeof($gen_id);

        switch($type)
        {
            case 'forum':
                $type = 'forum_id';
                break;
            case 'topic':
                $type = 'topic_id';
                break;
            default:
                trigger_error('No type defined');
        }

    // Set $out_where to nothing, this will be used of the gen_id
    // size is empty, in other words "grab from anywhere" with
    // no restrictions
    $out_where = '';

    if( $size_gen_id > 0 )
    {
    // Get a list of all forums the user has permissions to read
    $auth_f_read = array_keys($auth->acl_getf('f_read', true));

        if( $type == 'topic_id' )
        {
            $sql     = 'SELECT topic_id FROM ' . TOPICS_TABLE . '
                        WHERE ' .  $db->sql_in_set('topic_id', $gen_id) . '
                        AND ' .  $db->sql_in_set('forum_id', $auth_f_read);

            $result     = $db->sql_query($sql);

                while( $row = $db->sql_fetchrow($result) )
                {
                        // Create an array with all acceptable topic ids
                        $topic_id_list[] = $row['topic_id'];
                }

            unset($gen_id);

            $gen_id = $topic_id_list;
            $size_gen_id = sizeof($gen_id);
        }

    $j = 0;    

        for( $i = 0; $i < $size_gen_id; $i++ )
        {
        $id_check = (int) $gen_id[$i];

            // If the type is topic, all checks have been made and the query can start to be built
            if( $type == 'topic_id' )
            {
                $out_where .= ($j == 0) ? 'WHERE ' . $type . ' = ' . $id_check . ' ' : 'OR ' . $type . ' = ' . $id_check . ' ';
            }

            // If the type is forum, do the check to make sure the user has read permissions
            else if( $type == 'forum_id' && $auth->acl_get('f_read', $id_check) )
            {
                $out_where .= ($j == 0) ? 'WHERE ' . $type . ' = ' . $id_check . ' ' : 'OR ' . $type . ' = ' . $id_check . ' ';
            }    

        $j++;
        }
    }

    if( $out_where == '' && $size_gen_id > 0 )
    {
        trigger_error('A list of topics/forums has not been created');
    }

    return $out_where;
}
Forum and topic information / Forum ve Başlık Bilgileri

Şimdi, bazı forum ve başlıkların ID numaralarını script boyunca içeriğe ekleyeceğiz. $forum_id ve $topic_id değişkenlerinin her ikisinin de dizi değerlerinin (array) kullanılabilirliği vardır. $forum_id_where ve $topic_id_where değişkenleri, create_where_clauses fonksiyonunun hangi veritabanı sorgusunu sadeleştireceği anlamına gelir.

$search_limit, çekilmesini istediğiniz sıranın numarasıdır. Yani son 5 mesajın çekilmesini istiyorsanız, $search_limit değerini 5'e eşitlemelisiniz.

Kod: Tümünü seç

$search_limit = 5;

    $forum_id = array(2, 5);
    $forum_id_where = create_where_clauses($forum_id, 'forum');

    $topic_id = array(20, 50);
    $topic_id_where = create_where_clauses($topic_id, 'topic');
Database calls / Veritabanı Çağrıları

Bir kaç alıştırma yapalım.
  • Belirtilen forumdan son başlıkları göstermek
    İlk alıştırma forumdan seçilen "son 5 başlık" ı içeriyor.
    Not : Örnek olarak http://www.bilvardsforum.se adresini ziyaret edebilirsiniz. (İsveççe)

    - Belirtilen forumdan son başlıkları göstermek -

    Kod: Tümünü seç

    $topics = 'SELECT * FROM ' . TOPICS_TABLE . '
                ' . $forum_id_where . '
                  AND topic_status <> ' . ITEM_MOVED . '
                  AND topic_approved = 1
                ORDER BY topic_id DESC';
    
       $topics_result = $db->sql_query_limit($topics, $search_limit);
    
          while( $topics_row = $db->sql_fetchrow($topics_result) )
          {
             $topic_title       = $topics_row['topic_title'];
             $topic_author       = get_username_string('full', $topics_row['topic_poster'], $topics_row['topic_first_poster_name'], $topics_row['topic_first_poster_colour']);
             $topic_date       = $user->format_date($topics_row['topic_time']);
             $topic_last_post    = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $topics_row['forum_id'] . '&t=' . $topics_row['topic_id'] . '&p=' . $topics_row['topic_last_post_id']) . '#p' . $topics_row['topic_last_post_id'];
             $topic_last_author    = get_username_string('full', $topics_row['topic_last_poster_id'], $topics_row['topic_last_poster_name'], $topics_row['topic_last_poster_colour']);
             $topic_link       = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $topics_row['forum_id'] . '&t=' . $topics_row['topic_id']);
    
             $template->assign_block_vars('announcements', array(
             'TOPIC_TITLE'       => censor_text($topic_title),
             'TOPIC_AUTHOR'       => $topic_author,
             'TOPIC_DATE'       => $topic_date,
             'TOPIC_LAST_POST'    => $topic_last_post,
             'TOPIC_LAST_AUTHOR' => $topic_last_author,
             'TOPIC_LINK'       => $topic_link,
             ));
          }
  • Son 5 başlığın ilk mesajını göstermek

    Şimdiki çalışmamız son beş başlığın her birinin ilk mesajını ayıklamayı içeriyor. Bu da neredeyse aynı kodlardan oluşuyor lakin bu sefer bizi bekleyen ekstra olarak mesaj text'lerinin ve mevcut bbcode'ların çekimi. Mesaj ve başlıkların nasıl aynı SQL sorgusunda yer aldığına dikkat edin, by doing a left join it means you do not have to include a second database query when looping through the results of the initial query.

    Örnek olarak 2 ve 4'e bakalım. Yeni bir bbcode objesinin nasıl yapılandırıldığına ve ilişkili işlevlerin mesaj textlerini başarılı bir şekilde ayrıştırılmasına bakın.

    NOT : http://www.cricketmx.com (İngilizce) sitesinde görülen kodların bir örneği.

    - Son 5 Başlığın ilk mesajını göstermek -

    Kod: Tümünü seç

    $posts_ary = array(
            'SELECT'    => 'p.*, t.*',
        
            'FROM'      => array(
                POSTS_TABLE     => 'p',
            ),
        
            'LEFT_JOIN' => array(
                array(
                    'FROM'  => array(TOPICS_TABLE => 't'),
                    'ON'    => 't.topic_first_post_id = p.post_id'
                )
            ),
        
            'WHERE'     => str_replace( array('WHERE ', 'forum_id'), array('', 't.forum_id'), $forum_id_where) . '
                            AND t.topic_status <> ' . ITEM_MOVED . '
                            AND t.topic_approved = 1',
        
            'ORDER_BY'  => 'p.post_id DESC',
        );
        
        $posts = $db->sql_build_query('SELECT', $posts_ary);
    
       $posts_result = $db->sql_query_limit($posts, $search_limit);
    
          while( $posts_row = $db->sql_fetchrow($posts_result) )
          {
             $topic_title       = $posts_row['topic_title'];
             $topic_author       = get_username_string('full', $posts_row['topic_poster'], $posts_row['topic_first_poster_name'], $posts_row['topic_first_poster_colour']);
             $topic_date       = $user->format_date($posts_row['topic_time']);
             $topic_link       = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $posts_row['forum_id'] . '&t=' . $posts_row['topic_id']);
    
             $post_text = nl2br($posts_row['post_text']);
    
             $bbcode = new bbcode(base64_encode($bbcode_bitfield));         
             $bbcode->bbcode_second_pass($post_text, $posts_row['bbcode_uid'], $posts_row['bbcode_bitfield']);
    
             $post_text = smiley_text($post_text);
    
             $template->assign_block_vars('announcements', array(
             'TOPIC_TITLE'       => censor_text($topic_title),
             'TOPIC_AUTHOR'       => $topic_author,
             'TOPIC_DATE'       => $topic_date,
             'TOPIC_LINK'       => $topic_link,
             'POST_TEXT'         => censor_text($post_text),
             ));
          }
  • Belirli başlıklardan mesajlar göstermek

    Üçüncü örneğimiz seçilmiş bir başlık ya da başlıkların son mesajlarının gösterimini kapsıyor.

    NOT: Bir örneğini http://www.tokiohotelfans.se (İsveççe) adresinde görebilirsiniz.

    - Belirli başlıklardan mesajlar göstermek -

    Kod: Tümünü seç

    $posts_ary = array(
            'SELECT'    => 'p.*, t.*, u.username, u.user_colour',
        
            'FROM'      => array(
                POSTS_TABLE     => 'p',
            ),
        
            'LEFT_JOIN' => array(
                array(
                    'FROM'  => array(USERS_TABLE => 'u'),
                    'ON'    => 'u.user_id = p.poster_id'
                ),
                array(
                    'FROM'  => array(TOPICS_TABLE => 't'),
                    'ON'    => 'p.topic_id = t.topic_id'
                ),
            ),
        
            'WHERE'     =>  str_replace( array('WHERE ', 'topic_id'), array('', 't.topic_id'), $topic_id_where) . '
                            AND t.topic_status <> ' . ITEM_MOVED . '
                             AND t.topic_approved = 1',
        
            'ORDER_BY'  => 'p.post_id DESC',
        );
        
        $posts = $db->sql_build_query('SELECT', $posts_ary);
    
       $posts_result = $db->sql_query_limit($posts, $search_limit);
    
          while( $posts_row = $db->sql_fetchrow($posts_result) )
          {
             $topic_title       = $posts_row['topic_title'];
             $post_author       = get_username_string('full', $posts_row['poster_id'], $posts_row['username'], $posts_row['user_colour']);
             $post_date          = $user->format_date($posts_row['post_time']);
             $post_link       = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $posts_row['forum_id'] . '&t=' . $posts_row['topic_id'] . '&p=' . $posts_row['post_id']) . '#p' . $posts_row['post_id'];
    
             $post_text = nl2br($posts_row['post_text']);
    
             $bbcode = new bbcode(base64_encode($bbcode_bitfield));         
             $bbcode->bbcode_second_pass($post_text, $posts_row['bbcode_uid'], $posts_row['bbcode_bitfield']);
    
             $post_text = smiley_text($post_text);
    
             $template->assign_block_vars('announcements', array(
             'TOPIC_TITLE'       => censor_text($topic_title),
             'POST_AUTHOR'       => $post_author,
             'POST_DATE'       => $post_date,
             'POST_LINK'       => $post_link,
             'POST_TEXT'         => censor_text($post_text),
             ));
          }
  • Herhangi bir yerden mesaj göstermek
Ve son olarak, tüm forumdan kısıtlama olmaksızın son mesajların gösterimi.

Tek fark;

Kod: Tümünü seç

' . str_replace('topic_id', 't.topic_id', $topic_id_where) . '
sırasının silimi.
Bir sql_in_set komutu ile yer değiştirerek kısıtlamaların, kullanıcıların yetkilerinin ortak olduğu alanlarda sonuca gitmesini sağlar.

NOT: Bir örneği http://www.rmcgirr83.org/ (İngilizce) adresinde görülebilir.

- Herhangi bir yerden mesaj göstermek -

Kod: Tümünü seç

$posts_ary = array(
        'SELECT'    => 'p.*, t.*, u.username, u.user_colour',
    
        'FROM'      => array(
            POSTS_TABLE     => 'p',
        ),
    
        'LEFT_JOIN' => array(
            array(
                'FROM'  => array(USERS_TABLE => 'u'),
                'ON'    => 'u.user_id = p.poster_id'
            ),
            array(
                'FROM'  => array(TOPICS_TABLE => 't'),
                'ON'    => 'p.topic_id = t.topic_id'
            ),
        ),
    
        'WHERE'     => $db->sql_in_set('t.forum_id', array_keys($auth->acl_getf('f_read', true))) . '
                        AND t.topic_status <> ' . ITEM_MOVED . '
                         AND t.topic_approved = 1',
    
        'ORDER_BY'  => 'p.post_id DESC',
    );
    
    $posts = $db->sql_build_query('SELECT', $posts_ary);

   $posts_result = $db->sql_query_limit($posts, $search_limit);

      while( $posts_row = $db->sql_fetchrow($posts_result) )
      {
         $topic_title       = $posts_row['topic_title'];
         $post_author       = get_username_string('full', $posts_row['poster_id'], $posts_row['username'], $posts_row['user_colour']);
         $post_date          = $user->format_date($posts_row['post_time']);
         $post_link       = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $posts_row['forum_id'] . '&t=' . $posts_row['topic_id'] . '&p=' . $posts_row['post_id']) . '#p' . $posts_row['post_id'];

         $post_text = nl2br($posts_row['post_text']);

         $bbcode = new bbcode(base64_encode($bbcode_bitfield));         
         $bbcode->bbcode_second_pass($post_text, $posts_row['bbcode_uid'], $posts_row['bbcode_bitfield']);

         $post_text = smiley_text($post_text);

         $template->assign_block_vars('announcements', array(
         'TOPIC_TITLE'       => censor_text($topic_title),
         'POST_AUTHOR'       => $post_author,
         'POST_DATE'       => $post_date,
         'POST_LINK'       => $post_link,
         'POST_TEXT'         => censor_text($post_text),
         ));
      }
Footer and conclusion / Alt ve Sonuç Bölümü

SQL sorgularını düzenleyerek, "Mesaj ve Başlıkları Harici Sayfada Göstermek" adına örneklerin neredeyse tüm çalışmalarını başarılı bir şekilde çalıştırabildik.

Tema değişkenlerini kullanarak da elde edilen sonuçları bir phpBB3 sayfası görüntüsüyle birleştirebilirsiniz. Bunu yapmak için örnekte olduğu gibi sayfanın sonunu getirmeli, ortak bir phpBB3 tema dosyası (.html) oluşturmalısınız. Bilgiden öte tema yapısı için phpBB wiki page on template syntax.(İngilizce) sayfasına bir göz gezdirin.

Kod: Tümünü seç

page_header('External page');

    $template->set_filenames(array(
        'body' => 'external_body.html'
    ));

    page_footer();
ÖNEMLİ NOT: Bu makale phpBB Türkiye ekibi tarafından türkçeleştirilmiştir ve kaynak gösterilmeden hiç bir yerde yayınlanamaz. Kaynak göstermek için bu sayfanın bağlantısını ya da sitemizin web adresini kullanınız.
Profilinde phpBB forumunun adresini girmemiş üyelere ve kurallara aykırı şekilde açılmış başlıklara destek verilmez.
Resim Resim Resim
Cevapla

“phpBB3 Makaleleri” sayfasına dön

Kimler çevrimiçi

Bu forumu görüntüleyen kullanıcılar: Hiç bir kayıtlı kullanıcı yok ve 3 misafir