Skocz do zawartości
"Idzie nowe..." - o zmianach i nie tylko ×
Przeniesienie zakupów z IPS Marketplace / Moving bought items from IPS Marketplace ×

ROZWIĄZANY: [HSC] Recent Posts (Sidebar Block) - rozwinięcie funkcjonalności


mauris

Rekomendowane odpowiedzi

Zacznę od powitania wszystkich użytkowników, tworzycie bardzo fajne forum, wiele się z niego nauczyłem :)

Przyszedł jednak czas, gdy admin zaczyna mieć zachciewanki na które nie ma odpowiedzi (albo admin słabo szuka :P)

Zainstalowałem hook z tematu i wszystko jest fajnie, tylko chciał bym, żeby miał on możliwość pokazywania które z nowych postów nie były jeszcze przeczytane.

Próbowałem dodawać $topic['hasUnreadPosts'] w template dodatku, ale widocznie ta instancja nie jest załadowana, bo nic nie zwraca.

Szukałem po ipsRegistry, ale nie mogłem znaleźć jak wydobyć dane o przeczytanych tematach, a wolałem nie kombinować metodą prób i błędów ^^

No i po wielu nieudanych próbach postanowiłem w końcu zapytać specjalistów :)

Dodam, że szybko pojmuję i z pewnością ogarnę zagmatwane tłumaczenia, więc nie musicie pisać wykładu :)

Interesuje mnie tylko co dodać w pliku klasy, żebym w template mógł użyć $topic['hasUnreadPosts'].

No chyba, że jest jakieś inne obejście tego bez modyfikowania klasy hooka.

Pozdrawiam!

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

$topic['hasUnreadPosts'] = ( $this->registry->classItemMarking->isRead( array( 'forumID' => $topic['forum_id'], 'itemID' => $topic['tid'], 'itemLastUpdate' => $topic['last_post'] ), 'forums' ) ) ? false : true;

Dasz radę dalej? :P

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

dzięki za szybką odp :)

jednak trochę się przeceniłem xD

foreach($topics as $id => $t)
	{
		if($this->settings['hsc_rp_post']!='N')
			$topics[$id]['post'] = $this->_formatPost($t['post']);

		$topics[$id]['start_date'] = $this->_formatDate($t['start_date']);
		$topics[$id]['last_post'] = $this->_formatDate($t['last_post']);
         /* ------- IS READ -------- */
      $topics[$id]['hasUnreadPosts'] = ( $this->registry->classItemMarking->isRead( array( 'forumID' => $topics[$id]['forum_id'], 'itemID' => $topics[$id]['tid'], 'itemLastUpdate' => $topics[$id]['last_post'] ), 'forums' ) ) ? false : true;

	}

próbowałem dodawać w kilku miejscach, twój kod, ale nadal nic nie zwraca :/

próbowałem też dodać w w/w pętli trochę zmodyfikowany kod... ale też nic :(

Edytowane przez mauris
Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

A jak się potem w skinie do tego odwołujesz?

I to ma być jak już to tak:

 $topics[$id]['hasUnreadPosts'] = ( $this->registry->classItemMarking->isRead( array( 'forumID' => $t['forum_id'], 'itemID' => $t['tid'], 'itemLastUpdate' => $['last_post'] ), 'forums' ) ) ? false : true;

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

"Konstruktor" wygląda tak:

public function __construct()
   {
    $this->registry = ipsRegistry::instance();
    $this->DB = $this->registry->DB();
    $this->settings =& $this->registry->fetchSettings();
    $this->memberData =& $this->registry->member()->fetchMemberData();

   }

Zapytanie pobierające tematy:

$query = array('select' => 't.*',
				    'from' => array('topics' => 't'),
				    'where' => "t.state='open' and t.approved=1 and t.forum_id in (".implode(",",$forumIds).")",
				    'order' => 't.last_post desc',
				    'limit' => array(0,$this->settings['hsc_rp_limit']));

więc chyba ma wszystko...

Odnośnik do komentarza
Udostępnij na innych stronach

No zapewne ma wartość null, nie wiem jak sprawdzić, czy to null i skrypt kompletnie nie działa, czy to false...

[update]

dodałem linijkę w w/w pętli foreach

echo $this->registry->classItemMarking->isRead( array( 'forumID' => $t['forum_id'], 'itemID' => $t['tid'], 'itemLastUpdate' => $t['last_post'] ), 'forums' );

"wyechowanie"

$topics[$id]['hasUnreadPosts']

też zwraca poprawne wyniki

tak, wiem, że profesjonalnie to sprawdziłem, ale grunt, że wiem xD

i działa. Mi zwraca 5 x "1", bo mam wszystko przeczytane, innemu uzytkownikowi zwróciło tylko 2x "1".

Tak więc to może wina template?

Edytowane przez mauris
Odnośnik do komentarza
Udostępnij na innych stronach

<div class='ipsSideBlock'>
<h3>{$this->lang->words['recentposts_title']}</h3>
   <div class='_sbcollapsable'>
 <foreach loop="posts:$recentPosts as $post">
	    <div class='ipsBox_container ipsPad'>
	    <a href='{parse url="showtopic={$post['tid']}" base="public" seotitle="{$post['title_seo']}" template="showtopic"}'><b>{$post['title']}</b></a> <a href='{parse url="showtopic={$post['tid']}&view=getlastpost" base="public" template="showtopic" seotitle="{$post['title_seo']}"}' title='{$this->lang->words['view_last_post']}'>{parse replacement="f_lastpost"}</a>
<br/>
<if test="$topics['hasUnreadPosts']==0">Aloha</if>
	    <if test="forum:|:$this->settings['hsc_rp_showforum'] == 1">
	    {$this->lang->words['forum']}: <a href='{parse url="showforum={$post['forum_id']}" base="public" seotitle="{$post['forum_name_seo']}" template="showforum"}'>{$post['forum_name']}</a>
	    <br/>
	    </if>
	    <if test="starterInfo:|:$this->settings['hsc_rp_start'] == 1">
	    {$this->lang->words['started_by']}: <a href='{parse url="showuser={$post['starter_id']}" base="public" seotitle="{$post['seo_first_name']}" template="showuser"}'>{$post['starter_name']}</a> <span class='date'>({$post['start_date']})</span>
	    <br/>
	    </if>
	    <if test="firstPost:|:$this->settings['hsc_rp_post'] == 'F'">
	    {$post['post']}
	    <br/>
	    </if>
	    <if test="views:|:$this->settings['hsc_rp_views'] == 1">
	    {$this->lang->words['views']}: {parse format_number="$post['views']"}   {$this->lang->words['replies']}: {parse format_number="$post['posts']"}
	    <br/>
	    </if>
	    <if test="lastPostInfo:|:$this->settings['hsc_rp_last'] == 1">
	    {$this->lang->words['last_reply']}: <a href='{parse url="showuser={$post['last_poster_id']}" base="public" seotitle="{$post['seo_last_name']}" template="showuser"}'>{$post['last_poster_name']}</a> <span class='date'>({$post['last_post']})</span>
	    <br/>
	    </if>
	    <if test="lastPost:|:$this->settings['hsc_rp_post'] == 'L' and $post['post']">
	    {$post['post']}
	    </if>
	    </div>
 </foreach>
  </div>
</div>
<br />

<?php
/*
+--------------------------------------------------------------------------
|   [HSC] Recent Posts (Sidebar Block) 1.0.0.0
|   =============================================
|   by Esther Eisner
|   Copyright 2011 HeadStand Consulting
|   [email protected]
+--------------------------------------------------------------------------
*/
if ( ! defined( 'IN_IPB' ) )
{
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded 'admin.php'.";
exit();
}
class boardIndexRecentPosts
{
   public function __construct()
   {
    $this->registry = ipsRegistry::instance();
    $this->DB = $this->registry->DB();
    $this->settings =& $this->registry->fetchSettings();
    $this->memberData =& $this->registry->member()->fetchMemberData();

   }

   public function getOutput()
   {
    if($this->settings['hsc_rp_groups']!='' && !in_array($this->memberData['member_group_id'],explode(",",$this->settings['hsc_rp_groups'])))
	    return '';

    $topics = $this->_getTopics();
    if(!is_array($topics) || !count($topics))
	    return '';

    foreach($topics as $id => $t)
    {
	    if($this->settings['hsc_rp_post']!='N')
		    $topics[$id]['post'] = $this->_formatPost($t['post']);

	    $topics[$id]['start_date'] = $this->_formatDate($t['start_date']);
	    $topics[$id]['last_post'] = $this->_formatDate($t['last_post']);

	    /* ------- IS READ -------- */
	    $topics[$id]['hasUnreadPosts'] = ( $this->registry->classItemMarking->isRead( array( 'forumID' => $t['forum_id'], 'itemID' => $t['tid'], 'itemLastUpdate' => $t['last_post'] ), 'forums' ) ) ? false : true;

    }

    return $this->registry->output->getTemplate('boards')->recentPosts($topics);
   }

   private function _getTopics()
   {
    $forumIds = $this->_loadForumIds();
    if(!is_array($forumIds) || !count($forumIds))
	    return '';

    $query = array('select' => 't.*',
				    'from' => array('topics' => 't'),
				    'where' => "t.state='open' and t.approved=1 and t.forum_id in (".implode(",",$forumIds).")",
				    'order' => 't.last_post desc',
				    'limit' => array(0,$this->settings['hsc_rp_limit']));

    $query['add_join'][] = array('select' => 'f.name as forum_name, f.name_seo as forum_name_seo', 'from' => array('forums' => 'f'), 'where' => 't.forum_id=f.id', 'type' => 'left');

    if ($this->settings['hsc_rp_post'] == 'F')
    {
	    $query['add_join'][] = array('select' => 'p.pid, p.post',
								    'from' => array('posts' => 'p'),
								    'where' => 't.topic_firstpost=p.pid',
								    'type' => 'left');
    }

    $this->DB->build($query);
    $tQuery = $this->DB->execute();
    while($t = $this->DB->fetch($tQuery))
    {
	    if($this->settings['hsc_rp_post']=='L')
	    {
		    $post = $this->DB->buildAndFetch(array('select' => 'pid,post', 'from' => 'posts', 'where' => 'topic_id='.$t['tid'],
						    'order' => 'post_date desc', 'limit' => array(0,1)));
		    $t = array_merge($t,$post);
	    }
	    $topics[] = $t;
    }

    return $topics;
   }

   private function _formatPost($post)
   {
    // Strip out line breaks or the regex does not work
    $post = preg_replace('/[\n\r]/i','',$post);

    // Strip out quotes
    $post = preg_replace('/\[quote(.*?)\[\/quote\]/i','',$post);

    // Strip out emoticon images
    $post = preg_replace('/<img(.*?)\/>/i','',$post);

    // Strip out other images
    $post = preg_replace('/\[img(.*?)\[\/img\]/i','',$post);

    $post = $this->_parseBBCode($post);

    if($this->settings['hsc_rp_postlimit'] > 0 && strlen($post) > $this->settings['hsc_rp_postlimit'])
	    $post = IPSText::truncate($post, $this->settings['hsc_rp_postlimit']);

    $post = strip_tags($post);
    return $post;
   }

   private function _formatDate($date)
   {
    return $this->registry->class_localization->getDate( $date, SHORT );
   }

   private function _parseBBCode($post)
   {
    IPSText::stripAttachTag($post);

    IPSText::getTextClass( 'bbcode' )->parse_smilies   = 1;
    IPSText::getTextClass( 'bbcode' )->parse_html    = 1;
 IPSText::getTextClass( 'bbcode' )->parse_nl2br    = 1;
 IPSText::getTextClass( 'bbcode' )->parse_bbcode    = 1;
 IPSText::getTextClass( 'bbcode' )->parsing_section   = 'topics';
 IPSText::getTextClass( 'bbcode' )->parsing_mgroup   = $this->memberdata['member_group_id'];
 IPSText::getTextClass( 'bbcode' )->parsing_mgroup_others = $this->memberData['mgroup_others'];

 return IPSText::getTextClass('bbcode')->preDisplayParse( $post );
   }

   private function _loadForumIds()
   {
    $forums = $this->registry->getClass('class_forums')->fetchSearchableForumIds();

    if ($this->settings['hsc_rp_forums'] != '')
    {
	    foreach(explode(",",$this->settings['hsc_rp_forums']) as $f)
	    {
		    if(in_array($f,$forums))
			    $forumIds[] = $f;
	    }
	    if(!is_array($forumIds) || !count($forumIds))
		    return;

	    return $forumIds;
    }

    return $forums;
   }
}
?>

Proszę :D i dziękuję za tak szybką i miłą pomoc :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

  <foreach loop="posts:$recentPosts as $post">
                   <div class='ipsBox_container ipsPad'>
                   <a href='{parse url="showtopic={$post['tid']}" base="public" seotitle="{$post['title_seo']}" template="showtopic"}'><b>{$post['title']}</b></a> <a href='{parse url="showtopic={$post['tid']}&view=getlastpost" base="public" template="showtopic" seotitle="{$post['title_seo']}"}' title='{$this->lang->words['view_last_post']}'>{parse replacement="f_lastpost"}</a>
<br/>
<if test="$topics['hasUnreadPosts']==0">Aloha</if>

Masz pętle z $post, więc daj:

<if test="$post['hasUnreadPosts']==0">Aloha</if>

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

Problem ROZWIĄZANY. Jeśli są jakiekolwiek wątpliwości, pytania proszę o założenie nowego tematu.

Wszelkie uzasadnione reklamacje/pretensje/sugestie/rady przyjmuje ekipa forum.

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.