Class Problem

tkausl

Gesperrt
Hallo

Habe ein Problem mit einer class bzw. einer Template-class.
Das ganze sieht so aus:

Template Object
PHP:
(
    [delimiterStart] => {
    [delimiterEnd] => }
    [t] => <HTML>
<HEAD>
<TITLE>Alle 18</TITLE>
</HEAD>
<BODY>
<TABLE BORDER="1">{verein}</TABLE>
</BODY>
</HTML>
    [templatefile] => template3.tpl.html
    [bl] => Array
        (
            [verein] => Template Object
                (
                    [delimiterStart] => {
                    [delimiterEnd] => }
                    [t] => <TR bgcolor="{bgcolor}">
 <TD><B>{pos}</B></TD>

 <TD>{name}</TD>
</TR>

                    [templatefile] => 
                    [pl] => Array
                        (
                            [bgcolor] => Array
                                (
                                    [0] => #FFFF99
                                )

                            [pos] => Array
                                (
                                    [0] => 1
                                )

                            [name] => Array
                                (
                                    [0] => verein1
                                )

                        )

                )

        )

    [pl] => Array
        (
            [verein] => Array
                (
                    [0] => Template Object
                        (
                            [delimiterStart] => {
                            [delimiterEnd] => }
                            [t] => <TR bgcolor="{bgcolor}">
 <TD><B>{pos}</B></TD>
 <TD>{name}</TD>
</TR>

                            [templatefile] => 
                            [pl] => Array
                                (
                                    [bgcolor] => Array
                                        (
                                            [0] => #FFFF99
                                        )

                                    [pos] => Array
                                        (
                                            [0] => 1
                                        )

                                    [name] => Array
                                        (
                                            [0] => verein1
                                        )

                                )

                        )

                )

        )

)


das habe ich nun in $tpl.
durch eine funktion wird nun in $tplVereine folgendes geschrieben:
$this->bl[verein] (mit return)

das problem ist jetzt wenn man mit $tplVereine->reset();
resettet wird nicht nur bl->verein->pl sondern auch pl->verein->0->pl gelöscht. das ist in PHP 4 nicht der Fall gewesen, tritt erst mit PHP 5 auf. könnt ihr mir sahen wo das problem ligt?
achja

PHP:
reset():
    function reset()
    {
        unset($this->pl);
    }



wers sich genauer angucken will, sucht mal bei google unter der "apolda simple template class"
geht unter PHP4, unter PHP5 wird wie gesagt beides gelöscht. hat jemand eine lösung?
 
das problem ist jetzt wenn man mit $tplVereine->reset();
resettet wird nicht nur bl->verein->pl sondern auch pl->verein->0->pl gelöscht

Das ist doch nur Normal, dass wenn du ein Haus einreißt die Zimmer auch verschwinden. Von der Struktur:
Objekt > pl > verein > 0 > pl
wird Objekt > pl gelöscht und dann ist natürlich auch alles was dadrunter kommt weg.
 
Zuletzt bearbeitet:
nein du verstehst das falsch.
mit dem reset sollte nicht das obere pl gelöscht werden sondern das bl->vereine->pl
in $tplvereine steht ja auch $tpl->bl->vereine und dann soll $tplvereine->pl gelöscht werden
sollte en, geht unter PHP4 auch einwandfrei. nur bei php5 wird aus einem ganz anderen teil auch etwas gelöscht
ist so wie wenn du im haus in der 1. etage bist und sagst reis das badezimmer ab und er reist das badezimmer aus etage 1 und 2 ab!
 
Dann würde ich sagen das die beiden Bäder an ein und der selben Rohrleitung hängen :confused:

Nein, wirklich. Seit PHP5 werden viele Sachen automatisch als Referenz übergeben (Quelle: http://www.usegroup.de/software/phptutorial/referenzen.html). Während PHP4 die ganzen Sachen neu deklariert, sagt PHP5 nur "da isset" und mehrere (referentielle) Variablen zeigen auf den gleichen Inhalt. Nimmt man den Inhalt weg auf den eine Variable zeigt, dann verschwinden auch alle andere, die darauf gezeigt haben.

Darauf solltest du deine Klasse untersuchen.
 
wenn ich direkt das $tplVereine mit print_r ausgebe bekomme ich auch wirklich nur den teil angezeigt. das ist ja was mich wundert. $tplVereine als ausgabe gibt alles richtig aus, $tplVereine->reset(); wobei in Reset unset($this->pl) steht nicht nur den teil aus der ausgabe löscht!
 
Ja richtig. Wie gesagt, es wird an einer Referenz liegen.
Daher informiere dich zunächst was Referenzen sind.
Du fragst mit print_r auch eine bestimmte Variable nach ihrem Wert. Verständlich das nur sie dir Antwortet, obwohl mehrere Variablen auf den Wert zeigen.

Dein Haus hat soeben mehrere Zimmer erhalten, die alle an einer Leitung hängen. Wenn du fragst wie viel Volt durch die Leitung geht kriegst du in jedem Zimmer die gleicht Antwort, aber in keinem Zimmer wirst du feststellen können wo die Leitung hergeht (daher siehst du die anderen in print_r nicht). Kapps du aber irgendwo diese Leitung (unset / reset) dann sind alle Zimmer die da dran hingen auch dunkel.
 
xD du verstehst das problem nicht, kann das sein?
die beiden pl`s die gelöscht werden haben NICHTS miteinander zutun. einer variable wird nun das ERSTE pl zugeordnet und der inhalt soll gelöscht werden, davon sollte das zweite nicht betroffen sein
die datei sieht so aus:

PHP:
<?php

define("TEMPLATE_ERR_FILE","Could not load template file.");

/**
 * Apolda Simple Template class.
 * This file is part of Apolda Web Tool Suite.
 *
 * The complete apolda classes are distributed under the
 * GNU Lesser General Public License.
 * See the lesser.txt file for details.
 *
 * @author    Ralf Geschke <ralf@kuerbis.org>
 * @copyright 2002 by Ralf Geschke
 * @version   $Id: class_template.inc.php,v 1.6 2002/07/16 09:05:07 geschke Exp $
 * @access    public
 */
class Template
{

    var $delimiterStart = "{";
    var $delimiterEnd = "}";

    var $t;

    var $templatefile;

    /**
     * Constructor function.
     * If a template filename is submitted, this function will
     * initialize the template object tree.
     *
     * @param    string $filename  Name of template file.
     * @access   public
     * @return   void
     */
    function Template($filename = "")
    {
        /* todo:
           - remove setting error messages from constructor
           ( to a base class ? )
         */
        $this->loadTemplateFile($filename);
    }

    /**
     * Set start delimiter
     * Call this function if you wish to change the default start
     * delimiter '{' to another character.
     *
     * @param    string $delim
     * @return   void
     */
    function setStartDelim($delim="{")
    {
        $this->delimiterStart = $delim;
        }

    /**
     * Set end delimiter
     * Call this function if you wish to change the default end
     * delimiter '}' to another character.
     *
     * @param    string $delim
     * @return   void
     */
    function setEndDelim($delim="}")
    {
        $this->delimiterEnd = $delim;
        }


    /**
     * Load and initialize template file.
     * This is only useful if it is not possible to
     * set a template filename by creating an instance of
     * the template class.
     *
     * @param    string $filename  Name of template file.
     * @access   public
     * @return   void
     */
    function loadTemplateFile($filename = "")
    {
        if (!$filename)
        return false;
        if ($filename)
        $this->templatefile = $filename;
        if (!$fp = @fopen($this->templatefile,'r'))
        {
        die(TEMPLATE_ERR_FILE);
        }
        $this->t = fread($fp,filesize($this->templatefile));
        fclose($fp);
        $this->_initTemplate();
    }

    /**
     * Submit a string variable as template content.
     * This is useful if your template doesn't exist as file,
     * e.g. if it is saved in a database.
     *
     * @param    string $templatestring
     * @access   public
     * @return   void
     */
    function loadTemplateContent($templatestring="")
    {
        $this->t = $templatestring;
        $this->_initTemplate();
    }

    /**
     * Parse the template.
     * This function creates the template object tree and replaces contents
     * of blocks with simple placeholders.
     *
     * @access   private
     * @return   void
     */
    function _initTemplate()
    {
        preg_match_all("/<!--\s+BEGIN\s+(.*)?\s+-->\s*\n*\s*(.*)\s*\n*\s*<!--\s+END\s+(\\1)\s+-->/ms",$this->t,$ma);
        for ($i = 0; $i < count($ma[0]); $i++)
        {
        $search = "/\s*\n*<!--\s+BEGIN\s+(" . $ma[1][$i] . ")?\s+-->(.*)<!--\s+END\s+(" . $ma[1][$i]. ")\s+-->\s*\n*/ms";
        $replace = $this->delimiterStart . $ma[1][$i] . $this->delimiterEnd;
        $this->bl[$ma[1][$i]] =& new Template();
        $this->bl[$ma[1][$i]]->loadTemplateContent($ma[2][$i]);
        $this->t = preg_replace($search,$replace,$this->t);
        }
    }

    /**
     * Fetch a block out of the template.
     * If the block exists, this function returns a Template object,
     * otherwise nothing (false).
     * When parsing the template, the blocks will removed
     * into Template objects and replaced with placeholders.
     * The name of the placeholder is identical to the name
     * of the removed block.
     *
     * @param    string $blockName
     * @access   public
     * @return   object Template or boolean false
     */
    function fetchBlock($blockName)
    {
        if (isset($this->bl[$blockName]))
        return $this->bl[$blockName];
        else
        return false;
    }

    /**
     * Assign value to an existing placeholder.
     * If this function is called multiple, the contents
     * will be added.
     *
     * The parameter $varName can be a string, an associative
     * array or a Template object.
     *
     * @param    mixed $varName
     *           Allowed types:    Requirements:
     *           string            $varValue
     *           array             Array format:
     *                             array ("name_of_placeholder" => Value,
     *                                    ... )
     *           object            Template object or any object which
     *                             returns HTML code via get() method.
     *
     * @param    string $varValue (optional)
     * @access   public
     */
    function assign($varName,$varValue=false)
    {
        if (is_array($varName))
        {
        foreach ($varName as $key => $value)
            {
            $this->pl[$key][] = $value;
            }
        }
        else
        {
        $this->pl[$varName][] = $varValue;
        }
    }

    /**
     * Delete the contents of submitted variables.
     *
     * @param    none
     * @access   public
     */
    function reset()
    {
        unset($this->pl);
    }

    /**
     * Print a template with all replacements done.
     *
     * @param    none
     * @access   public
     */
    function out()
    {
        print $this->get();
    }

    /**
     * Returns a template with all replacements done.
     *
     * @param    none
     * @access   public
     * @return   string parsed template content
     */
    function get()
    {
        if (is_array($this->pl))
        {
        foreach ($this->pl as $key => $value)
            {
            $search = $this->delimiterStart . $key . $this->delimiterEnd;
            $replaceText = "";
            for ($i = 0; $i < count($this->pl[$key]); $i++)
            {
                if (is_object($this->pl[$key][$i]))
                $replaceText .= $this->pl[$key][$i]->get();
                else
                $replaceText .= $this->pl[$key][$i];
            }
            $this->t = str_replace($search,$replaceText,$this->t);
            }
        }
        return $this->t;
    }

}
?>
und die fetchBock`s gehen in PHP4, in 5 aber wie gesagt nichtmer!

die testdatei:

PHP:
<?php

include('class_template.inc.php');

$tpl = new Template('template3.tpl.html');

$vereine = array('verein1', 'verein2', 'verein3',
                'verein4', 'verein5', 'verein6',
                'verein7', 'verein8', 'verein9',
                'verein10', 'verein11', 'verein12',
                'verein13', 'verein14', 'verein15',
                'verein16', 'verein17', 'verein18',);

$tplVerein = $tpl->fetchBlock('verein');
for ($i=0; $i<count($vereine); $i++)
{
    $tplVerein->assign('bgcolor', $i%2 ? '#FFFFCC' : '#FFFF99');
    $tplVerein->assign('pos', ($i+1));
    $tplVerein->assign('name', $vereine[$i]);
    $tpl->assign('verein', $tplVerein);
print_r($tpl);
    $tplVerein->reset();
print_r($tpl);
}
$tpl->out();

?>

und die tpl datei:

HTML:
<HTML>
<HEAD>
<TITLE>Alle 18</TITLE>
</HEAD>
<BODY>
<TABLE BORDER="1">
<!-- BEGIN verein -->
<TR bgcolor="{bgcolor}">
 <TD><B>{pos}</B></TD>
 <TD>{name}</TD>
</TR>
<!-- END verein -->
</TABLE>
</BODY>
</HTML>

wie du vor und nach dem reset siehst wird das zweite pl, was außer dem namen nichts mit dem in bl zutun hat mitgelöscht. wie gesagt php4 hat alles richtig gemacht, php5 löscht einfach alles was es mit pl findet.
und mir ist eig. auch egal woher der fehler kommt. brauche halt eine lösung wie man den fehler umgehen kann, sodass es wieder einwandfrei funktioniert wie auch bei php4!
 
Zurück