Frage zu Smarty: Klassen, Funktionen und Konstanten

Kalma

Erfahrenes Mitglied
Hi,

ich bin grad auf einige Fragen bei Smarty-Templates gestoßen:

-1- Ich habe eine Konstante definiert:
PHP:
<?php define('MEIN_VERZEICHNIS', 'ist_hier/'); ?>

Wie kann ich nun diese Konstante in meinem Smarty-Template aufrufen?


-2- Ich habe eine Klasse mit mehreren Methoden:
Wie kann ich nun, wenn ich einen Konstruktor definiert habe, eine Methode aufrufen im Template?
PHP:
<?php
include 'meineKlasse.php';
$klasse = new Klasse();
?>

Also zum beispiel im Template: $klasse->verbinde2sachen();
Wie macht man sowas?

-3- Wie rufe ich Funktionen, die ich selbst geschrieben habe in einem Template auf?


Ich würde mich sehr über Antworten freuen!
Gruß und Danke im Vorraus
David
 
Hallöle

1. Nicht, verwende $smarty->assign()
2. Nicht, verwende $smarty->assign()
3. Nicht, verwende $smarty->assign()

Ein Template ist dafür gedacht, HTML-Ausgabe-Struktur für die Applikation zu definieren. Darin sollten nach Möglichkeit keine PHP-Funktionen noch sonstige externe Dinge aufgerufen werden. Das funktioniert zwar mit

Code:
{php}...{/php}

aber mit der assign-Methode des Smarty-Objekts ist das viel eleganter.
 
Oh gut :)

Also ich dachte nur, wenn ich eine Konstante mache, hat es ja wenig Sinn, wenn ich die nocheinmal übergeben muss.


Aber gut, also alles per assign(); übergeben!

Danke für die Antworten :)
 
Wie sollte ich folgendes am Besten erledigen?


Ich habe eine Klasse geschrieben, die mir Inputs erstellt, für Formulare.

Da hab ichs eigentlich immer so gemacht:
PHP:
<?php echo $form->input($parameter); ?>

Muss ich auch diese Inputs im PHP-Bereich definieren und dann übergeben? :confused:
 
Öhm, wenn ich das richtig verstanden habe, wäre das idealerweise so zu erledigen:

1. Erstelle für das Form ein .tpl-File, was nur die Form, sowie alle Elemente enthält. Dies könnte so aussehen:

someform.tpl
HTML:
<form action="{$action}" method="post">
  <input type="text" name="helloworldvar" value="{$helloworldval}"/>
  <input type="submit"/>
</form>

In deinem PHP-Code assignst du dann nur an smarty:

PHP:
$smarty->assign('action', 'foobar.php');
$smarty->assign('helloworldval', "Hallo Welt!");

Dann includest du das tpl in dein Haupt-Template:

{include file="someform.tpl"}
 
Aber ich will ja nicht für jede Form die ich habe, auch wenn sie nur 2 Inputs hat, eine eigene Datei erstellen...


Ich dachte eigentlich die Klasse wäre gut, damit ich weniger Arbeit habe, nicht mehr.
 
Das kommt drauf, was die Klasse genau macht. Ohne Source kann ich da keine Äußerung machen. Natürlich kannst du auch "normalen" HTML-Code in PHP generieren. Schließlich ist PHP eine Template-Engine. Ich dachte aber, du möchstest gern Aussehen von Logik trennen - was eigentlich die Intention einer Template-Engine wie Smarty ist.

Aber grundsätzlich kannst du die HTML-Ausgabe für Forms auch in einer Klasse zusammen bauen und die Ausgabe dann über assign an Smarty anhängen.

Oder habe ich dich immer noch falsch verstanden?
 
Also meine Klasse sieht so aus:

PHP:
<?php
	class Form
	{
		var $type;
		var $name;
		var $value;
		var $size;
		var $maxlength;
		var $style;
		var $label;
		
		var $message;
		var $form;
		
		function __construct()
		{
		}
		
		
		#-#############################################
		# desc: generates form beginning
		# param: name, action, method, enctype
		# return: string
		function form($name, $action, $method, $enctype=NULL)
		{
			$parameter				= array();
			$parameter['name']		= $name;
			$parameter['id']		= $name;
			$parameter['action']	= $action;
			$parameter['method']	= $method;
			$parameter['enctype']	= $enctype;
			
			$this->form		 = '<form ';
			
			// write parameter into form
			foreach($parameter as $key => $value)
			{
				$this->form	.= $key.'="'.$value.'" ';
			}
			
			$this->form		.= '>';
			
			
			return $this->form;
		}
		
		#-#############################################
		# desc: generates a single textfield input
		# param: type, name, value, disabled, readonly
		#		 size, maxlength
		# return: string
		function textfield($type, $name, $tvalue=NULL, $disabled=NULL, $readonly=NULL, $width=NULL, $size=NULL, $maxlength=NULL, $clear=NULL)
		{		
			unset($this->generated_input);
		
			// add left border
			#$this->generated_input	 = $this->border('textfieldbgleft.png');
		
			// main field parameters
			$parameter				= array();
			$parameter['type']		= $type;
			$parameter['name']		= $name;
			$parameter['value']		= $tvalue;
			
			if(!empty($disabled)) {
				$parameter['disabled']	= $disabled;
			}
			if(!empty($readonly)) {
				$parameter['readonly']	= $readonly;
			}
			
			#$parameter['width']		= $width;
			$parameter['size']		= $size;
			$parameter['maxlength']	= $maxlength;
			
			
			$this->generated_input	.= '<input id="'.$name.'" ';
			
			if(!empty($width)) {
				$this->generated_input .= 'style="width:'.$width.'" ';
			}
			
			
			// write parameter into input
			foreach($parameter as $key => $value)
			{
				$this->generated_input	.= $key.'="'.$value.'" ';
			}
			
			// if $value is not empty:
			// clear field on click
			// change style
			$change_color = 'this.style.color=\'#000\'';
			
			if($clear == 'clear') {
				$this->generated_input	.= ' onClick="javascript:this.value=\'\'; '.$change_color.'"';
			} else {
				$this->generated_input	.= ' onClick="javascript:'.$change_color.'"';
			}
			
			// add class
			$this->generated_input	.= ' class="input"  />';

				
			// add right border
			#$this->generated_input	.= $this->border('textfieldbgright.png',  'right');
			
			return $this->generated_input;
		}

		#-#############################################
		# desc: generates file input
		# param: type, name, value, disabled, readonly
		#		 size, maxlength
		# return: string
		function fileinput($name, $disabled=NULL, $readonly=NULL, $size=NULL, $maxlength=NULL)
		{		
			unset($this->generated_input);
			// main field parameters
			$parameter				= array();
			$parameter['type']		= 'file';
			$parameter['name']		= $name;
			
			if(!empty($disabled)) {
				$parameter['disabled']	= $disabled;
			}
			if(!empty($readonly)) {
				$parameter['readonly']	= $readonly;
			}
			
			$parameter['size']		= $size;
			$parameter['maxlength']	= $maxlength;
			
			
			$this->generated_input	.= '<input id="'.$name.'" ';
			
			// write parameter into input
			foreach($parameter as $key => $value)
			{
				$this->generated_input	.= $key.'="'.$value.'" ';
			}
			
			
			// add class
			$this->generated_input	.= ' />';

			
			return $this->generated_input;
		}
		
		#-#############################################
		# desc: generates a textarea
		# param: type, name, value, disabled, readonly
		#		 size, maxlength
		# return: string
		function textarea($name, $rows, $cols, $tvalue=NULL, $disabled=NULL, $readonly=NULL, $size=NULL, $maxlength=NULL, $clear=NULL)
		{		
			unset($this->generated_input);
		
		
			// main field parameters
			$parameter				= array();
			$parameter['name']		= $name;
			$parameter['rows']		= $rows;
			$parameter['cols']		= $cols;
			
			if(!empty($disabled)) {
				$parameter['disabled']	= $disabled;
			}
			if(!empty($readonly)) {
				$parameter['readonly']	= $readonly;
			}
			
			$parameter['size']		= $size;
			$parameter['maxlength']	= $maxlength;
			
			
			$this->generated_input	.= '<textarea class="textarea" ';
			
			// write parameter into input
			foreach($parameter as $key => $value)
			{
				$this->generated_input	.= $key.'="'.$value.'" ';
			}
			
			// if $value is not empty:
			// clear field on click
			if($clear == 'clear') {
				$this->generated_input	.= ' onClick="javascript:this.value=\'\'"';
			}
			
			$tvalue = str_replace('<br />', '', $tvalue);
			
			$this->generated_input .= '>'.$tvalue.'</textarea>';
			
			return $this->generated_input;
		}
		
		#-#############################################
		# desc: generates an hidden input
		# param: name, value
		# return: string
		function hidden($name, $value)
		{
			$this->generated_input	= '<input type="hidden" name="'.$name.'" value="'.$value.'" />';
			
			return $this->generated_input;
		}
		
		
		#-#############################################
		# desc: generates a select box
		# param: name, (array) values
		# return: string
		function select($name, $values, $checked=NULL, $disabled=NULL, $readonly=NULL)
		{	
			unset($this->generated_input);
		
		
			// main field parameters
			$parameter				= array();
			$parameter['name']		= $name;
			
			if(!empty($disabled)) {
				$parameter['disabled']	= $disabled;
			}
			if(!empty($readonly)) {
				$parameter['readonly']	= $readonly;
			}
		
		
			// main field
			$this->generated_input	.= '<select class="select" ';
			
			// write parameter into input
			foreach($parameter as $key => $value)
			{
				$this->generated_input	.= $key.'="'.$value.'" ';
			}
			$this->generated_input	.= '>';
			
			
			// add items
			foreach($values as $key => $value)
			{	
				if($key == $checked) {
					$this->generated_input	.= '<option value="'.$key.'" selected=selected>'.$value.'</option>';
				} else {
					$this->generated_input	.= '<option value="'.$key.'">'.$value.'</option>';
				}
			}
		
			$this->generated_input	.= '</select>';
			
			return $this->generated_input;
		}
		
		#-#############################################
		# desc: generates a checkbox
		# param: name, values
		# return: string
		function checkbox($name, $value, $checked=NULL, $disabled=NULL, $readonly=NULL)
		{	
			unset($this->generated_input);
		
			// main field parameters
			$parameter				= array();
			$parameter['name']		= $name;
			$parameter['value']		= $value;
			
			if(!empty($disabled)) {
				$parameter['disabled']	= $disabled;
			}
			if(!empty($readonly)) {
				$parameter['readonly']	= $readonly;
			}
			if(!empty($checked)) {
				$parameter['checked']	= $checked;
			}
			
			$this->generated_input	.= '<input id="'.$name.'" type="checkbox" ';
			
			// write parameter into input
			foreach($parameter as $key => $value)
			{
				$this->generated_input	.= $key.'="'.$value.'" ';
			}			
			
			// add class
			$this->generated_input	.= ' class="checkbox"  />';
			
			return $this->generated_input;
		}
		
		#-#############################################
		# desc: generates a button
		# param: type, name, value
		# return: string
		function button($type, $name, $value, $disabled=NULL, $onclick=NULL)
		{		
			unset($this->generated_input);
			
			// main button parameters
			$parameter				= array();
			$parameter['type']		= $type;
			$parameter['name']		= $name;
			$parameter['value']		= $value;
			
			if(!empty($disabled)) {
				$parameter['disabled']	= $disabled;
			}
			
			
			if(!empty($onclick)) {
				$parameter['onclick']	= $onclick;
			}
			
			
			$this->generated_input	.= '<input ';
			
			// write parameter into input
			foreach($parameter as $key => $value)
			{
				$this->generated_input	.= $key.'="'.$value.'" ';
			}
			
			
			// add class
			$this->generated_input	.= ' class="button"  />';
			
			return $this->generated_input;
		}	
	} //CLASS Form
	###################################################################################################
?>

Die Klasse ist noch nicht ganz fertig, also nicht meckern ;)
(Muss noch überarbeitet werden!)



Und jetzt habe ich sonst immer gemacht, also als Beispiel im PHP-Teil und Template:
PHP:
$form = new Form();

PHP:
<table>
<tr>
<td>Nickname</td>
<td><?php echo $form->textfield('text', 'nickname'); ?></td>
</tr>
</table>
 
Zurück