Mysidia Adoptables Support Forum

Mysidia Adoptables Support Forum (http://www.mysidiaadoptables.com/forum/index.php)
-   Tutorials and Tips (http://www.mysidiaadoptables.com/forum/forumdisplay.php?f=27)
-   -   Smarty Tips: Things you can do with Templates (http://www.mysidiaadoptables.com/forum/showthread.php?t=4599)

Kyttias 07-15-2014 04:33 PM

Smarty Tips: Things you can do with Templates
 
Mysidia is built with the Smarty template system. Here's some fun facts:

You can write multiple conditions using the {if} {elseif} {elseif} {else} {/if} style. In Smarty, you can also implement a nested {if} {/if} block.

You can display the current date in your template with {$smarty.now|date_format} and it will print in the format Jul 15, 2014. For the time, check out {$smarty.now|date_format:"%H:%M"} for military time that prints 16:45, or {$smarty.now|date_format:"%I:%M %p"} for 04:45 PM. If you know how php prints dates, you can probably figure out how to customize this a ton!

For fun, pop open classes/class_template.php and inside private function assignTemplateVars(){ after it's row of this->s are done, add these:

PHP Code:

$mysidia Registry::get("mysidia");
$this->assign("logged_in",$mysidia->user->isloggedin);
$this->assign("username",$mysidia->user->username); 
$this->assign("cash",$mysidia->user->getcash());
$messages $mysidia->db->select("messages", array(), "touser='{$mysidia->user->username}' and status='unread'")->rowCount(); 
$this->assign("messages",$messages); 

This has assigned four variables to Smarty.

In your template.tpl, you can now do this:

Code:

{if $logged_in}
<a href="{$home}profile/view/{$mysidia->user->username}">{$username}</a>               
${$cash} {$mysidia->settings->cost}
<a href="{$home}messages">{$messages} Messages</a>
<a href="{$home}login/logout">Log Out</a>
{else}
Please <a href="{$home}login/logout">Log In</a> or <a href="{$home}register">Sign Up</a>!
{/if}

The above will:
- only display if a user is logged in
- print their username, which will link to their profile
- show how much currency they have and the name of your currency
- show how many messages they have, and a link to go check them out
- show a log out link when they are logged in
- when they aren't logged in, it will ask them to log in or sign up

You'll definitely want to work around this and make it pretty. ^_~

Another example might be a message that shows up 30% of the time:
Code:

{if rand(0,100) <= 30} Winner! {/if}

Kyttias 07-16-2014 02:09 AM

+Bump plus more examples of possibilities:

(If using the $cash variable set in the above post!)
Code:

{if $cash < 7777}User has more than 7777 currency!{/if}
{if $cash > 7777}User has less than 7777 currency!{/if}

Adding in a user's online variable to classes/class_template.php:
PHP Code:

$online $mysidia->db->select("online", array(), "username != 'Visitor'")->rowCount();
$this->assign("online","{$online} Users Online"); 

To be used like (this will link to a page that shows who is online):
Code:

<a href="{$home}online">{$online}</a>
Another possible use:
Code:

{if $online > 50}More than 50 users online!{/if}
{if $online < 10}Less than 10 users online!{/if}

You could also use these (in addition to the two variables above to check for users online) in classes/class_template.php:
PHP Code:

$guests $mysidia->db->select("online", array(), "username = 'Visitor'")->rowCount();
$this->assign("population","{$online} Users Online + {$guests} Guests"); 

Then you would use {$population} to print out something like "10 Users Online + 5 Guests". Perhaps it'd look nice in a footer, if that fits your site? This could also be used in an 'if' statement if you wanted something to happen if you had a certain number of guests online at once! Get creative. ^^

And back into classes/class_template.php, you can set up messages to display at specific times of the day (server time - good for promo codes people can't cheat and use their computer's clock to get):

PHP Code:

$now = new DateTime();        
$hrs $now->format('G');
if (
$hrs >  0$msg "<b>After Hours Promo Code:</b> PC0000"// After midnight
if ($hrs >  5$msg "<b>Dawn Promo Code:</b> PC0005"// After 5am
if ($hrs >  7$msg "<b>Morning Promo Code:</b> PC0507"// After 7am
if ($hrs 12$msg "<b>Afternoon Promo Code:</b> PC0712"// After noon
if ($hrs 17$msg "<b>Evening Promo Code:</b> PC1217"// After 5pm
if ($hrs 22$msg "<b>Dusk Promo Code:</b> PC1722"// After 10pm
$this->assign("timemsg",$msg); 

These would be displayed with {$timemsg}.

Keep it mind that you can infinitely combine if statements with Smarty in your template. So imagine something with a 20% chance of happening only if it is between noon and five and there are less than x amount of people online.

MikiHeart 01-13-2015 03:19 AM

Amazing tips! Thank you so much! :)

Kyttias 01-13-2015 09:36 AM

I'm glad someone appreciates it!

Kyttias 03-22-2015 03:32 PM

Ah, here's another one, this will display a user's avatar using {$avatar} in the template:

PHP Code:

       $profile $mysidia->db->select("users_profile", array("uid""avatar"), "username = '{$mysidia->user->username}'")->fetchObject();
        
$img "<img src='../../".$profile->avatar."' class='avatar'>";
        
$this->assign("avatar",$img); 

I have it creating an image with a class of 'avatar' which you can set into your css stylesheet to have set dimensions of your choosing. ^^

Kyttias 04-03-2015 10:53 AM

Since I was asked to explain all this in more detail while helping someone, here's a more detailed explanation of how all this works.

Ok, so, as I said, let's open up classes/class_template.php. Find where private function assignTemplateVars(){ is. You'll see this inside of it:

PHP Code:

$this->assign("version"Mysidia::version);
$this->assign("root"$this->scriptRoot);
$this->assign("home"$this->tempRoot);
$this->assign("temp"$this->temp);
$this->assign("css"$this->css);
$this->assign("js"$this->js); 

Cool. Leave those there. These are defining variables that help you in the template file to link places easily. (Take a peek in your header.tpl, you'll see a couple of them being used -- {$home}{$temp} -- see?)

Alright, beneath this small tower of $this->assign();s, we're going to assign some variables of our own. In this example, the user's current currency and the name of your site's currency.

First, we will need the line $mysidia = Registry::get("mysidia");. We need this so we can have the variable '$mysidia' contain a dynamic, yet static, link to the parent class called "mysidia", so we can invoke methods and properties from it. Bellow you'll see that 'user' and 'settings' are child classes of '$mysidia' and the functions and variables that come after them are literally found inside classes/class_user.php and classes/class_settings.php. You only need to define $mysidia once inside of a function, so best to do it very early on.

The next line we'll need is $this->assign("cash",$mysidia->user->getcash());. We're calling the template class, '$this' since its the one we're currently in, to use the function 'assign()' to assign a Smarty variable to the word "cash", and the variable we're assigning is the result of the 'getcash()' function found inside the 'user' class, a child class of the '$mysidia' class.

And finally, this is optional -- if you want the name of your currency as defined in your settings (hint: inside the 'settings' class this variable is known as 'cost' and is being pulled from the database table adopts_settings) you can obtain it using the line $this->assign("currency",$mysidia->settings->cost);, which will assign the variable 'cost' inside the 'settings' class, a child class $mysidia, to the word "currency".

So, here we go:
PHP Code:

$mysidia Registry::get("mysidia");
$this->assign("cash",$mysidia->user->getcash());
$this->assign("currency",$mysidia->settings->cost); 

Ok, our variables are now ready to use. But what happens if the user is not logged in? Good question. The {$cash} variable will remain empty, but the {$currency} variable still holds the name of the site's currency. If you want this information to only display while the user is logged in, you'll also want this line:

PHP Code:

$this->assign("logged_in",$mysidia->user->isloggedin); 

{$logged_in} is now also a variable, and I'll show you how to use it in a sec.

Now that these are in place, save the template class file and be sure to reupload it to your server. You can now head over to your template file, template.tpl -- the one I had you create for your theme in the original post. We assigned data to the variables {$cash} and {$currency}. Place these wherever you like, save, upload the updated file, and go view your site!

Great. Now to only make them display if the user is logged in. Smarty can handle some basic if-statements inside curly braces, like this:

PHP Code:

{if $logged_in}
        {
$cash} {$currency}
{else}
        
You are not logged in! <a href="{$home}register">Make an account?</a>
{/if} 



All times are GMT -5. The time now is 10:47 PM.

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