聪明的模板

So here is the problem, I have an index.php (with all the php code) and I have an index.tpl file with all the html stuff. But now because I am using ajax I have another php file that should output some data (data.php). The problem is that I don't know how to select the template in the data.php file, all I know is on the index.php I have a function that displays the tpl ($Smarty->display($filename);) but I don't want to display the template (again) in the data.php file I just want to assign some variables that need to show on index.tpl

EDIT:

Ok this is going to be long: First I need to explain what do I want to accomplish. I have the index.php and the data.php. The index.php:

<?php
include("../include/config.php");
include("../include/functions/import.php");

$thebaseurl = $config['baseurl'];

    $query ="SELECT name FROM contacts";
    $results = $conn->execute($query);
    $select-names = $results->getrows();
    STemplate::assign('select-names',$select-names);

$templateselect = "index.tpl";
STemplate::display($templateselect);
?>

The index.tpl is a little long so I will post the important part:

xmlhttp.open("get","data.php?q="+str,true);

This is AJAX code, this code sends +str value in GET method to the data.php file that then uses the value and pulls some data from the database.

data.php:

$q=$_GET["q"];

$sql="SELECT * FROM contacts WHERE name = '$q'";

$result = mysql_query($sql);


while($row = mysql_fetch_array($result))
  {
    $name = $row['name'];
  }

STemplate::assign('name',$name);
$templateselect = "index.tpl";
STemplate::display($templateselect); //the second display
?>

I use that class here STemplate for the smarty functions, but you get what is the code.

I hope you understand what is the problem now. How can I assign variables to a template without displaying the template file again. This way the $name variable is accessible in the index.tpl (the name is shown from the db) but the whole content is shown again because of the dispaly function in the data.php.

Use $smarty->assign('var', 'value'); to assign values.

For more information read more here.

EDIT

The idea behind the .tpl is to enter the variables using assign, and when the page is ready display it using display. you can set multiple variables before displaying:

<?php

$smarty = new Smarty();

$smarty->assign('firstname', 'Doug');
$smarty->assign('lastname', 'Evans');
$smarty->assign('meetingPlace', 'New York');

$smarty->display('index.tpl');

?>

If you see the text twice that means that somewhere you're calling $smarty->display('index.tpl'); once too many. To find exactly where I'll have to see your source. please post the files or the problematic bit.

Good luck anyhow :)

Don't know if this helps. but you can also return a 'rendered' tpl to your AJAX. The display-function is normaly used for the frame of the page. (sort of like the basic placeholder for everything). and is used with a page-refresh, not AJAX.

In data.php you can use

$answer = $smarty->fetch("ajaxreturn.tpl");
echo $answer;
die();

before that, you can do the needed assigns in Smarty.

In AJAX you can then place the snippet of returned HTML in the right place.

I don't understand why do you reload the whole page with ajax. If the data that changes is i.e. a list, can't you just create a template for that list? so...

index.tpl

<body>
... content ...
<div id="ajax_list">
{include file="data.tpl"}
</div>
... content ...
</body>

and then in data.tpl

<ul>
{foreach $rows as $row}
<li>{$row.name}</li>
{foreach}
</ul>

The first time you enter index.php it will render both index.tpl and data.tpl, and then you just have to add javascript code to refresh #ajax_list contents with data.php, that will only process data.tpl with

$smarty->display('data.tpl');