Smarty Forum Index Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon.

TplArray-Index über Variablen ansprechen

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: German
View previous topic :: View next topic  
Author Message
HStev
Smarty Rookie


Joined: 09 Nov 2005
Posts: 12

PostPosted: Fri Dec 09, 2005 10:50 am    Post subject: TplArray-Index über Variablen ansprechen Reply with quote

Hallo,

ich möchte ein Array welches den Template zugewiesen wurde auslesen allerdings möchte ich den Index des Array's wiederum über eine Variable ansprechen. Ist das irgendwie möglich?

Die Frage ist etwas schwer zu erklären, deshalb das folgende Beispiel was das ganze etwas besser erklären soll wie ich mir das gedacht habe.

[php:1:7d43fbf4a2]{section name=calrow start=0 loop=6 step=1}
<tr>

<td class="weekday">{$firstweek + $marty.section.calrow.index - 1}</td>

{section name=calcol start=1 loop=7 step=1}
<td class="{if $calfield.{$smarty.section.calrow.index * 7 + $smarty.section.calcol.index}.class == 1}ative{else}inaktiv{/if}">{$calfield.{$smarty.section.calrow.index * 7 + $smarty.section.calcol.index}.value}</td>

{/section}
</tr>

{/section}[/php:1:7d43fbf4a2]

bzw. in php wären das 2 verschaltete Schleifen die jeweils von 0-6 und von 1 - 7 zählen ich möchte nun hingehen und ein Array innerhalb dieser 2 Schleifen ansprechen

in PHP selbst würde das so aussehen:
[php:1:7d43fbf4a2]<?php
...
for($i1 = 0; $i1 <= 6; $i1++)
{
for($i2 = 1; $i2 <= 7; $i++)
{
echo $calfield[$i1 * 7 + $i2];
}
}?>[/php:1:7d43fbf4a2]
Back to top
View user's profile Send private message
CirTap
Smarty Pro


Joined: 04 Jun 2003
Posts: 106

PostPosted: Sun Dec 11, 2005 12:01 am    Post subject: Reply with quote

Hallo,
du kannst auch in Templates die [] syntax für Arrays verwenden und dort den Index als Variable angeben. Ob das aber auch in der Form $smarty.section.calrow.index und mit "Rechnen" geht, weiss ich grad nicht. Falls nicht, dann verwende
Code:
{assign var="i1" value=$smarty.section.calrow.index * 7 + $smarty.section.calcol.index}

für den Index. Achte darauf, dass innerhalb der Funktion {assign} die Variablen selbst keine {} brauchen/haben dürfen.
Theoretisch also so:[php:1:ddc84fae7f]{section name=calrow start=0 loop=6 step=1}
<tr>
<td class="weekday">{$firstweek + $marty.section.calrow.index - 1}</td>
{section name=calcol start=1 loop=7 step=1}

{assign var="i1" value=$smarty.section.calrow.index * 7 + $smarty.section.calcol.index}

<td class="{if $calfield[$i1]['class'] != 1}in{/if}aktiv">{$calfield[$i1]['value']}</td>
{/section}
</tr>
{/section}[/php:1:ddc84fae7f]Ich hab die wirre Syntax von {section} noch nie gerafft, von daher kann da auch ein (gedanklicker) Fehler drinstecken -- und sicherlich irgendwo ein Punkt oder Komma zuviel/zuwenig.

Vielleicht geht aber dank [] das ganze auch so (häßlich lang <g>)

{if $calfield[$smarty.section.calrow.index * 7 + $smarty.section.calcol.index]['class'] == 1}aktiv{else}inaktiv{/if}

oder war's sogar noch einfacher? ab Smarty 2.6.6 wennichnichirre
Code:
{$calfield.$i1.value}


Viel Spaß,
CirTap
Back to top
View user's profile Send private message
HStev
Smarty Rookie


Joined: 09 Nov 2005
Posts: 12

PostPosted: Wed Dec 14, 2005 9:04 am    Post subject: Reply with quote

hab was interesantes dabei festgestellt Smarty erlaubt anscheinend keine Leerfelder zwischen Op und Wert
Back to top
View user's profile Send private message
CirTap
Smarty Pro


Joined: 04 Jun 2003
Posts: 106

PostPosted: Wed Dec 14, 2005 10:56 am    Post subject: Reply with quote

Hi
HStev wrote:
hab was interesantes dabei festgestellt Smarty erlaubt anscheinend keine Leerfelder zwischen Op und Wert
also hat das mir der [] Syntax geklappt? War mir nicht ganz sicher.
Es ist möglich, dass die Flexibilität in diesem Fall etwas begrenzt ist, aber bei "normalen" Zuweisungen sind Leerzeichen eigentlich kein Problem.
Der Smarty Compiler ist ja (leider) kein Lexer und daher nicht ganz so flexibel in einigen Bereichen. Ich vermute mal, dass der reguläre Ausdruck für "Kram zwischen [ und ]" einfach etwas schlanker ist Smile

Viel Spaß,
CirTap
Back to top
View user's profile Send private message
HStev
Smarty Rookie


Joined: 09 Nov 2005
Posts: 12

PostPosted: Wed Dec 14, 2005 12:54 pm    Post subject: Reply with quote

Ja hat geklappt hab aber nun ein neues Problem und zwar hab ich ein Assoc Array für eine 8x8 große Tabelle, die Spalten werden über Buchstaben angesprochen also im Prinzip ein Schachbrett nun versuche ich das assoc Array per Buchstabe und direkt darinter die Zeilennummer anzusprechen. Die Feld bezeichnung hole ich mir über eine seperate Funktion die ich Smarty zugewiesen habe - hab sonst keine andere Möglichkeit gesehen - aber da scheiterts dann auch schon:

[php:1:554974607c]{if $SPIELFELD[{alphabeticfield number=$smarty.section.s_alphabetic_field.index+1}{$smarty.section.s_numeric_field.index+1}] != "")[/php:1:554974607c]

ps: ich möchte kein mehrdimensonales Array verwenden weil ich das über eine Klasse mit Array Access regeln möchte.

pss: sowas wie isset muss ich mir auch selbst schreiben oder?

CirTap wrote:
Hi
Es ist möglich, dass die Flexibilität in diesem Fall etwas begrenzt ist, aber bei "normalen" Zuweisungen sind Leerzeichen eigentlich kein Problem.
Der Smarty Compiler ist ja (leider) kein Lexer und daher nicht ganz so flexibel in einigen Bereichen. Ich vermute mal, dass der reguläre Ausdruck für "Kram zwischen [ und ]" einfach etwas schlanker ist Smile


nein das hab ich auch bei IF Abfragen bemerkt
Back to top
View user's profile Send private message
CirTap
Smarty Pro


Joined: 04 Jun 2003
Posts: 106

PostPosted: Wed Dec 14, 2005 1:24 pm    Post subject: Reply with quote

wie schon gesagt ist {section} nicht mein Ding und ich vermeide es wie die Pest. Meinereiner würd dies schlichtweg in PHP machen, anstatt in Smarty "rumzurechnen" -- und das mit einer so grausamen Syntax Smile

Der Inhalt der Tabelle, also die Daten, haben ja (eigentlich) erstmal nix mit deren Darstellung zu tun, weshalb das meiner Ansicht nach in den Aufgabenbereich von PHP fällt, und nicht von Smarty. Sprich, ein oder mehrere Arrays in PHP bauen, die vor-formatiert sind und die dann im Template nur noch schick dargestellt werden. Ich denke das wäre auch schneller geproggelt, als sich an dieser Stelle mit der Syntax und den Einschränkungen von Smarty rumzuärgern. Im Groben: [php:1:08f4be6744]$brett = range(1, Cool;
$brett[0] = range('A', 'H');[/php:1:08f4be6744]

Für's ABC würd ich ein einfaches (zusätzliches) Array nehmen und zuweisen, da brauchst du doch keine Funktion zu schreiben, oder?
[php:1:08f4be6744]$smarty->assign('alphabet', range('A', 'H'));[/php:1:08f4be6744]ergibt dann
[0] = 'A' .. [7] = 'H'
wenn aber der Offset [1] = 'A' sein muss, dann
[php:1:08f4be6744]$alphabet = range('A', 'H'); // 0 = 'A'
array_unshift('', $alphabet); // 0 = '', 1 = 'A'
$smarty->assign('alphabet', $spalten);[/php:1:08f4be6744]
Lass mich mal ein paar Minuten darüber hirnen. Ich melde mich dann wieder Smile

CirTap
Back to top
View user's profile Send private message
HStev
Smarty Rookie


Joined: 09 Nov 2005
Posts: 12

PostPosted: Wed Dec 14, 2005 1:39 pm    Post subject: Reply with quote

ne der Code soll sich auf wesentliche beschränken weil ich das Spielfeld mittels Templates möglichs flexibel halten möchte ... so kann man das ganze dann auch austauschen gegen ne komplette Graphik usw.
Back to top
View user's profile Send private message
CirTap
Smarty Pro


Joined: 04 Jun 2003
Posts: 106

PostPosted: Wed Dec 14, 2005 2:18 pm    Post subject: Reply with quote

na eben: Design im Template, Daten in PHP.
Also hier mal ein Schnellschuss für das "Schachbrett" [php:1:2c33ea3978]/* spalten bezeichner */
$abc = range('A', 'H');
/* "rohdaten" array 8x8 - einfach 8 x die Ziffern 1-8 */
$daten = array(
range(1, Cool,
range(1, Cool,
range(1, Cool,
range(1, Cool,
range(1, Cool,
range(1, Cool,
range(1, Cool,
range(1, Cool,
);
/* beschriftung und daten zuweisen */
$smarty->assign('ABC', $abc);
$smarty->assign('DATEN', $daten);
/* ab dafür */
$smarty->display('schachbrett.phtml');[/php:1:2c33ea3978] $daten ist die 8x8 Matrix und darin sollte JEDES Element definiert sein, wenngleich "leer" auch ok ist um im Template gestalterisch darauf zu reagieren. Aber es sollte nicht rumrechnen müssen oder prüfen, ob ein Element existiert.
[php:1:2c33ea3978]<h1>Schachbrett</h1>
<table border="1" cellpadding="0" cellspacing="0" width="480" height="480">
<thead>
<tr>
<th>&</th><th>{foreach from=$ABC key="cnum" item="ctxt"}{$ctxt}{$cnum+1}</th> <th>{/foreach}</th>
</tr>
</thead>
<tbody>
{foreach from=$ABC key="cnum" item="ctxt"}
<tr align="center" valign="middle" bgcolor="{cycle values='#ffffff,#d0d0d0'}">
<th bgcolor="white">{$ctxt}{$cnum+1}</th>
<td>{foreach from=$DATEN.$cnum key="spnum" item="sptxt"}{$sptxt}</td>
<td bgcolor="{cycle values='#ffffff,#d0d0d0'}">{/foreach}</td>
</tr>
{/foreach}
</tbody>
</table>[/php:1:2c33ea3978]Wie du siehst hab ich {foreach} genommen, aber das dürfte mit {section} genau so gehen. Der Trickist IMHO einfach nur dafür zu sorgen, dass die Datenstruktur sauber und komplett ist.

Ob du daraus jetzt einen Kalender baust, einen Stundenplan oder tatsächlich Schachzüge abbildest ist Jacke wie Hose, Hauptsache die Matrix ist in PHP immer komplett initialisiert, damit dein Template "dummdoof" nur noch entscheiden muss, ob es Inhalte gibt oder nicht.

Natürlich kannst du für die Anzeige der Inhalte auch eine Smarty-Fuktion schreiben, wenn's zu komplex wird. Diese sollte dann der Einfachheit halber den aktuellen Index und das ganze $daten-Array bekommen. Auch hierbei verlegst du die Rechenaufgaben in PHP. Selbst den Namen dieser "Formatierungfunktion" kannst du flexibel halten, indem du diesen per $smarty->register_function() festlegst.


CirTap
Back to top
View user's profile Send private message
HStev
Smarty Rookie


Joined: 09 Nov 2005
Posts: 12

PostPosted: Thu Dec 15, 2005 9:50 am    Post subject: Reply with quote

Ich hab mittlerweile auch eine Lösung allerdings etwas komplizierter

[php:1:7e0e3378fe]<table style="text-align: left;" border="0" cellpadding="0" cellspacing="0" class="schachbrett">
<tbody>
<tr>
<td>
<table style="text-align: left;" border="0" cellpadding="1" cellspacing="1" class="sb_spielfeld">
<tbody>
{if $fieldtype == "bottomblack"}
{assign var="s_numeric_start" value=0}
{assign var="s_numeric_step" value=1}
{assign var="s_alphabetic_start" value=9}
{assign var="s_alphabetic_step" value=-1}
{else}
{assign var="s_numeric_start" value=9}
{assign var="s_numeric_step" value=-1}
{assign var="s_alphabetic_start" value=0}
{assign var="s_alphabetic_step" value=1}
{/if}
{section name=s_numeric_field start=$s_numeric_start loop=8 step=$s_numeric_step}
<tr>
{section name=s_alphabetic_field start=$s_alphabetic_start loop=8 step=$s_alphabetic_step}
{SPIELFELD->SMARTY_getImage alphabetic=$alphabeticfield[$smarty.section.s_alphabetic_field.index] numeric=$smarty.section.s_numeric_field.index+1 assign="FIGUR"}
{if $smarty.section.s_numeric_field.index%2 == 0}
<td style="width: 40px; height: 40px;" class="{cycle name=class values=sb_feld_black,sb_feld_white}" onMouseOver="SetClass(this,'{cycle name=class_hover values=sb_feld_black_mover,sb_feld_white_mover}')" onMouseOut="SetClass(this,'{cycle name=class_out values=sb_feld_black,sb_feld_white}')" onClick="SetFieldValue('{$alphabeticfield[$smarty.section.s_alphabetic_field.index]}{$smarty.section.s_numeric_field.index+1}')">{if $FIGUR == FALSE} {else}<img src="{$FIGUR}">{/if}</td>
{else}
<td style="width: 40px; height: 40px;" class="{cycle name=class values=sb_feld_white,sb_feld_black}" onMouseOver="SetClass(this,'{cycle name=class_hover values=sb_feld_white_mover,sb_feld_black_mover}')" onMouseOut="SetClass(this,'{cycle name=class_out values=sb_feld_white,sb_feld_black}')" onClick="SetFieldValue('{$alphabeticfield[$smarty.section.s_alphabetic_field.index]}{$smarty.section.s_numeric_field.index+1}')">{if $FIGUR == FALSE} {else}<img src="{$FIGUR}">{/if}</td>
{/if}
{/section}
<td style="width: 20px; height: 40px;" class="sb_rand">{$smarty.section.s_numeric_field.index+1}</td>
</tr>
{/section}
<tr>
{section name=s_alphabetic_field start=$s_alphabetic_start loop=8 step=$s_alphabetic_step}
<td style="width: 40px; height: 20px;" class="sb_rand">{$alphabeticfield[$smarty.section.s_alphabetic_field.index]}</td>
{/section}
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<input maxlength="2" size="2" name="feld1" id="feld1"><input maxlength="2" size="2" name="feld2" id="feld2">[/php:1:7e0e3378fe]

[php:1:7e0e3378fe]<?php
require_once "Spielfeld.class.php";
$SPIELFELD = new Spielfeld(NULL);
$smarty->register_object("SPIELFELD", $SPIELFELD);

if (isset($_GET['fieldtype']) AND $_GET['fieldtype'] == "black")
{
$smarty->assign("fieldtype", "bottomblack");
}

$smarty->assign('alphabeticfield', range('A', 'H'));
$smarty->display("schachbrett.tpl");
?>[/php:1:7e0e3378fe]

ps: bei der IF Abzweigung für FALSE wird das HTML-Steuerzeichen für ein Leerfeld als Leerfeld angezeigt also nicht wundern das das hier leer angezeigt wird obwohls nicht leer ist Wink

pss: dein Beispiel ist mir zu sehr Codebasiert da bleibt das Template nicht mehr Dynamisch das ganze soll später vielleicht mal in Pseudo3D dargestellt werden oder was-weiß-ich-für-ne-Darstellung u. auf die Art u. Weise könnte man das Template auch komplett gegen eine Graphik tauschen usw.
Back to top
View user's profile Send private message
CirTap
Smarty Pro


Joined: 04 Jun 2003
Posts: 106

PostPosted: Thu Dec 15, 2005 12:48 pm    Post subject: Reply with quote

Hi,
da mit die "spielfeld.class.php" fehlt werde ich wohl nicht viel mit anfangen können.
Sehr viel weniger "Code" hast du auch nicht Smile
Da ist JavaScript "im Spiel" und diese PHP-Klasse.

In meinem Schnipsel werden "nur" die Daten für die Matrix aufbereitet, also 8x8 "Felder" ordentlich mit Inhalt gefüllt. Das wars dann aber.
Ob diese 64 (72) Werte dann im Template benutzt werden, oder nicht, oder daraus Grafiken "errechnet" werden, oder nicht ...
Im wahren Leben würde das natürlich auch nicht in der Hauptdatei stehen, speziell die Datenaufbereitung käme wohl auch bei mir in sowas wie Spielfeld.class.php

Gut finde ich die Idee, die Grafik aus dem Objekt zu holen, aber dort ist ja dann auch *wieder* Code im Spiel der das Design des Templates beeinflusst Smile Du müsstest also später evtl. auch diese Klasse anpassen oder umschreiben -- wo ist dann da der Gewinn? Wink
Vielleicht machst du aus dem Teil einfach ein Komponenten-Template, das wäre eingebetteter PHP-Code im TPL selbst (s. Handbuch) der speziell dort genutzt wird und dezidiert Daten/Variablen für das TPL erstellt.

Ich denke letzlich bleibt es in der Summe bei der selben "Menge Code", man kann sie dank Smarty nur an unterschiedlichen Orten unterbringen Smile -- was ein Segen und ein Fluch ist.

Viel Spaß,
CirTap
Back to top
View user's profile Send private message
HStev
Smarty Rookie


Joined: 09 Nov 2005
Posts: 12

PostPosted: Thu Dec 15, 2005 1:37 pm    Post subject: Reply with quote

ja Javascript ist nur für den HoverEffekt

die Klasse selbst macht eigentlich nichts großartiges außer die Figuren zu platzieren entweder Startaufstellung oder halt Spielstand aus DB (ist noch nicht fertig). Jede der 32 Spielfiguren ist ebenfalls eine Klasse die alle von einer abstrakten Hauptklasse erben und derzeit eigentlich nur 4 Funktionen beseitzen.

public char getFarbe() -> liefert "w" oder "b"
public string getName() -> liefert den Klassennamen "dame,bauer,laufer usw."
public string erlaubterSpielzug($f1, $f2) -> derzeit immer true da noch ohne Fuktion
public string SMARTY_getImage() -> liefert den Bildnamen zb. w_bauer.gif (dem kann doch zb. den Templatepfad voran gestellt sein vorausgesetzt die Bilder heisen in jeden Template gleich), erwartet als param den Feldbezeichner

mehr steckt da derzeit noch nicht dahinter.
Ich muss mir auch erst noch ne Factory für die Figuren bauen damit ich den Spielstand ordentlich aus der DB laden kann.
Back to top
View user's profile Send private message
CirTap
Smarty Pro


Joined: 04 Jun 2003
Posts: 106

PostPosted: Thu Dec 15, 2005 1:52 pm    Post subject: Reply with quote

Na das klingt ja nach 'nen schicken projekt, das du da vor hast, auch wenn ich keinen Plan vom Schachspielen hab; kenn zwar im groben die Regeln, aber gespielt hab ich wohl erst 10 mal in meinem Leben Smile

Mal so eine Idee: wenn das ja interaktiv wird (sein sollte) dürfte da eine Menge JS erforderlich sein, um nicht immer das Ganze Spielfeld nach jedem Zug laden zu müssen -- denk ich. Wenn nicht gleich ein Java-Applet oder Flash im im Spiel sind.

Hast du dir schon mal warme Gedanken zum Thema "AJAX" gemacht? Falls nicht, dann schau mal bei http://script.aculo.us/ vorbei, von dort kommst du zu "Prototype" (URL grade verlegt) und "Behaviour" - sehr elegante und mächtige JS-Bibliotheken.

Ich hab ein paar meiner Backendseiten mit Prototype und Behaviour erweitert (eigentlich "reduziert") und es ist einfach genial! Die Seiten "wirken" sauschnell und auch das Coden der FORM-Handler reduziert sich erheblich.

Lass hören, wenn die Seite online ist. Würd mir das Ergebnis gern mal angucken - evtl. auch 'ne PM mit einer "Test-URL" Smile

Viel Spaß,
CirTap
Back to top
View user's profile Send private message
HStev
Smarty Rookie


Joined: 09 Nov 2005
Posts: 12

PostPosted: Thu Dec 15, 2005 2:02 pm    Post subject: Reply with quote

naja in aller erster Linie ist das nur mal wieder son privat Project von mir um meine Kenntnisse etwas aufzufrischen und um mir die Zeit über die Feiertage zu vertreiben Wink

Es ist in der 1. Version nicht darauf gedacht es aktiv am Stück zu spielen d.h. 1. Spielzug kann durchaus 1-2 Tage dauern - für Leute die weniger Zeit haben - so ne Partie Schach is ja nicht eben mal in 5 Minuten gespielt. Im 2. Step kann man dann mal überleben ob man nicht n Server in C++ geschrieben und Java-Applets verwendet.

Aber davon mal abgesehen weiß ich auch noch gar nicht ob ich damit überhaupt Live gehen werde.
Back to top
View user's profile Send private message
Display posts from previous:   
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: German All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Protected by Anti-Spam ACP