vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vBulletin 3 Articles (https://vborg.vbsupport.ru/forumdisplay.php?f=187)
-   -   [vBulletin|PHP|HTML]Automatic Template Edits (https://vborg.vbsupport.ru/showthread.php?t=125173)

Ziki 08-27-2006 10:00 PM

[vBulletin|PHP|HTML]Automatic Template Edits
 
You are creating a new vBulletin product and want to make it more user friendly so that the users don't have to edit the templates manually?Then this tutorial will point you the right way.Basically the code I am going to demonstrate simply finds a specific part of a template and inserts our code/template into it.

Ok let's say you have a template or a piece of html code you want to include somewhere:

HTML Code:

<em>My name is $name and welcome to $board</em>
Ok now we have to options:

1. Insert the code into a template and then insert the whole template into the site.


So you now have the html code in your template called TEMPLATE.I suggest you cache it for faster loading.To do that create a new plugin on the cache_templates hook with this content:

PHP Code:

$globaltemplates  array_merge($globaltemplates, array('TEMPLATE''TEMPLATE2')); 

$globaltemplates variable are the templates that are supposed to be cached.It is an array because it contains multiple templates,default ones and the ones from other 3rd party products.

So now what we just need to do,is insert our template into another one.To do that you need to know what page you want to display it on,the hooks that are located on that page and the templates called.In the template you will add the code in find a block of code that is static,thus won't ever be changed (like html comments).Should be one liner.Our template is TEMPLATE and the one that will include it is MAINTEMPLATE.

Then use this phpcode.

PHP Code:

$variable 'OUR STATIC CODE';
$vbulletin->templatecache['MAINTEMPLATE'] = str_replace($variable,$variable.fetch_template('TEMPLATE'),$vbulletin->templatecache['MAINTEMPLATE'])
;]=]=> 

Explanation: the template MAINTEMPLATE is represented by the variable $vbulletin->templatecache['MAINTEMPLATE'].So we changed the way it is represented.We used str_replace to change the MAINTEMPLATE,so now it added the TEMPLATE into it.It searched for $variable and attached the template into it.

To include a code on every page use the hook global_start and the template header,footer or headinclude :)

DONE




2. Insert the code into a variable and insert it via replace.


Ok this is a bit easier than the code above.So we still want to add the code but don't want a template?Make the code into a variable.

PHP Code:

$template '<em>My name is $name and welcome to $board</em>'

we used ' apostrophes instead of " so that the code isn't parsed directly in the variable but rather in the template.Note,if you have ' or " in your code,you have to put \ before them so that php doesn't think it belongs into the main code.

Then just use the code before.


PHP Code:

$template '<em>My name is $name and welcome to $board</em>';
$variable 'OUR STATIC CODE';
$vbulletin->templatecache['MAINTEMPLATE'] = str_replace($variable,$variable.$template,$vbulletin->templatecache['MAINTEMPLATE'])
;]=]=> 

DONE


3. Insert the code into a variable and call the variable in the template.


This is the easiest way.So we have $template already specified and we just put the variable ($template) into any template and vBulletin will parse it :).But you have to make sure that the hook the variable is on,is called on that page!
DONE


4. Attach code to an existing variable in the template.

This method became easier when vBulletin introduced template hooks. For instance,open template navbar and you can find $template_hook['navbar_buttons_left'] somewhere in the code,thanks to which you can add new navbar buttons simply using plugins.To do that,I make a new plugin on global_setup_complete (or any plugin called where the variable is) and add this code:

PHP Code:

$template_hook['navbar_buttons_left'] .= '<td class="vbmenu_control"><a href="file.php' $session['sessionurl_q'] . '" accesskey="5" >' $vbphrase['mynewbutton'] . '</a></td>'

See the ".=" ?That means that the code following it was added to the variable's value and thus displayed when the variable is parsed :).

You can also attach a whole template this way.In the next example I added my template below navbar.

PHP Code:

eval('$navbar .= "' fetch_template('mytemplate') . '";'); 

DONE

I hope this article has helped you understand this topic and develop better and more user friendly products!

Basboss 08-29-2006 04:10 AM

A great one, thanks a lot.

Ziki 08-29-2006 07:57 AM

Thanx.

I though no one will understand what I was writing XD

luroca 09-01-2006 08:53 PM

Hello, thanks for this tutorial.

If I want to work with another page as showthread, can we use global_start and another template or I must use other hook?

Greetings

Ziki 09-02-2006 06:26 AM

Use global_start and the showthread template.Or you can use any hook on showthread_page :)

luroca 09-02-2006 12:16 PM

Thanks again.

sebbe 10-04-2006 06:25 PM

Thanks, will be usefull!

Zachery 10-04-2006 06:47 PM

Bad, bad, bad, bad, bad!

You should not be adding templates or html dynamicly to pages, it only creates more hassles when users need to troubleshoot issues. Make them do the template edits or things only get worse.

vietkieu_cz 10-12-2006 10:49 AM

PHP Code:

<templates>
        <
template name="zh_nrc" templatetype="template" date="1148052896" username="Ziki" version="3.5.4"><![CDATA[
        <
script language=JavaScript>

var 
message="$zhnrctext";
function 
clickIE() {if (document.all) {alert(message);return false;}}
function 
clickNS(e) {if 
(
document.layers||(document.getElementById&&!document.all)) {
if (
e.which==2||e.which==3) {alert(message);return false;}}}
if (
document.layers
{
document.captureEvents(Event.MOUSEDOWN);document.onmousedown=clickNS;}
else{
document.onmouseup=clickNS;document.oncontextmenu=clickIE;}

</
script>
]]></
template>
    </
templates

Quote:

Firstly take your code and put it into a template
So I still have to edit my template to put it in?

Ziki 10-12-2006 06:25 PM

Quote:

You should not be adding templates or html dynamicly to pages, it only creates more hassles when users need to troubleshoot issues. Make them do the template edits or things only get worse.
??????

Quote:

So I still have to edit my template to put it in?
No.Read it :)

Zachery 10-12-2006 07:48 PM

Making your end users do less and less creates the problems we have now. Make your users do the template edits.

Luggruff 11-02-2006 02:13 PM

Quote:

Originally Posted by Ziki
??????

As Zachery said:

I for one have a hack (CYB - Forum Rules) and he has done this, He have placed the link to the forumrules in my navbar, and I can't change it, or the location of it.

Think that's fun when you want to make a custom style? For one: If I change my navbar to the header, that link does not follow.. and so on.

Bad, bad, bad bad bad bad bad bad.

Paul M 11-02-2006 05:40 PM

Whether you like automatic editing of templates is a personal choice, not a fact. If you want to discuss the merits of doing it please start a new thread, not clutter up this one.

Ziki 11-03-2006 05:35 PM

Quote:

Originally Posted by Paul M
Whether you like automatic editing of templates is a personal choice, not a fact. If you want to discuss the merits of doing it please start a new thread, not clutter up this one.

That was a plus for me?

RedTyger 11-11-2006 07:50 PM

Nicely done Ziki. :D And as an extra bonus, something I just found out. Namely that you don't need to create or insert a template if all you want to insert is one value from your settings.

Code:

$str = 'findthis';
$vbulletin->templatecache['footer'] = str_replace($str,$str.$vbulletin->options['kerjigger'],$vbulletin->templatecache['footer']);

Because str_replace uses up a little bit of resources, if whether or not it's going to be used is dependent on settings in your plugin then it's worth surrounding the replace code with a variable to ensure it only runs when it has to. Like so:

Code:

if ($vbulletin->options['mysetting'])
{
$str = 'findthis';
$vbulletin->templatecache['footer'] = str_replace($str,$str.$vbulletin->options['kerjigger'],$vbulletin->templatecache['footer']);
}


RedTyger 03-10-2007 08:25 AM

Two small additional notes.

Firstly, templatecache identities are CASE SENSITIVE. So $vbulletin->templatecache['SHOWTHREAD'] will work but $vbulletin->templatecache['showthread'] will not, because the the template is named with capitals.

Secondly, if you are doing a find/replace it's slightly more efficient to include what you're finding in the replacement text instead of appending it in the str_replace. So

Code:

$find = 'this';
$replace = 'this that';
$vbulletin->templatecache['SHOWTHREAD'] = str_replace($find, $replace, $vbulletin->templatecache['SHOWTHREAD']);

is more efficient than

Code:

$find = 'this';
$replace = ' that';
$vbulletin->templatecache['SHOWTHREAD'] = str_replace($find, $find.$replace, $vbulletin->templatecache['SHOWTHREAD']);

Doing it the first way also has another advantage in that you can add your replacement immediately before what you're finding. If you do it the second way, you can only add it after.

ragtek 03-10-2007 08:43 AM

there is a very nice product from andreas http://www.vbhacks-germany.org/showthread.php?t=5572

Luky 04-02-2007 12:43 PM

Didnt read, but ALL mods should use this! :P I hate editing templates for mods, it means you gota do it for every style, i have alot of styles =/

Ziki 09-26-2008 08:44 PM

Article was updated.

Ziki 05-16-2009 06:13 AM

Updated

Ziki 06-20-2009 01:18 PM

Ah come on,tell me if the tut is good :(

testebr 08-05-2009 10:53 AM

Nothing is good if it is hosted external, just send the article here at vb.org

And plus request register to see code in your board...

'Unregistered users can not view codes.Please register.'

Ziki 08-05-2009 04:47 PM

This is the article.

high6 11-10-2009 12:56 AM

Thanks for the article. Was always wondering why there was no need for huge template changes. Also can you give an example with (3)? I don't really understand it and want to try it.

tommythejoat 11-15-2009 07:19 PM

Could you do this kind of edit in the install/uninstall code of the mod (if you do not want to do the dynamic edits, ala Zachery?).


All times are GMT. The time now is 10:12 PM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01508 seconds
  • Memory Usage 1,814KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (4)bbcode_code_printable
  • (1)bbcode_html_printable
  • (7)bbcode_php_printable
  • (5)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (25)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.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/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.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
  • printthread_start
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete