Чем могу- помогу

RSS лента
Автор блога: Александр
Рубрики:
Все рубрики (10)
Личный фотоальбом. Рейтинг фото.
+10
Прозвучал вопрос на форуме:

P.S. Ещё б если можно было рейтинг им добавлять как в тех фотографиях, которые в фотоальбомах, то вообще б замечательно было бы

РИСКНЕМ?

Лично мне не понравилось что во время загрузки в базу не пишет точное время в часах\мин.
При выводе даты сегодняшних или вчерашних фото функцией dateformat(), пишет типа "Вчера в :" "Сегодня в:"
В фотоальбомах (не личные) - все в норме.

Для того чтоб исправить это необходимо поменять тип столбца

Код PHP:
ALTER TABLE cms_user_photos CHANGE pubdate pubdate datetime
Предупреждаю сразу - если фото уже грузили, то его время подпишется 00.00 и вывод будет "Вчера в : 00.00"
Но если загрузить после данной операции, будет "Сегодня в: 23.54"



Теперь откроем components\users\frontend.php


Где-то между скобками

Код PHP:
/////////////////////////////// VIEW PHOTO ////////////
if ($do=='viewphoto'){
..........
........
......

}
///////////////////////////////////////////////////////


Будут такие строки:


Код PHP:
if ($myprofile || $inCore->userIsAdmin($user_id)) {
 echo '<div style="margin-top:5px">';
  echo '<a style="height:16px; line-height:16px; margin-right:5px; padding-left:20px; background:url(/components/users/images/edit.gif) no-repeat;" href="/users/'.$usr['id'].'/editphoto'.$photoid.'.html">'.$_LANG['EDIT'].'</a> ';
  echo '<a style="height:16px; line-height:16px; padding-left:20px; background:url(/components/users/images/delete.gif) no-repeat;"  href="/users/'.$usr['id'].'/delphoto'.$photoid.'.html">'.$_LANG['DELETE'].'</a> ';
 echo '</div>';
}

ИХ УДАЛЯЕМ.


Чуть ниже ПЕРЕД строчкой:

Код PHP:
					$inCore->loadLib('tags');

Вставим вот этот блок:

Код PHP:
                    //Вывод голосования за фото
                    $inCore->loadLib('karma');

    	            	echo '<div class="photo_bar">';
			           	echo '<table width="" cellspacing="0" cellpadding="4" align="center"><tr>';
				     	echo '<td width=""><strong>Добавлена:</strong> '.$inCore->dateformat($photo['pubdate']).'</td>';

					$karma = cmsKarma('userphoto', $photo['id']);

					echo '<td width=""><strong>'.$_LANG['HITS'].': </strong> '.$photo['hits'].'</td>';
					echo '<td width=""><strong>'.$_LANG['RATING'].': </strong><span id="karmapoints">'.cmsKarmaFormatSmall($karma['points']).'</span></td>';
					
					echo '<td width="">'.cmsKarmaButtons('userphoto', $photo['id']).'</td>';
					if ($myprofile || $inCore->userIsAdmin($user_id)) {
						echo '<td  width="">';
							echo '<a style="height:16px; line-height:16px; margin-right:5px; padding-left:20px; background:url(/components/users/images/edit.gif) no-repeat;" href="/users/'.$usr['id'].'/editphoto'.$photoid.'.html">'.$_LANG['EDIT'].'</a> ';
							echo '<a style="height:16px; line-height:16px; padding-left:20px; background:url(/components/users/images/delete.gif) no-repeat;"  href="/users/'.$usr['id'].'/delphoto'.$photoid.'.html">'.$_LANG['DELETE'].'</a> ';
						echo '</td>';
					}
			     	echo '</tr></table>';
		        	echo '</div>';					
					//конец вывода голосования за фото

Все. Теперь в личных фотоальбомах будет возможность проголосовать за фото как это
реализованно в общем фотоальбоме.


5 Сентября 2010

Маленькое дополнение:
Для того, чтоб при голосе + - за фото пересчитывался рейтинг пользователя, необходимо
сделать еще один запрос.


Код PHP:
INSERT INTO cms_rating_targets(id, target, component,is_user_affect, user_weight, target_table, target_title) 
       values('', 'userphoto', 'users', '1', '5', 'cms_user_photos', 'Личное фото')

5 сентября. Вечер.

Подумал что как-то неправильно что рейтинг можно просто посмотреть. Толку от него???
Короче. Набросал на скорую руку модуль "Популярные фотографии пользователей".

Кому надо - забирайте. Скачать Архив

Внутри архива инструкция по установке.





Еще одно маленькое дополнение.

Справедливо замечено, что в ленте тоже должны отображаться фото друзей.

Для этого в core\classes\user.class.php найдем функцию (public static function getUserFriendsPhotos)
и сразу за ней добавим такую:

Код PHP:
    /**
     * Возвращает последние личные фотографии друзей
     * @param int $user_id
     * @param int $limit
     * @return array
     */
    public static function getUserFriendsUserPhotos($user_id, $limit=10){

        $inDB           = cmsDatabase::getInstance();
        $inCore         = cmsCore::getInstance();

        $friends        = self::getFriends($user_id);

        if (!$friends) { return false; }

        $friends_sql    = '';

        foreach($friends as $id=>$friend){
            $friends_sql .= 'u.id = '.$friend['id'];
            if ($id < sizeof($friends)-1){ $friends_sql .= ' OR '; }
        }


          $sql = "SELECT DISTINCT p.id, p.title, p.user_id, u.id as user_id, u.nickname as nickname, u.login as login,
                       IF(DATE_FORMAT(p.pubdate, '%d-%m-%Y')=DATE_FORMAT(NOW(), '%d-%m-%Y'), DATE_FORMAT(p.pubdate, '<strong>Cегодня</strong> в %H:%i'),
                       IF(DATEDIFF(NOW(), p.pubdate)=1, DATE_FORMAT(p.pubdate, 'Вчера в %H:%i'),DATE_FORMAT(p.pubdate, '%d, %M') ))  as pubdate
                FROM cms_user_photos p, cms_users u
                WHERE p.user_id = u.id AND  ({$friends_sql})
                ORDER BY p.pubdate DESC
                ";

        if ($limit) { $sql .= 'LIMIT '.$limit; }

        $result = $inDB->query($sql);

        $photos = array();

        if (!$inDB->num_rows($result)){ return false; }

        while ($photo = $inDB->fetch_assoc($result)){
            $photo['pubdate'] = $inCore->getRusDate($photo['pubdate']);
            $photos[] = $photo;
        }

        return $photos;

    }

// ============================================================================ //
// ============================================================================ //

Теперь перейдем в components\users\frontend.php в рзделе
Код PHP:
/////////////////////////////// VIEW PROFILE //////
if ($do=='profile'){

...........
.........
.......

}
После строчки

Код PHP:
        $usr['friends_photos']  = cmsUser::getUserFriendsPhotos($usr['id']);
Добавим такую:

Код PHP:
        $usr['friends_user_photos']  = cmsUser::getUserFriendsUserPhotos($usr['id']);

И наконец, в шаблоне в com_users_profile.tpl (Закладка 2)

Вместо строки

Код PHP:
 {if $usr.friends_photos} 
Напишем

Код PHP:
{if $usr.friends_photos || $usr.friends_user_photos}
И после строк

Код PHP:
                               
                                        {foreach key=tid item=photo from=$usr.friends_photos}
                                            <tr>
                                                <td class="date">
                                                    {$photo.pubdate}
                                                </td>
                                                <td>
                                                    <a href="{profile_url login=$photo.login}" class="nickname">{$photo.nickname}</a> →
                                                    <a href="/photos/photo{$photo.id}.html">{$photo.title}</a>
                                                </td>                                                
                                            </tr>
                                        {/foreach}
Добавим вывод личных фото

Код PHP:
                                        {foreach key=tid item=photo from=$usr.friends_user_photos}
                                            <tr>
                                                <td class="date">
                                                    {$photo.pubdate}
                                                </td>
                                                <td>
                                                    <a href="{profile_url login=$photo.login}" class="nickname">{$photo.nickname}</a> →
                                                    <a href="/users/{$photo.user_id}/photo{$photo.id}.html">{$photo.title}</a>
                                                </td>
                                            </tr>
                                        {/foreach}

Вроде ничего не забыл. Все.
Личные сообщения + Друзья+AJAX
+18
Один мой друг просил сделать отправку личных сообщений на AJAX.
Полностью с ним согласен.

Вот был бы программистом, обязательно забомбил что-то крутое и навороченное,
а пока я только учусь. Однако, не хочется разочаровывать одного товарища, который очень уж настойчиво просил
реализовать такую функцию. А вдруг для кого-нибудь еще мое творчество пригодится???

В общем к делу.

Реализована отправка личных сообщений и добавление друзей во всплывающих окнах с AJAX отправкой на сервер.

Очень хотелось бы услышать предложения по улучшению или сообщения об ошибках.


Как прикрутить?

1) Качаем АРХИВ. Копируем файлы...

2) В templates\_default_\css\styles.css добавим новые стили всплывающего окна:

Код PHP:
/* Всплывающее окошко */
#popup_container{font-family:Arial, sans-serif;font-size:12px;width: 380px;background:#FFF;border:solid 5px #a5bede;color:#000}
#popup_title{font-size:13px;font-weight:bold;color:white;line-height:1;margin:0;background:#6D84B4 none repeat scroll 0 0;border:1px solid #3B5998;padding:6px;position:relative}
#popup_content{border-left:1px solid #aaa;border-right:1px solid #aaa;border-bottom:1px solid #aaa;padding:0em;margin:0em}
#popup_message{padding:10px 30px 10px 30px}
#popup_panel{text-align:right;background:#f2f2f2;border-top:1px solid #ccc;margin:0;padding:3px;padding-right:10px;}
#popup_prompt{margin: .5em 0em}

3) В шаблоне страницы профиля ищем строки

Код PHP:
{* ==================меню в профиле======== *}
							<div id="usermenu" style="text-align:center;">
                            <div class="usr_profile_menu">
...................
.....................
.........................
....

И правим код до такого состояния:  

Код PHP:
{* ===============================меню в профиле================================================= *}
							<div id="usermenu" style="text-align:center;">
                            <div class="usr_profile_menu">
              <input type="hidden" name="nickname" value="{$usr.nickname}" />             
							<table cellpadding="0" cellspacing="1" align="center" style="margin-left:auto;margin-right:auto"><tr>
							{if !$myprofile}
							<td><a id="newmess" href="/users/{$usr.id}/sendmessage.html" title="{$LANG.WRITE_MESS}"><img src="/components/users/images/profilemenu/message.gif" border="0"/></a></td>
							{/if}
                            {if !$myprofile && $cfg.sw_friends}
                            	{if !$usr.isfriend}
                                	{if !$usr.isfriend_not_add}
                                	<td><a id="friends" href="/users/{$usr.id}/friendship.html" title="{$LANG.ADD_TO_FRIEND}"><img src="/components/users/images/profilemenu/friends.gif" border="0"/></a></td>
                                    {else}
                                    <td><a href="/users/{$usr.id}/nofriends.html" title="{$LANG.STOP_FRIENDLY}"><img src="/components/users/images/profilemenu/nofriends.gif" border="0"/></a></td>
                                	{/if}
                                {else}
                                <td><a href="/users/{$usr.id}/nofriends.html" title="{$LANG.STOP_FRIENDLY}"><img src="/components/users/images/profilemenu/nofriends.gif" border="0"/></a>
                                {/if}
                            {/if}

4) Заключительный маневр.

Вверху в этом же файле подключим скрипт из архива:

Код PHP:
{add_js file="components/users/js/popup.js"}

Чистим кэш.

Проверяем...
Стена пользователя AJAX
+15
Набросал на скорую руку очередную поправку к оф. релизу. Может кому пригодится.
(Возможно уже кто-нибудь описывал такую тему, тогда я извиняюсь.)

Смысл вот в чем:

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

-считаю это нужно делать с применением AJAX.

-удаление сообщений тоже доверим ему...




Так. С чего начать?
Нет. Много объяснять... Кому на самом деле интересно - разберется сам.


Вот ССЫЛКА, скопируйте с заменой, и все.
Да предупреждение. Сделайте копии своих файлов которые будем менять. Предъявы не принимаются!!!

И еще. Проверял под ver.1.6.2. и дефолтный шаблон! Если у Вас свой шаблон,
то файлы из папки _default_/components(в архиве)необходимо сверить с Вашими
в одноименной папке (components) и поправить.

Вроде ничего не забыл. А вот! Чистим папку cache.

Жду комментариев.

26 июня 2010
Обновил архив. Суть исправлений в добавлении возможности забубенить на стену сообщение с отключенным JavaScript.
Кстати в стандартной комплектации нет такой возможности!!! А если я с мобилки зашел на сайт?
А если в браузере отключен Java...
Считаю что нужно предусмотреть такой поворот событий, тем более в components\users\frontend.php остались строчки,
отвечающие за добавление сообщений на стену, и они не задействованны.


в файле templates\_default_\components\com_users_profile.tpl найдем строку

Код PHP:
<div id="addwall" style="display:none">{$usr.addwall_html}</div>
и поправим на

Код PHP:
<div id="addwall">{$usr.addwall_html}</div>
и в верху этого же файла
Код PHP:
{literal}
	<script type="text/javascript">
		$(document).ready(function(){
			$("#profiletabs > ul#tabs").tabs();
		});
	</script>
{/literal}
заменим на

Код PHP:
{literal}
	<script type="text/javascript">
		$(document).ready(function(){
			$("#profiletabs > ul#tabs").tabs();
			$("#addwall").css("display", "none");
		});
	</script>
{/literal}
Это нужно для того, чтобы форма ввода сообщения не пряталась при отключенном JavaScript.

Все. Качаем архив, тестим, говорим спасибо.

27.06.10 Изменил архив. Исправлена ошибка, приводящая к удвоению записей на стене. Извиняюсь за причиненные неудобства.
Активные темы
+7
Сегодня на форуме прозвучал вопрос от wmaximum:

Подобные темы уже поднимались, но толкового ответа на вопрос о том, как сделать ссылку кликнув по которой пользователь получал список последних активных тем форума (как это реализовано в форумных движках, либо в форуме от DLE), т.е. тем, где оставлялись сообщения с его последнего визита.

Не стал отвечать на форуме, поскольку лично мое мнение что его читают пару человек. Движухи почти никакой!
А тема интерестная, может еще кому пригодится. Может кто поправит меня...

Вот мое решение данного вопроса...


Пропишем нужную нам ссылку там где надо...(Я для теста прописал в футере шаблона)
Да. Примечание. Она должно появляться только для авторизованных пользователей.
Сделаем... (!!!Листинг для template.php!!!)

Код PHP:
<?php if($inUser->id){ ?>
   <a href="/forum/active.html">Активные темы на форуме</a>
<?php } ?>
В файле   components\forum\router.php добавим в начало после строк

Код PHP:
 function routes_forum(){
новое правило:

Код PHP:
        //RewriteRule ^forum/active.html$ /index.php?view=forum&do=active&id=$1
        $routes[] = array(
                            '_uri'  => '/^forum\/active.html$/i',
                            'do'    => 'active',
                            1       => 'id',
                         );
В файле  components\forum\frontend.php где-нибудь, например после строчек

Код PHP:
///////////////////////////// VIEW FORUMS LIST ////////////////////
if ($do=='view'){
................
.................
....................		
}	
Вставим следующий кодик:

Код PHP:
///////////////////////////// АКТИВНЫЕ ТЕМЫ ////////////////////////
if ($do=='active'){
			$inPage->setTitle('Активные темы форума');
			$inPage->addPathway('Активные темы форума', $_SERVER['REQUEST_URI']);
if(usrCheckAuth()) {
       $id = $inUser->id;
    
    if ($inUser->id){
        $logdate = $_SESSION['user']['logdate'];
    } else {
        $logdate = '9999-01-01 12:00:00';
    }
		$kolvo = 15; //сколько активных тем выводить на странице
		$groupsql = forumUserAuthSQL('f.');
		
		$tsql = "SELECT t.*, COUNT(p.id) as postsnum, f.id as fid, f.title as forum, u.id as uid,
		         u.nickname as starter, u.login as login, f.auth_group as auth_group
						 FROM cms_forum_threads t, cms_forum_posts p, cms_forums f, cms_users u
						 WHERE p.thread_id = t.id AND t.user_id = u.id AND t.forum_id = f.id $groupsql AND (p.editdate > '$logdate')
						 GROUP BY p.thread_id
						 ORDER BY t.pubdate DESC
						 LIMIT $kolvo";
						 
		$result = $inDB->query($tsql) ;
		$threads = array();
		
		if ($inDB->num_rows($result)){
		
				$threads = array();

				while ($t = $inDB->fetch_assoc($result)){
					$next = sizeof($threads);							

					$pages = ceil($t['postsnum'] / $cfg['pp_thread']);				
					$lastmessage = threadLastMessageData($t['id']);							

					$threads[$next]['date']         = strip_tags($lastmessage['date']);
					$threads[$next]['author']       = $lastmessage['user'];
					$threads[$next]['authorhref']   = cmsUser::getProfileURL($lastmessage['login']);
					$threads[$next]['starter']      = $t['starter'];
					$threads[$next]['starterhref']  = cmsUser::getProfileURL($t['login']);
					$threads[$next]['topic']        = ucfirst($t['title']);
					$threads[$next]['topicdesc']    = ucfirst($t['description']);
					$threads[$next]['topichref']    = '/forum/thread'.$t['id'].'-'.$pages.'.html#new';
					$threads[$next]['forum']        = ucfirst($t['forum']);
					$threads[$next]['forumhref']    = '/forum/'.$t['fid'];

                    $threads[$next]['secret']       = 0;
                    if ($t['auth_group']>0) {
                        $threads[$next]['secret']   = 1;
                    }

					if (strlen($lastmessage['msg'])>70) { $lastmessage['msg'] = substr($lastmessage['msg'], 0, 70).'...'; }

                    $msg = $lastmessage['msg'];

                    $threads[$next]['msg'] = $msg;

					if ($t['postsnum']==1) {
						$threads[$next]['act'] = 'начинает тему';
					} else { 
						$threads[$next]['act'] = 'отвечает в теме';
					}										
				}

				$smarty = $inCore->initSmarty('components', 'com_forum_active.tpl');			
				$smarty->assign('threads', $threads);
				$smarty->assign('cfg', $cfg);				
				$smarty->display('com_forum_active.tpl');	
														
		} else { echo '<h2>Нет активных тем на форуме!!!</h2>'; }

} else { usrAccessDenied(); }

}

И наконец, в папку templates\_default_\components нужно создать файл com_forum_active.tpl
со следующим содержанием

Код PHP:
<table width="100%" cellspacing="0" cellpadding="5" border="0" >
{foreach key=tid item=thread from=$threads}
	<tr>
		<td style="font-size: 12px;" align="left" valign="top" width="">
			<div><a href="{$thread.topichref}" style="font-weight:bold">{$thread.topic}</a></div>
			<div class="thread_desc">{$thread.topicdesc}</div>
		</td>
		<td style="font-size: 12px;" class="" valign="top" width="120">
			<div><strong>Автор:</strong><br><a href="{$thread.starterhref}">{$thread.starter}</a>
		</td>		
		<td style="font-size: 12px;" class="" valign="top" width="200">
			<div><strong>Последнее сообщение: </strong></div>
			<div>{$thread.date} от <a href="{$thread.authorhref}">{$thread.author}</a></div>
		</td>
	</tr>
{/foreach}
</table>
А если желаете выводить в стиле WEB 2

Код PHP:
<table width="100%" cellspacing="0" cellpadding="5" border="0" >
    {foreach key=tid item=thread from=$threads}

        <tr>
            <td align="left" class="mod_fweb2_date" width="70"><div style="text-align:center">{$thread.date}</div></td>
            <td width="13">
                {if !$thread.secret}
                    <img src="/modules/mod_forum/user.gif" border="0" />
                {else}
                    <img src="/modules/mod_forum/hidden.gif" border="0" title="Скрытая тема - видна только вашей группе"/>
                {/if}
            </td>
            <td style="padding-left:0px"><a href="{$thread.authorhref}" class="mod_fweb2_userlink">{$thread.author}</a> {$thread.act} «<a href="{$thread.topichref}" class="mod_fweb2_topiclink">{$thread.topic}</a>»
            {if $cfg.showforum neq 0} на форуме «<a href="{$thread.forumhref}">{$thread.forum}</a>»{/if}</td>
        </tr>

        {if $cfg.showtext neq 0}
        <tr>
            <td> </td>
            <td colspan="2"><div class="mod_fweb2_shorttext">{$thread.msg}</div></td>
        </tr>
        {/if}

    {/foreach}
</table>

А если желаете выводить в другом стиле, правим ручками...  laugh


Все. Вот мое видение и решение данной проблемы.
Удаление Профиля пользователя
+2
Наткнулся еще на один мааааленький неприятный момент.
Боюсь называть мелкие недочеты Багами, но считаю мелочи рано или поздно дают о себе знать.

Смысл вот в чем:
При удалении пользователя (не важно, с админки или из профиля) профиль пользователя удаляется. Если теперь перейти по ссылке удаленного пользователя – наблюдаем страницу удаленного пользователя. Тут вроде все нормально. Идем дальше…

Переходим на страницу регистрации и пробуем зарегистрироваться с тем же Логином, как у удаленного пользователя… Трам-тарам, логин-пароль… И о чудо! ”Регистрация прошла успешно!” – пишет Instant!!! Ну подумаешь, что в этом плохого???  Идем дальше…

Пробуем зайти к на страничку пользователя… Хм???

Еще раз попробуем…

Нет! Не то! Авторизация проходит, а в профиле видим все ту страницу удаленного пользователя…

Разбираюсь в чем проблема. Оказывается пару символов лишних в коде поправить надо, а именно:

-в файле core\ajax\registration.php строка
Код PHP:
$sql    = "SELECT id, login FROM cms_users WHERE (login LIKE '$data') AND (is_deleted = 0) LIMIT 1";
Должна быть такой:
Код PHP:
$sql    = "SELECT id, login FROM cms_users WHERE (login LIKE '$data') LIMIT 1";
Открываем components\registration\frontend.php и ищем строки:
Код PHP:
   if ($do=='register'){
…..
…..
…..
        if($msg==''){

            if ($inCore->checkCaptchaCode($code)){
…..
…..
И меняем строку
Код PHP:
$sql = "SELECT id, login, email FROM cms_users WHERE (login LIKE '$login' OR email LIKE '$email') AND (is_deleted = 0)";
На
Код PHP:
$sql = "SELECT id, login, email FROM cms_users WHERE (login LIKE '$login' OR email LIKE '$email') LIMIT 1";
Проверям….
Все нормально. Теперь такой ошибки не наблюдается…