Go Back   vb.org Archive > vBulletin 4 Discussion > vB4 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 03-26-2012, 06:26 PM
DetroitYES's Avatar
DetroitYES DetroitYES is offline
 
Join Date: Mar 2009
Posts: 43
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Accessing a product specific template inside postbit legacy template

I am developing a vbulletin product. For ease of use, I have packaged some of the maintenance features into a product specific template called 'atdasd_postbit_tools' (running 4.1.8 at the moment):



HTML Code:
<!--ATDASD--->
!test text to verify display!
					<vb:if condition="$show['inlinemod']">
					<a class="setkeypost" style="font-size:14px;" href="admincp/atdasd_admin.php?do=updatethread&keypostid={vb:raw post.postid}&t={vb:raw post.threadid}&inforum=1" rel="nofollow" title="Mark as Key Post"></a>
					<a class="modifythreadvalue" style="font-size:14px;" href="admincp/atdasd_admin.php?do=modifythread&t={vb:raw post.threadid}&inforum=1" rel="nofollow" title="Edit Thread Values"></a>
					</vb:if>
<!--/ATDASD-->
I would like this to show up in the bottom of the post bit next to the 'report post' logo. I have added the {vb:raw atdasd_postbit_tools} code to postbit_legacy (near the bottom of the code, prefixed by ****):


HTML Code:
{vb:raw template_hook.postbit_start}
<li class="postbitlegacy postbitim postcontainer {vb:raw post.statusicon}" id="post_{vb:raw post.postid}">
<!-- see bottom of postbit.css for .userinfo .popupmenu styles -->

	<div class="posthead">
			<span class="postdate {vb:raw post.statusicon}">
				<vb:if condition="$show['announcement']">
					<span class="date">{vb:rawphrase x_until_y, {vb:raw post.startdate}, {vb:raw post.enddate}}</span>
				<vb:else />
					<span class="date">{vb:raw post.postdate}<vb:if condition="!$show['detailedtime']">,&nbsp;<span class="time">{vb:raw post.posttime}</span></vb:if></span>
				</vb:if>
			</span>
			<span class="nodecontrols">
				<vb:if condition="$post['postid'] AND $post['threadid'] AND !$show['moderated']">
					<a name="post{vb:raw post.postid}" href="{vb:link thread, {vb:raw thread}, {vb:raw pageinfo_post}}#post{vb:raw post.postid}" class="<vb:if condition="$show['inlinemod']">ie</vb:if>postcounter">#{vb:raw post.postcount}</a><a id="postcount{vb:raw post.postid}" name="{vb:raw post.postcount}"></a>
				</vb:if>
				<vb:if condition="$show['moderated']">{vb:rawphrase moderated_post}</vb:if>
				<vb:if condition="$show['inlinemod']">
					<label for="post_imod_checkbox_{vb:raw post.postid}"><input class="postimod" type="checkbox" id="post_imod_checkbox_{vb:raw post.postid}" name="plist[{vb:raw post.postid}]" value="{vb:raw post.checkbox_value}" /></label>
				</vb:if>
			</span>
	</div>
	<div class="postdetails">
		<div class="userinfo">
			<div class="username_container">
			<vb:if condition="$post['userid']">
				{vb:raw memberaction_dropdown}
				{vb:raw post.onlinestatus}
			<vb:else />
				<span class="username guest">{vb:raw post.musername}</span>
			</vb:if>
			</div>
			<span class="usertitle">
				{vb:raw post.usertitle}
			</span>
			<vb:if condition="$post['rank']">
				<span class="rank">{vb:raw post.rank}</span>
			</vb:if>
			{vb:raw template_hook.postbit_userinfo_left}
			<vb:if condition="$show['reputation']">
				<span class="postbit_reputation" id="repdisplay_{vb:raw post.postid}_{vb:raw post.userid}" title="{vb:raw post.username} {vb:raw post.level}">
					<vb:each from="reputationdisplay" value="row">
						<img class="{vb:raw row.class}" src="{vb:stylevar imgdir_reputation}/reputation_{vb:raw row.posneg}{vb:raw row.imgext}" alt="" />{vb:raw row.rowend}
					</vb:each>
				</span>
			</vb:if>
			<vb:if condition="$show['avatar']">
			<a class="postuseravatar" href="{vb:link member, {vb:raw post}}" title="{vb:rawphrase {vb:raw post['onlinestatusphrase']}, {vb:raw post.username}}">
				<img src="{vb:raw post.avatarurl}" alt="{vb:rawphrase xs_avatar, {vb:raw post.username}}" title="{vb:rawphrase xs_avatar, {vb:raw post.username}}" />
			</a>
			</vb:if> 
			<vb:if condition="$post['userid']">
				<hr />
				<dl class="userinfo_extra">
					<vb:if condition="$post['joindate']"><dt>{vb:rawphrase join_date}</dt> <dd>{vb:raw post.joindate}</dd></vb:if>
					<vb:if condition="$post['field2']"><dt>{vb:rawphrase location_perm}</dt> <dd>{vb:raw post.field2}</dd></vb:if>
					<vb:if condition="$post['age']"><dt>{vb:rawphrase age}</dt> <dd>{vb:raw post.age}</dd></vb:if>
					<dt>{vb:rawphrase posts}</dt> <dd>{vb:raw post.posts}</dd>	
					{vb:raw template_hook.postbit_userinfo_right_after_posts}
				</dl>
				<vb:if condition="$show['infraction'] OR $show['reppower']">
				<dl class="user_rep">
					<vb:if condition="$show['infraction']">
					<dt>{vb:rawphrase infractions}</dt> 
					<dd>{vb:raw post.warnings}/{vb:raw post.infractions} ({vb:raw post.ipoints})</dd>
					</vb:if>
					<vb:if condition="$show['reputation']">
						<vb:if condition="$show['reppower']">
					<dt>{vb:rawphrase reppower}</dt> 
					<dd id="reppower_{vb:raw post.postid}_{vb:raw post.userid}">{vb:raw post.reppower}</dd> 
						</vb:if>
					</vb:if>
				</dl>
				</vb:if>
				{vb:raw template_hook.postbit_userinfo_right}
				<div class="imlinks">
					{vb:raw post.icqicon} {vb:raw post.aimicon} {vb:raw post.msnicon} {vb:raw post.yahooicon} {vb:raw post.skypeicon}
				</div>
			</vb:if>
		</div>
		<div class="postbody">
			<div class="postrow<vb:if condition="$show['postedited'] || $post['signature']"> has_after_content</vb:if>">
				{vb:raw template_hook.postbit_messagearea_start}
				<vb:if condition="$post['title'] OR $show['messageicon']">
				<h2 class="title icon">
					<vb:if condition="$show['messageicon']"><img src="{vb:raw post.iconpath}" alt="{vb:raw post.icontitle}" /> </vb:if>{vb:raw post.title}
				</h2>
				</vb:if>


						<vb:if condition="$post['isfirstshown']">
							{vb:raw ad_location.ad_showthread_firstpost_start}
							{vb:raw ad_location.thread_first_post_content}
						</vb:if>
						<vb:if condition="$post['islastshown']">
							{vb:raw ad_location.thread_last_post_content}
						</vb:if>
				<div class="content<vb:if condition="$show['first_ad'] OR $show['last_ad']"> hasad</vb:if>">
					<div id="post_message_{vb:raw post.postid}">
						<blockquote class="postcontent restore ">
							{vb:raw post.message}
						</blockquote>
					</div>

					<vb:if condition="$show['attachments']">
						<div class="attachments">

						<vb:if condition="$show['thumbnailattachment']">
							<fieldset class="postcontent">
								<legend><img src="{vb:stylevar imgdir_misc}/paperclip.png" class="inlineimg" alt="{vb:rawphrase attached_thumbnails}" /> {vb:rawphrase attached_thumbnails}</legend>
								{vb:raw post.thumbnailattachments}
							</fieldset>
						</vb:if>

						<vb:if condition="$show['imageattachment']">
							<fieldset class="postcontent">
								<legend><img src="{vb:stylevar imgdir_misc}/paperclip.png" class="inlineimg" alt="{vb:rawphrase attached_images}" /> {vb:rawphrase attached_images}</legend>
								{vb:raw post.imageattachments}
							</fieldset>
						</vb:if>

						<vb:if condition="$show['imageattachmentlink']">
							<fieldset class="postcontent">
								<legend><img src="{vb:stylevar imgdir_misc}/paperclip.png" class="inlineimg" alt="{vb:rawphrase attached_images}" /> {vb:rawphrase attached_images}</legend>
								<ul>
								{vb:raw post.imageattachmentlinks}
								</ul>
							</fieldset>
						</vb:if>

						<vb:if condition="$show['otherattachment']">
							<fieldset class="postcontent">
								<legend><img src="{vb:stylevar imgdir_misc}/paperclip.png" class="inlineimg" alt="{vb:rawphrase attached_files}" /> {vb:rawphrase attached_files}</legend>
								<ul>
								{vb:raw post.otherattachments}
								</ul>
							</fieldset>
						</vb:if>

						<vb:if condition="$show['moderatedattachment']">
							<fieldset class="postcontent">
								<legend><img src="{vb:stylevar imgdir_misc}/paperclip.png" class="inlineimg" alt="{vb:rawphrase attachments_pending_approval}" /> {vb:rawphrase attachments_pending_approval}</legend>
								<ul>
								{vb:raw post.moderatedattachments}
								</ul>
							</fieldset>
						</vb:if>

						</div>
					<!-- / attachments -->
					</vb:if>
				</div>
			</div>
			<vb:if condition="$show['postedited'] || $post['signature']">
			<div class="after_content">
				<vb:if condition="$show['postedited']">
				<!-- edit note -->
				<blockquote class="postcontent lastedited">
					<vb:if condition="$show['postedithistory']">
						{vb:rawphrase last_edited_link_by_x_on_y_at_z_postid, {vb:raw post.edit_username}, {vb:raw post.edit_date}, 
							{vb:raw post.edit_time}, {vb:raw post.historyurl}}
					<vb:else />
						{vb:rawphrase last_edited_by_x_on_y_at_z, {vb:raw post.edit_username}, {vb:raw post.edit_date}, {vb:raw post.edit_time}}
					</vb:if>
					<vb:if condition="$post['edit_reason']">
						<span class="reason">{vb:rawphrase reason}:</span> {vb:raw post.edit_reason}
					</vb:if>
				</blockquote>
				<!-- / edit note -->
				</vb:if>
				{vb:raw template_hook.postbit_signature_start}
				<vb:if condition="$post['isfirstshown']">
					{vb:raw ad_location.ad_showthread_firstpost_sig}
				</vb:if>
				<vb:if condition="$post['signature']">
					<blockquote class="signature restore"><div class="signaturecontainer">{vb:raw post.signature}</div></blockquote>
				</vb:if>
				{vb:raw template_hook.postbit_signature_end}
			</div>
			</vb:if>
			<div class="cleardiv"></div>
		</div>
	</div>
		<div class="postfoot">
			<!-- <div class="postfoot_container"> -->
			<div class="textcontrols floatcontainer">
				<span class="postcontrols">
					<img style="display:none" id="progress_{vb:raw post.postid}" src="{vb:stylevar imgdir_misc}/progress.gif" alt="{vb:rawphrase loading_editor_please_wait}" />
					<vb:if condition="$post['editlink']">
						<a class="editpost" href="{vb:raw post.editlink}" name="vB::QuickEdit::{vb:raw post.postid}" title="{vb:rawphrase edit_delete_message}"><img src="{vb:raw vboptions.cleargifurl}" id="editimg_{vb:raw post.postid}" alt="{vb:rawphrase edit_delete_message}" /> {vb:rawphrase edit_post}</a> 
					<vb:if condition="THIS_SCRIPT != 'usernote' && THIS_SCRIPT != 'announcement'"><span class="seperator">&nbsp;</span></vb:if>
					</vb:if>
					<vb:if condition="$show['quickreply'] AND !$show['threadedmode']">
						<a id="qr_{vb:raw post.postid}" class='quickreply' href="{vb:raw post.replylink}&amp;noquote=1" rel="nofollow" title="{vb:rawphrase quick_reply_to_this_message}"><img id="replyimg_{vb:raw post.postid}" src="{vb:raw vboptions.cleargifurl}" alt="{vb:rawphrase quick_reply_to_this_message}" /> {vb:rawphrase reply}</a> 
					<span class="seperator">&nbsp;</span>
					</vb:if>
					<vb:if condition="$post['replylink']">
						<a id="qrwq_{vb:raw post.postid}" class="newreply" href="{vb:raw post.replylink}" rel="nofollow" title="{vb:rawphrase reply_with_quote}"><img id="quoteimg_{vb:raw post.postid}" src="{vb:raw vboptions.cleargifurl}" alt="{vb:rawphrase reply_with_quote}" />  <vb:if condition="$post['forwardlink']">{vb:rawphrase reply_to_private_message}<vb:else />{vb:rawphrase reply_with_quote}</vb:if></a> 
					<vb:if condition="$show['multiquote_post']"><span class="seperator">&nbsp;</span></vb:if>
					</vb:if>
					<vb:if condition="$show['multiquote_post']">
						 <a class="multiquote" href="{vb:raw post.replylink}" rel="nofollow" onclick="return false;" id="mq_{vb:raw post.postid}" title="{vb:rawphrase multi_quote_this_message}"><img id="mq_image_{vb:raw post.postid}" src="{vb:raw vboptions.cleargifurl}" alt="{vb:rawphrase multi_quote_this_message}" />&nbsp;</a> 
					</vb:if>
				</span>
				<span class="postlinking">
					<vb:if condition="!$post['forwardlink'] && THIS_SCRIPT != 'usernote' && THIS_SCRIPT != 'announcement'">
						<vb:if condition="$promote_sectionid AND $promote_sectionid != -1">
						       <a href="{vb:raw promote_url}" class="promotecms">{vb:rawphrase promote_to_article}</a>
                                                       <span class="seperator">&nbsp;</span>
						</vb:if>
					</vb:if>

					{vb:raw template_hook.postbit_controls}
					{vb:raw post.iplogged}
					<vb:if condition="$post['forwardlink']">
						<a class="forwardpost" href="{vb:raw post.forwardlink}" rel="nofollow"><img src="{vb:raw vboptions.cleargifurl}" alt="{vb:rawphrase forward_message}" /> {vb:rawphrase forward}</a>
						<vb:if condition="$show['reputationlink'] OR $show['infractionlink'] OR $show['moderated'] OR $show['spam'] OR $show['deletedpost'] OR $show['redcard'] OR $show['yellowcard']"><span class="seperator">&nbsp;</span></vb:if>
					</vb:if>
					<vb:if condition="$show['reputationlink']">
						<span class="reputationpopupmenu popupmenu popupcustom" title="{vb:raw post.postid}"><a class="popupctrl reputation" href="reputation.php?{vb:raw session.sessionurl}do=addreputation&amp;p={vb:raw post.postid}" title="{vb:rawphrase add_reputation}" rel="nofollow" id="reputation_{vb:raw post.postid}"><!--<img src="{vb:stylevar imgdir_button}/reputation-40b.png" alt="{vb:rawphrase add_reputation}" /> -->&nbsp;</a></span>
					</vb:if>

					<vb:if condition="$show['infractionlink']">
						&nbsp;<a class="infraction" href="infraction.php?{vb:raw session.sessionurl}do=report&amp;p={vb:raw post.postid}" rel="nofollow" title="{vb:rawphrase add_infraction_for_x, {vb:raw post.username}}"><!-- <img src="{vb:stylevar imgdir_button}/add-infraction_sm.png" alt="{vb:rawphrase add_infraction_for_x, {vb:raw post.username}}" /> --> &nbsp;</a> &nbsp;
					</vb:if>
					<vb:if condition="$show['reportlink']">
						&nbsp;<a class="report" href="{vb:raw post.reportlink}" rel="nofollow" title="{vb:rawphrase report_bad_post}"><!-- <img src="{vb:stylevar imgdir_button}/report-40b.png" alt="{vb:rawphrase report_bad_post}" /> -->&nbsp;</a> &nbsp;
					</vb:if>

					<vb:if condition="$show['moderated']">
						<img class="moderated" src="{vb:stylevar imgdir_misc}/moderated_sm.png" alt="{vb:rawphrase moderated_post}" />
					</vb:if>
					<vb:if condition="$show['spam']">
						<img class="spam" src="{vb:stylevar imgdir_misc}/spam_detected.png" alt="{vb:rawphrase spam_post}" />
					</vb:if>
					<vb:if condition="$show['deletedpost']">
						<vb:if condition="$show['managepost']">
							<a class="deleted" href="{vb:raw $vboptions.vbforum_url}{vb:if "$vboptions['vbforum_url']", '/', ''}postings.php?{vb:raw session.sessionurl}do=managepost&amp;p={vb:raw post.postid}" title="{vb:rawphrase manage}">&nbsp;</a>
						<vb:else />
							<img class="deleted_nolink" class="inlineimage" src="{vb:stylevar imgdir_button}/deleted_sm.png" alt="{vb:rawphrase deleted_post}" />
						</vb:if>
					</vb:if>
					<vb:if condition="$show['redcard']">
						<a class="redcard" href="infraction.php?{vb:raw session.sessionurl}do=view&amp;p={vb:raw post.postid}" rel="nofollow" title="{vb:rawphrase received_infraction}"><!-- <img src="{vb:stylevar imgdir_button}/red-card_sm.png" alt="{vb:rawphrase received_infraction}" /> --> &nbsp;</a>
						<vb:elseif condition="$show['yellowcard']" />
							<a class="yellowcard" href="infraction.php?{vb:raw session.sessionurl}do=view&amp;p={vb:raw post.postid}" rel="nofollow" title="{vb:rawphrase received_warning}"><!--<img src="{vb:stylevar imgdir_button}/yellow-card_sm.png" alt="{vb:rawphrase received_warning}" /> --> &nbsp;</a>
					</vb:if>
					<vb:if condition="$post['api_platform']">
						<vb:if condition="$post['api_platform_link']">
							<a class="mobile mobile_{vb:raw post.api_platform}" href="{vb:raw post.api_platform_link}" rel="nofollow" title="{vb:rawphrase {vb:raw post['api_platform_link_title']}}">{vb:rawphrase {vb:raw post['api_platform_link_phrase']}}</a>
						<vb:else />
							<span class="mobile mobile_{vb:raw post.api_platform}">{vb:rawphrase {vb:raw post['api_platform_link_phrase']}}</span>
						</vb:if>
					</vb:if>

****{vb:raw atdasd_postbit_tools}
				</span>
			<!-- </div> -->
			</div>
		</div>
	<hr />
</li>
{vb:raw template_hook.postbit_end}
I'm having trouble accessing the atdasd_postbit_tools template. I have tried regiestering it multiple ways through a plugin, but none of the usual methods seem to work (I'm thinking because its assigned to a product, thus not necessarily a 'custom' template...

my most recent attempt was:

PHP Code:

//$globaltemplates['atdasd_postbit_tools'];

// Register my_var with the custom template 
$templater vB_Template::create('atdasd_postbit_tools'); 
$templater->register('test''!test!'); 

// Render the custom template 
$my_template_output $templater->render(); 

// Add the output from the template...
$GLOBALS[postbit_wrapper'] .= $my_template_output; 
product = ATDASD (Same as Template...not vbulletin)
hook location = global_start
execution order = 10


how would i go about doing this? I want to package the template as part of the product in the XML, so that I can then instruct users just to insert the {vb:raw atdasd_postbit_tools} into the appropriate place, for minimum confusion. Thanks.

--------------- Added [DATE]1332794346[/DATE] at [TIME]1332794346[/TIME] ---------------

Partially Solved:

Rewrote the plugin:

PHP Code:
$templater vB_Template::create('atdasd_postbit_tools');

$templatevalues['atdasd_postbit_tools'] = $templater->render();
vB_Template::preRegister('postbit_legacy'$templatevalues); 
hook location changed to: postbit_display_start
(hook location was relevant to access the $show[inlinemod} variable )

However, i still can't access {vb:raw post.postid} or {vb:raw post.threadid} within the template...
Reply With Quote
  #2  
Old 03-26-2012, 08:38 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

You'd need to register $post to your template, like:

Code:
$templater = vB_Template::create('atdasd_postbit_tools');

$template->register('post', $post);
$templatevalues['atdasd_postbit_tools'] = $templater->render();
vB_Template::preRegister('postbit_legacy', $templatevalues);
Reply With Quote
  #3  
Old 03-27-2012, 02:35 PM
DetroitYES's Avatar
DetroitYES DetroitYES is offline
 
Join Date: Mar 2009
Posts: 43
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Ah, thanks.

Not sure why that method didn't occur to me, I had bypassed it with hard assignments like this:

HTML Code:
$templater = vB_Template::create('atdasd_postbit_tools');
$templater->register('atdasd_postid', $post['postid']);
$templater->register('atdasd_threadid', $post['threadid']);
$templatevalues['atdasd_postbit_tools'] = $templater->render();
vB_Template::preRegister('postbit_legacy', $templatevalues);
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 05:39 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.03410 seconds
  • Memory Usage 2,266KB
  • Queries Executed 11 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (1)bbcode_code
  • (3)bbcode_html
  • (2)bbcode_php
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (3)post_thanks_box
  • (3)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (3)post_thanks_postbit_info
  • (3)postbit
  • (3)postbit_onlinestatus
  • (3)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete