Делаем Голос, как на Хабре!

Всем привет, не хватет кармы для постинга в нужный форум, просьба накинуть.
Решил выложить свой способ создания «Голоса» (Хабр).
Приступим:

1. Создаем новый коллективный блог(Голос), узнаем его ID (blog_id) в таблице prefix_blog в базе данных
2. Добавляем новый тип поста, как указанно тут, при чем ссылка и идентификатор поста должны быть «voice» (используется далее по тексту)
В шаблоне add.tpl нового вида поста (/templates/skin/new/actions/ActionVoice/) необходимо заменить поле select выбора блога на поле
<input type="hidden" name="blog_id" id="blog_id" value="ТУТ_ID_ВАШЕГО_БЛОГА_ГОЛОС">

Либо берем полностью готовы код файла /templates/skin/new/actions/ActionVoice/add.tpl
В нем убраны не нужные поля, только текст Голоса. Установленн запрет комментирования и принудительный вывод на главную.

{include file='header.tpl' menu='topic_action' showWhiteBack=true}


{literal}
<script language="JavaScript" type="text/javascript">
document.addEvent('domready', function() {	
	new Autocompleter.Request.HTML($('topic_tags'), SERVER_WEB_ROOT+'/include/ajax/tagAutocompleter.php', {
		'indicatorClass': 'autocompleter-loading', // class added to the input during request
		'minLength': 2, // We need at least 1 character
		'selectMode': 'pick', // Instant completion
		'multiple': true // Tag support, by default comma separated
	}); 
});
</script>
{/literal}


{if $BLOG_USE_TINYMCE}
<script type="text/javascript" src="{$SERVER_WEB_ROOT}/classes/lib/external/tiny_mce/tiny_mce.js"></script>
{literal}
<script type="text/javascript">
tinyMCE.init({
	mode : "textareas",
	theme : "advanced",
	theme_advanced_toolbar_location : "top",
	theme_advanced_toolbar_align : "left",
	theme_advanced_buttons1 : "lshselect,bold,italic,underline,strikethrough,|,bullist,numlist,|,undo,redo,|,lslink,unlink,lsvideo,lsimage,pagebreak,code",
	theme_advanced_buttons2 : "",
	theme_advanced_buttons3 : "",
	theme_advanced_statusbar_location : "bottom",
	theme_advanced_resizing : true,
	theme_advanced_resize_horizontal : 0,
	theme_advanced_resizing_use_cookie : 0,
	theme_advanced_path : false,
	object_resizing : true,
	force_br_newlines : true,
    forced_root_block : '', // Needed for 3.x
    force_p_newlines : false,    
    plugins : "lslink,lsimage,lsvideo,safari,inlinepopups,media,lshselect,pagebreak",
    convert_urls : false,
    extended_valid_elements : "embed[src|type|allowscriptaccess|allowfullscreen|width|height]",
    pagebreak_separator :"<cut>"
});
</script>
{/literal}
{else}
	{include file='window_load_img.tpl' sToLoad='topic_text'}
{/if}


			

			<div class="topic" style="display: none;">
				<div class="content" id="text_preview"></div>
			</div>

			<div class="profile-user">
				{if $sEvent=='add'}
					<h1>{$aLang.topic_voice_create}</h1>
				{else}
					<h1>{$aLang.topic_voice_edit}</h1>
				{/if}
				<form action="" method="POST" enctype="multipart/form-data" onSubmit="ajaxBlogInfo(211);">
					<input type="hidden" name="blog_id" id="blog_id" value="211">
					
     				<script language="JavaScript" type="text/javascript">
     					ajaxBlogInfo($('blog_id').value);
     				</script>
					
					<input type="hidden" id="topic_title" name="topic_title" value="voice" class="w100p" /><br />

					<p>{if !$BLOG_USE_TINYMCE}<div class="note">{$aLang.topic_create_text_notice}</div>{/if}<label for="topic_text">{$aLang.topic_create_text}:</label>
					{if !$BLOG_USE_TINYMCE}
            			<div class="panel_form" style="background: #eaecea; ">       	 
	 						<a href="#" onclick="lsPanel.putTagAround('topic_text','b'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/bold_ru.gif" width="20" height="20" title="{$aLang.panel_b}"></a>
	 						<a href="#" onclick="lsPanel.putTagAround('topic_text','i'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/italic_ru.gif" width="20" height="20" title="{$aLang.panel_i}"></a>	 			
	 						<a href="#" onclick="lsPanel.putTagAround('topic_text','u'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/underline_ru.gif" width="20" height="20" title="{$aLang.panel_u}"></a>	 			
	 						<a href="#" onclick="lsPanel.putTagAround('topic_text','s'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/strikethrough.gif" width="20" height="20" title="{$aLang.panel_s}"></a>	 			
	 						 
	 						<a href="#" onclick="lsPanel.putTagUrl('topic_text','{$aLang.panel_url_promt}'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/link.gif" width="20" height="20"  title="{$aLang.panel_url}"></a>
	 						<a href="#" onclick="lsPanel.putQuote('topic_text'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/quote.gif" width="20" height="20" title="{$aLang.panel_quote}"></a>
	 						<a href="#" onclick="lsPanel.putTagAround('topic_text','code'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/code.gif" width="30" height="20" title="{$aLang.panel_code}"></a>
	 						<a href="#" onclick="lsPanel.putTagAround('topic_text','video'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/video.gif" width="20" height="20" title="{$aLang.panel_video}"></a>
	 				
	 						<a href="#" onclick="showImgUploadForm(); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/img.gif" width="20" height="20" title="{$aLang.panel_image}"></a> 			
	 						<a href="#" onclick="lsPanel.putText('topic_text','<cut>'); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/cut.gif" width="20" height="20" title="{$aLang.panel_cut}"></a>	
							<a href="#" onclick="showUserForm(); return false;" class="button"><img src="{$DIR_STATIC_SKIN}/images/panel/user.png" width="16" height="16" title="{$aLang.panel_user}"></a>	 					
							</div>
					{/if}
					<textarea name="topic_text" id="topic_text" rows="20">{$_aRequest.topic_text}</textarea></p>
					
					<input type="hidden" id="topic_tags" name="topic_tags" value="голос" class="w100p" /><br />
												
					<input type="hidden" id="topic_forbid_comment" name="topic_forbid_comment" value="1" /> 

						<input type="hidden" id="topic_publish_index" name="topic_publish_index" value="1" /> 
	
					
					<p class="buttons">
					<input type="submit" name="submit_topic_publish" value="{$aLang.topic_create_submit_publish}" class="right" />
					<input type="submit" name="submit_preview" value="{$aLang.topic_create_submit_preview}" onclick="$('text_preview').getParent('div').setStyle('display','block'); ajaxTextPreview('topic_text',false); return false;" /> 
					<input type="submit" name="submit_topic_save" value="{$aLang.topic_create_submit_save}" />
					</p>
				</form>

			</div>

{include file='window_add_user.tpl' sToLoad='topic_text'}
{include file='footer.tpl'}


3. Убираем блог из списка блогов при написании различных типов постов. Идем в classes/modules/blog/mapper/Blog.mapper.class.php везде после

b.blog_type<>'personal'	


добавляем

AND
b.blog_id<>'id вашего блога'


*id вашего блога заменить на реальный id.

Это же спрячет блог в рейтинге блогов.

4. Далее нужно спрятать вывод информации о постах в прямом эфире. Идем в templates/skin/new/block.stream_topic.tpl

после

{foreach from=$oTopics item=oTopic name="cmt"}


добавляем

{if $oTopic->getType()!='voice'}


и перед

{/foreach}	


Добавляем

{/if}


Теперь выводятся только посты не являющиеся Голосом

5.Настраиваем внешний вид поста-голоса.
В файлах
templates/skin/new/topic.tpl
templates/skin/new/topic_list.tpl
Можно скрыть не нужные элементы для типа постов Голос
Для этого ненужные элементы помещаем между:
{if $oTopic->getType()!='voice'}
и
{/if}


Далее убираем ненужные элементы в отображении самого блога Голос.
Для этого идем в файлы:
templates/skin/new/actions/ActionBlog/blog.tpl
и не нужные элементы обралмяем в
{if $oBlog->getUrl()!='voice'}
и
{/if}


Если установлен модуль поддоментов так же нужно выполнить это в файле /templates/skin/new/actions/ActionSubdomain/blog.tpl

Далее отключаем вывод комментанриев в блоге голос:
Идем в templates/skin/new/actions/ActionBlog/comment.tpl
Обрамляем все содержимое файла в
{if $oTopic->getType()!='voice'}
и 
{/if}


Вот как это выглядит у нас:


Так же мы сделали принудительный вывод на главную, запрет комментирования по умолчанию заменой соответсвующих чекбоксов на хидден поля в форме add.tpl

6 комментариев

avatar
Супер, давно не хватало такого хака. Спасибо большое, щас буду ставить. P.s. в карму накинул -)
avatar
Мерси, если наберется необходимое кол-во силы перенесу куда следует.
avatar
livestreet.ru/blog/tips_and_tricks/1025.html
Не хватало, говорите?
avatar
Хм, не видел его когда делал себе, немного отличается реализация.
avatar
повтор?
  • vist
  • +2
avatar
В данном варианте так же прячутся лишние упоминания Голоса в не нужных местах и лишние поля при создании голоса.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.