Anzeige

Templateklasse erweitern

Templateklasse erweitern | PSD-Tutorials.de

Erstellt von bad2be, 07.09.2008.

  1. bad2be

    bad2be Aktives Mitglied

    Dabei seit:
    14.12.2005
    Beiträge:
    641
    Geschlecht:
    männlich
    Ort:
    Ludwigshafen am Rhein
    Templateklasse erweitern
    Grüss Euch

    Ich habe eine Templateklasse nach- naja- Smartyart. Heist, ich setze in meinen html Templates Platzhalter und lasse Sie dann von PHP assignen. Die Platzhalter sehen in etwa so aus:

    HTML:
    1. <p> hier wird etwas {-ersetzmich-}
    Dann kommen aufruf meiner Templateklasse (tmp) und ersetzen, dies sieht in etwa so aus:
    PHP:
    1.  
    2. $tmp=new tmpcls();
    3. $tmp->assign("ersetzmich", "ersetzt");
    4.  
    Ich poste jetzt die gesamte Templateklasse nicht, ich denke die Vorgehensweise sollte klar sein.
    Jetzt aber nach der Einführung zu meinem Problem:
    Ich möchte das ganze etwas dynamischer gestalten und dem Anwender die Möglichkeit geben eine definierte Syntax zu verwenden um Objekte selbst einzufügen ohne viel daavon zu verstehen.
    Da ganze sollte in etwa so aussehen:

    Einfügen eines Bildes:

    {-image 800 600 bild.jpg-}

    wobei eben 'image' von der Klasse erkannt werden soll und die folgenden Parameter (Breite, Höhe, Pfad) an die Methode, die später das Bild einsetzt übergeben werden soll.
    Die Trennung der Parameter und die spätere Übergabe sollten kein Problem darstellen, meine Frage liegt wo anders.
    In der Bisherigen Vorgehensweise weiss ich ja in meinem Dokumentenaufbau, das etwas ersetzt werden soll und kann entsprechend die Klasse und darin enthaltene Methoden aufrufen. Wenn ich aber dem Anwender die Mgl. geben möchte und den von ihm erstellten Source bsp in einer DB ablege, so weiss ich ja bei der Erstellungsprozedur noch nicht was ggf ersetzt werden soll.

    Folgende Überlegungen habe ich bereits hinter mir:

    -Durchlauf sämtlicher Prozeduren und entsprechendes Abarbeiten:
    PHP:
    1. if(substr($string, 2, 6)=='image'){ersetze durch image}
    2. elseif(substr($string, 2, 5)=='flash'){ersetze durch flash}etc...
    3.  
    Problem: für das Erkennen des Startindex müsste ich im String nach allen {- suchen
    Nachteil: langsam

    -rekursives Durchlaufen des gesamten Stings aus der Klasse hinaus (abarbeiten der Parameter welche zB in einem Array gespeichert sind)
    Problem: bei genügend Möglichkeiten (flashobjekt, Bild, Audidatei, Video, etc)
    wird das ganze schon ziemlich lang)
    Nachteil: wieder langsam

    Mit weiteren Überlegungen möchte ich Euch nicht langweilen, ich grübel da jetzt schon einige Tage dran rum.
    Hat da jemand vielleicht eine Idee wie so etwas schöner abgehandelt werden könnte?
    Entschuldigt bitte meinen Ellenlangen Text, ich wollte Euch nur mal einen Einblick in das bisher bestehende geben um mich besser zu verstehen.
    Vielen Dank im Voraus,

    LG B2B

    Edit:
    Achja, preg_match_all() war noch in der Überlegung, dabei habe ich aber das Problem, das Suchmuster zu erstellen und die folgenden Parameter zu finden.
     
    Zuletzt bearbeitet: 07.09.2008
    #1      
  2. Top_Gun

    Top_Gun Aktives Mitglied

    Dabei seit:
    24.07.2008
    Beiträge:
    965
    Geschlecht:
    männlich
    Templateklasse erweitern
    AW: Templateklasse erweitern

    Ist in der Templatklasse eine Funktion zum Ersetzen von Include Befehlen vorhanden? Wenn ja kannst du die erweitern...

    Wenn du die Klasse mal postest schau ich mir das mal an...
     
    #2      
  3. bad2be

    bad2be Aktives Mitglied

    Dabei seit:
    14.12.2005
    Beiträge:
    641
    Geschlecht:
    männlich
    Ort:
    Ludwigshafen am Rhein
    Templateklasse erweitern
    AW: Templateklasse erweitern

    Nein, zum includen it noch nichts vorhanden, is aber auch noch im Hinterkopf.
    Die Klasse:
    PHP:
    1. <?php
    2. class Template {
    3.   var $vorlage;
    4.   function Template($vorlage) {
    5.     $this->setVorlage($vorlage);
    6.   }
    7.   function setVorlage($vorlage) {
    8.     if(file_exists($vorlage)&&substr($vorlage, -3)=='htm') {
    9.       $fp = fopen($vorlage, "r");
    10.       $text = fread($fp, filesize($vorlage));
    11.       fclose($fp);
    12.       $this->vorlage = $text;
    13.     } else {
    14.       $this->vorlage = $vorlage;
    15.     }
    16.   }
    17.   function setContent($param1, $param2="") {
    18.     if(!is_array($param1) && $param2 && !is_array($param2)) {
    19.       $this->setOne($param1, $param2);
    20.     } elseif (is_array($param1) && !$param2){
    21.       $this->setArray($param1);
    22.     } elseif (!is_array($param1) && is_array($param2)) {
    23.       $this->setLoop($param1, $param2);
    24.     } else {
    25.       die("Parameter in der Klasse Vorlage wurden falsch übergeben.");
    26.     }
    27.   }
    28.   function setOne($suchWort, $substitution) {
    29.     $this->vorlage = str_replace("{".$suchWort."}",
    30.                                  $substitution,
    31.                                  $this->vorlage);
    32.   }
    33.   function setArray($Array) {
    34.     foreach ($Array as $suchWort => $substitution) {
    35.       $this->setOne($suchWort, $substitution);
    36.     }
    37.   }
    38.   function setLoop($schleife, $Array) {
    39.     $str = explode("<!--anfang:".$schleife."!-->",
    40.                    str_replace("<!--ende:".$schleife."!-->",
    41.                                "<!--anfang:".$schleife."!-->",
    42.                                $this->vorlage));
    43.     $teilStr = "";                          
    44.     foreach ($Array as $element) {
    45.       $teilVorlage = new Template($str[1]);
    46.      
    47.       $teilVorlage->setArray($element);
    48.       $teilStr .= $teilVorlage->vorlage;
    49.     }
    50.     $this->vorlage = $str[0] . $teilStr . $str[2];
    51.   }
    52. }
    53. ?>
    54.  
    Im Moment knobel ich an:
    PHP:
    1. $tmp = preg_replace( '/<!--(.*?)--!>/', '', $tmp );
    So wirklich will das aber noch nicht. Kommt davon wenn man alles autodidaktich macht :)
     
    #3      
  4. Christian

    Christian verpeilt & verschallert

    Dabei seit:
    03.03.2005
    Beiträge:
    853
    Geschlecht:
    männlich
    Kameratyp:
    Canon EOS 300D
    Templateklasse erweitern
    AW: Templateklasse erweitern

    Bitte denk dran an die Metazeichen des regulären Ausdrucks zu denken!

    PHP: quotemeta - Manual

    und denke auch an die Modifikatoren. In deinem letzten Fall solltest Du an /<!--(.*?)--!>/s denken

    denken ist ein tolles Wort.
     
    Zuletzt bearbeitet: 08.09.2008
    #4      
  5. Top_Gun

    Top_Gun Aktives Mitglied

    Dabei seit:
    24.07.2008
    Beiträge:
    965
    Geschlecht:
    männlich
    Templateklasse erweitern
    AW: Templateklasse erweitern

    Mal abgesehen davon, dass dieser Code
    PHP:
    1. $tmp=new tmpcls();
    2. $tmp->assign("ersetzmich", "ersetzt");
    </span></span>
    nicht zu der Klasse gehört, finde ich den Code recht unübersichtlich und starr, aber das muss ja jeder selber wissen.

    Das was du vorhast ist ja so etwas wie ein BBCode, dazu findest du im Netz einige Anleitungen zum selber schreiben...

    Ich würde neben einem eindeutigen Platzhalteranfang zB "{media" noch ein Attribut einfügen welches den Typ bestimmt. Ebenfalls über Attribute kannst du auch die Größe, Breite und den Dateinamen mitgeben, so dass dein Platzhalter so aussehen könnte:

    {-m typ="bild" attribut1="50" attribut2="100" file="logo.png"-}

    Den String findest du am besten mit preg_match und ner Schleife über das Typattribut kannst du dann auswählen in was das ganze ersetzt werden soll... (so auch beim Include)

    Ich bin schon am basteln, mal schauen ob ich es hinbekomme...

    Edit: Geschafft... war ne schöne Herausforderung... Wenn du es irgendwann überdrüssig bist es zu versuchen oder zu verzweifeln kann ich das gerne posten, aber erstmal lass ich dich alleine...
     
    Zuletzt bearbeitet: 08.09.2008
    #5      
  6. bad2be

    bad2be Aktives Mitglied

    Dabei seit:
    14.12.2005
    Beiträge:
    641
    Geschlecht:
    männlich
    Ort:
    Ludwigshafen am Rhein
    Templateklasse erweitern
    AW: Templateklasse erweitern

    recht haste, war auch nur zur Veranschaulichung. Die klasse sollte natürlich mit
    PHP:
    1. $tmp=new template();
    aufgerufen werden und assign durch z.Bsp.
    PHP:
    1. setContent($array);
    ersetzt werden wenn wir ein assoziatives übergeben möchten.

    Aua und ich war so stolz :)

    Grrr... durft mich die letzten Tage mit anderem Gedöhns rumschlagen und komme erst heute wieder dazu. Ein kurzer Zwischenbericht mit Typenvergewaltigung und wahrscheinlich für Profis ein Greul:

    Ich versuche jetzt also über preg_replace(); die einzelnen Teile durch eine Methode ersetzen zu lassen:
    PHP:
    1.  
    2. <?php
    3. function convert($var){
    4.     return gettype($var).' '.$var.'<br />';
    5. }
    6. $tmp= '<!--pic foo bar 1--!><!--mvi foo bar 2--!><!--pic foo bar 1--!>';
    7. $tmp = preg_replace( '/<!--(.*?)--!>/', convert('$1'), $tmp );
    8. echo ($tmp);
    9. ?>
    10.  
    erzeugt folgende Ausgabe:

    string pic foo bar 1
    string mvi foo bar 2
    string pic foo bar 1​

    Den Typen lasse ich ausgeben, da ich vorhabe die Übergabe zu zerhäckseln (in ein array) und anhand des ersten Index switchen zu lassen welche methode ausgeführt werden soll. Leider funktionieren weder explode() noch split();obwohl der empfangene Typ wohl ein string zu sein scheint.
    PHP:
    1.  
    2. function convert($var){
    3.     $arr=explode(" ",$var);
    4.     return $arr[0];
    5. }
    6.  
    Sollte ja nach meiner Logik
    pic mvi pic​
    zurückgeben, gibt aber
    pic foo bar 1mvi foo bar 2pic foo bar 1​
    aus.
    Naja, das is der Stand der Dinge, vielleicht kann mir Bitte mal jemand auf den Hinterkopf klopfen wo ich jetzt schon wieder rumspinne :)

    Vielen Dank im Voraus

    LG B2B


    Edit:
    Au weia... mir fällt grad auf das ich wohl sch** bau.. was mach ich nur wenn der Code gekapselt ist?
    also wenn es tatsächlich mal ein Modul geben sollte in dem
    <!--div foo <!--pic foo bar 1--!> bar --!> vorkommt.
     
    Zuletzt bearbeitet: 09.09.2008
    #6      
  7. saila

    saila Moderatorle

    Dabei seit:
    21.06.2006
    Beiträge:
    2.239
    Geschlecht:
    männlich
    Ort:
    50°48'23.69" N 7°14'22.19" O
    Software:
    Eclipse, PHP5 OO, MySQL5, CSS(auch Barrierefrei), JS, Symfony
    Templateklasse erweitern
    AW: Templateklasse erweitern

    Hi,

    mal eine ganz bescheuerte Frage, warum nimmst du nicht direkt Smarty? Da ist alles drin was man braucht statt selbst das Rad neu zu erfinden. Den einzigsten Unterschied ist der Platzhalter - statt Smartyart # Ansonsten kannst du ja in der Smarty-Template-Engine den Platzhalter ändern.
    Wem Smarty nicht passt, hat ja noch die Fast-Template-Engine zur Verfügung...... - wenn es noch schneller gehen soll.
     
    Zuletzt bearbeitet: 09.09.2008
    #7      
  8. bad2be

    bad2be Aktives Mitglied

    Dabei seit:
    14.12.2005
    Beiträge:
    641
    Geschlecht:
    männlich
    Ort:
    Ludwigshafen am Rhein
    Templateklasse erweitern
    AW: Templateklasse erweitern

    Grüss Ditsch
    Naja, zum einen ist Smarty schon ziemlich aufgeblasen und zum anderen würde ich eben gerne verstehen was da so von statten geht.Fast-Template-Engine werde ich mir auf jeden Fall mal anschaun, danke Für den Tipp.
    Eine kleine Tempalteklasse hab ich aber ja schon, diese wollte ich eben nur erweitern.
    Die einzige Frage ist also,
    Wie bekomme ich durch
    preg_replace( '/<!--(.*?)--!>/', convert('$1'), $tmp );
    die Funktion convert() so aufgerufen, das ich mit den zwischen <!-- und --!> liegenden werten arbeiten kann.

    LG B2B

    Edit:

    Ich glaube ich bin auf dem richtigen Weg:
    PHP:
    1.  
    2. function convert($var){
    3.     $type=gettype($var[1]);
    4.     $arr=explode(" ",$var[1]);
    5.     print_r($arr);    
    6. }  
    7. $tmp= '<!--pic foo bar 1--!>';
    8. $tmp = preg_replace_callback( '/<!--(.*?)--!>/','convert', $tmp );
    9. ?>
    10.  
    11.  
    Werd mich aber glaub nochmal melden.

    LG B2B
     
    Zuletzt bearbeitet: 09.09.2008
    #8      
  9. Top_Gun

    Top_Gun Aktives Mitglied

    Dabei seit:
    24.07.2008
    Beiträge:
    965
    Geschlecht:
    männlich
    Templateklasse erweitern
    AW: Templateklasse erweitern

    Ja du bist mit der Callback auf dem richtigen Weg ;)

    Nen Placeholder in nem Placeholder... hmmm sollte so etwas möglich sein?! dann müsste man das ganze ja rekursiv gestalten... oder?


    @saila: wir erfinden das rad neu, um es auf unsere bedürfnis anzupassen, etwas zu lernen und zu verstehen... schaden kann das ja nicht...
     
    #9      
  10. Christian

    Christian verpeilt & verschallert

    Dabei seit:
    03.03.2005
    Beiträge:
    853
    Geschlecht:
    männlich
    Kameratyp:
    Canon EOS 300D
    Templateklasse erweitern
    AW: Templateklasse erweitern

    Da hast Du gar nicht mal so unrecht, Top_Gun.
    Es hilft beim Verstehen in der Tat ungemein.
    Ich hab früher für ein Projekt ein Platzhalter-im-Platzhalter Script gebaut.
    PHP:
    1. <?
    2.    
    3.  function array_dbl_cast( $array ){
    4.     foreach( $array as $key => $value ){
    5.         $ret[str_replace(',','.',$key)] = $value;
    6.     }
    7.     return $ret;
    8.  }
    9.  ini_set('memory_limit', '2048M');
    10. /**
    11.  * Callbackfunktion für create_title()
    12.  *
    13.  * @return string
    14.  */
    15. function callback_var($treffer){
    16.     global $sql,$CAO_ID;
    17.    
    18.     #Tabellen auf die der Zugriff gestattet ist.
    19.     $AllowedTables  = array('VARS', 'CAO', 'GRUND');
    20.    
    21.     if(preg_match("/::/si",$treffer[0])){
    22.         #Workaround ADDED 29.04.2008 - 10:51
    23.         $ftTemp = explode("::",$treffer[0]);
    24.         $treffer[1] = substr($ftTemp[0],1);
    25.         $treffer[2] = substr($ftTemp[1],0,-1);
    26.         #</ADDED>
    27.        
    28.         $ft = array($treffer[1],$treffer[2]);//explode("::",$treffer[1]);
    29.        
    30.         #Workaround ADDED 29.04.2008 - 10:52
    31.         if (strlen($ft[0]) < 1 || strlen($ft[1]) < 1) return $treffer[0]; // Sollte sich doch eine Nichtvariable eingeschlichen haben
    32.         #</ADDED>
    33.        
    34.         #Zugriff erlaubt?
    35.         if(!in_array(strtoupper($ft[1]), $AllowedTables)) return $treffer[0];
    36.        
    37.     }else{ // Sollte sich eine Nichtvariable ins Schema eingeschlichen haben
    38.         return $treffer[0];
    39.     }
    40.     if(sizeof($ft)<2 || sizeof($ft)>2){
    41.         return $treffer[0];
    42.     }
    43.    
    44.     $field  = $ft[0];
    45.     $table  = $ft[1];
    46.     $IndexFields    = array("cao"=>"CAO_ID","grund"=>"ARTIKEL_ID", "vars"=>"ART_ID");
    47.    
    48.     if(strtoupper($field) == "TYP" && strtoupper($table) == "GRUND")
    49.         $field = ( $sql->Query( "SELECT GROESSE FROM z_artikel_cao WHERE CAO_ID = '$CAO_ID' LIMIT 1", "GROESSE" ) == 1 )
    50.                 ? "TYP"
    51.                 : "TYP_MEHRZAHL";
    52.    
    53.     $select = "SELECT ".$field." FROM z_artikel_{$table} WHERE ".$IndexFields[$table]."='$CAO_ID' LIMIT 1";
    54.     return $sql->Query($select, $field) ;
    55. }
    56.  
    57. function link_callback( $treffer ){
    58.     global $sql;
    59.    
    60.     switch ( true ):
    61.        
    62.         case ( strlen( $treffer[1] ) < 1 || strlen( $treffer[2] ) < 1):
    63.             return $treffer[0];
    64.         break;
    65.        
    66.         case ( strlen( $treffer[1] ) >= 1 && strlen( $treffer[2] ) >= 1 && defined( 'CALLBACK_FOR' ) && function_exists( CALLBACK_FOR . '_token' ) && !preg_match("/GRPLINK/i", $treffer[1])):
    67.  
    68.             $platforms  = array('ebay'=>
    69.                                     array(
    70.                                         'table'=>'z_artikel_ebay_titel',
    71.                                         'field'=>'EBAY_TITEL',
    72.                                         'index'=>'ARTIKEL_ID' ),
    73.                                 'osc'=>
    74.                                     array(
    75.                                         'table'=>'z_artikel_cao',
    76.                                         'field'=>'SHOP_ID',
    77.                                         'index'=>'CAO_ID' )
    78.                             );
    79.  
    80.             $artikel_id = $sql->Query("SELECT CAO_ID FROM z_artikel_cao WHERE ARTNUM LIKE '". $treffer[1] ."' LIMIT 1", "CAO_ID");
    81.            
    82.             if($sql->getLastNumRows() !== 1){   return $treffer[2]; }
    83.            
    84.             $pl         = $platforms[ strtolower( CALLBACK_FOR ) ];
    85.            
    86.             $strToken   = $sql->Query( 'SELECT '. $pl['field'] .' FROM '. $pl['table'] .' WHERE '. $pl['index'] .' = "'. $artikel_id .'" LIMIT 1', $pl['field'] );
    87.            
    88.             if( strlen( $strToken ) < 1 || $strToken == '-1' || $strToken == ''){   return $treffer[2]; }
    89.            
    90.             $call   = CALLBACK_FOR . '_token';
    91.            
    92.             return '<a href="'. $call( $strToken ) .'" '.(($treffer[3]=='ZUSATZ')?'':$treffer[3]).'>'.$treffer[2].'</a>';
    93.         break;
    94.        
    95.         case ( strlen( $treffer[1] ) >= 1 && strlen( $treffer[2] ) >= 1 && defined( 'CALLBACK_FOR' ) && function_exists( CALLBACK_FOR . '_category_link' ) && preg_match("/GRPLINK/i", $treffer[1])):
    96.  
    97.             $call   = CALLBACK_FOR.'_category_link';
    98.             $artnum = explode('::', $treffer[1]);
    99.             return ($call( $artnum[1], 1 ) == false) ? $treffer[2] : '<a href="'. $call( $artnum[1], 1 ) .'" '.(($treffer[3]=='ZUSATZ')?'':$treffer[3]).'>'.$treffer[2].'</a>';
    100.            
    101.         break;
    102.        
    103.         default:
    104.             return $treffer[2];
    105.         break;
    106.        
    107.     endswitch;
    108. }
    109. /**
    110.  * Erstellen einer Artikel-Übersichtstabelle
    111.  *
    112.  * @param array $xal (xml attribute list)
    113.  * @return string
    114.  */
    115. function table( $xal ){
    116.     global $sql;
    117.     if(!$sql){
    118.         die(__LINE__." Class sql not found!");
    119.     }
    120.  
    121.     $grps   = explode(",",$xal['src']);
    122.        
    123.     if( sizeof( $grps ) > 0 ){
    124.         foreach( $grps as $grp_ids ){
    125.             if( strlen( $grp_ids ) > 0 ):
    126.                 $art_grp        = explode(" ", $grp_ids);
    127.                 $art_grp_ids[]  = $art_grp[0];
    128.             endif;
    129.         }
    130.     }else{
    131.         $grp    = explode(" ", $xal['src']);
    132.         $art_grp_ids[]  = $grp[0]; #Hier keine Sicherheitsfrage nach der Stringlänge, da das hier die reine Eingabe src="grp" ist
    133.     }
    134.    
    135.     $ident          = implode('_',$art_grp_ids).'_'.CALLBACK_FOR;
    136.     $ident_result   = $sql->Query('SELECT * FROM z_artikel_gruppenuebersichten WHERE IDENT LIKE "'.$ident.'" AND X LIKE "'.$xal['x'].'" AND Y LIKE "'.$xal['y'].'"');
    137.     $numRows        = $sql->getLastNumRows();
    138.     if( $numRows < 1 ){
    139.         $lister         = sql::indexer( 'c.ARTNUM', $art_grp_ids, 'OR', ' LIKE', null, '%');
    140.         $grpListQuery   = '
    141.                             SELECT c.ARTNUM, c.GROESSE, c.ME_EINHEIT, c.KURZTEXT, g.*
    142.                             FROM z_artikel_cao c, z_artikel_grund g
    143.                             WHERE              
    144.                                 '.$lister.'
    145.                             AND c.CAO_ID = g.ARTIKEL_ID
    146.                             AND ( c.TEILMENGE_VON LIKE "%|%" OR c.TEILMENGE_VON LIKE "" )
    147.                             AND c.TEILMENGE_VON2 LIKE ""
    148.                             ORDER BY ARTNUM ASC';
    149.  
    150.        
    151.         $x_axis_ident_q = 'SELECT * FROM z_artikel_bezeichner WHERE BEZ_ID = "'.$xal['x'].'"';
    152.         $y_axis_ident_q = 'SELECT * FROM z_artikel_bezeichner WHERE BEZ_ID = "'.$xal['y'].'"';
    153.        
    154.         $gruppenartikel     = $sql->getSqlRes($grpListQuery, null, 'ARTIKEL_ID');
    155.         $x_axis_ident_res   = $sql->Query($x_axis_ident_q);
    156.         $y_axis_ident_res   = $sql->Query($y_axis_ident_q);
    157.        
    158.         if( sizeof( $gruppenartikel ) > 0):
    159.             foreach( $gruppenartikel as $artikel ){
    160.                 $x_found = $y_found = false;
    161.                 foreach( $artikel as $feldname => $artikelfeld ){
    162.                     if( strpos( $feldname, 'BEZ_ID') !== false ){
    163.                         if( $artikelfeld == $xal['x'] && !$x_found){
    164.                             $ident_me['x'][$artikel[str_replace('_BEZ_ID','',$feldname)]][] = $artikel['ARTIKEL_ID'];
    165.                             $ItemCoords[$artikel['ARTIKEL_ID']]['x']    = $artikel[str_replace('_BEZ_ID','',$feldname)];
    166.                             $UsedItemTypes[$artikel['TYP_MEHRZAHL']]    = true;
    167.                             $x_found=true;
    168.                         }elseif( $artikelfeld == $xal['y'] && !$y_found){
    169.                             $ident_me['y'][$artikel[str_replace('_BEZ_ID','',$feldname)]][] = $artikel['ARTIKEL_ID'];
    170.                             $ItemCoords[$artikel['ARTIKEL_ID']]['y']    = $artikel[str_replace('_BEZ_ID','',$feldname)];
    171.                             $UsedItemTypes[$artikel['TYP_MEHRZAHL']]    = true;
    172.                             $y_found=true;
    173.                         }
    174.                     }
    175.                 }
    176.             }
    177.  
    178.             $x_axis_array   = array_dbl_cast($ident_me['x']);
    179.             $y_axis_array   = array_dbl_cast($ident_me['y']);
    180.             ksort($x_axis_array);
    181.             ksort($y_axis_array);
    182.            
    183.             if( !isset( $xal['width'] ) ):
    184.                 $xal['width']   = '100%';
    185.             endif;
    186.    
    187.            
    188.             $arr__col_width_unit    = preg_split('/[\d]+/i', $xal['width']);
    189.             $arr__col_width_raw = preg_split('/[^\d]+/i', $xal['width']);
    190.            
    191.             $col_width_unit = $arr__col_width_unit[1];
    192.             $col_width_raw  = $arr__col_width_raw[0];
    193.            
    194.             $x_ax_headers   = array_keys($x_axis_array);
    195.            
    196.             $single_col_width       = floor($col_width_raw/(sizeof($x_ax_headers)+2));
    197.             $single_col_width_str   = " width='". $single_col_width . $col_width_unit ."' ";
    198.             switch( CALLBACK_FOR ):
    199.                 case 'osc':
    200.                     $id     = 'get_osc_id';
    201.                     $token  = 'osc_token';
    202.                     $title  = 'osc_description';
    203.                     if(!function_exists('osc_description')){
    204.                         function osc_description($id){
    205.                             global $sql;
    206.                             $result = $sql->Query('Select KURZTEXT FROM z_artikel_cao WHERE CAO_ID ="'.$id.'" LIMIT 1', 'KURZTEXT');
    207.                             return $result;
    208.                         }
    209.                     }
    210.                 break;
    211.                 case 'ebay':
    212.                     $id     = 'get_ebay_title';
    213.                     $token  = 'ebay_token';
    214.                     $title  = 'get_ebay_title';
    215.                 break;
    216.             endswitch;
    217.             $return  = '<script type="text/JavaScript">
    218.     var x_len   = '.sizeof($x_axis_array).';
    219.     var y_len   = '.sizeof($y_axis_array).';
    220.     function markme_'.$ident.'(t){
    221.     /*  var x1  = t.id.split("_");
    222.         var x2  = x1[0].split("x");
    223.         var x   = x2[0];
    224.         var y   = x2[1];
    225.    
    226.    
    227.         //horizontal markieren
    228.         for ( var progress = 1; progress <= x_len; progress++ ){
    229.             document.getElementById(progress+"x"+y+"_'.$ident.'").style.backgroundColor="#E6E6E6";
    230.         }
    231.         //vertikal markieren
    232.         for ( var progress = 1; progress <= y_len; progress++ ){
    233.             document.getElementById(x+"x"+progress+"_'.$ident.'").style.backgroundColor="#E6E6E6";
    234.         }*/
    235.         t.style.backgroundColor = "#E7E7E7";
    236.     }
    237.     function unmarkme_'.$ident.'(t){
    238.     /*  var x1  = t.id.split("_");
    239.         var x2  = x1[0].split("x");
    240.         var x   = x2[0];
    241.         var y   = x2[1];
    242.    
    243.    
    244.         //horizontal markieren
    245.         for ( var progress = 1; progress <= x_len; progress++ ){
    246.             document.getElementById(progress+"x"+y+"_'.$ident.'").style.backgroundColor="#FFFFF";
    247.         }
    248.         //vertikal markieren
    249.         for ( var progress = 1; progress <= y_len; progress++ ){
    250.             document.getElementById(x+"x"+progress+"_'.$ident.'").style.backgroundColor="#FFFFFF";
    251.         }*/
    252.         t.style.backgroundColor = "#FFFFFF";
    253.     }
    254.     </script>
    255.        
    256.         ';
    257.             $return .= '<table {param}>'.PHP_EOL;
    258.             $return .= "\t<tr>".PHP_EOL;
    259.             $return .= "\t\t<td ". $single_col_width_str ." >&nbsp;</td>".PHP_EOL;
    260.             $return .= "\t\t<td ". $single_col_width_str ." style='text-align:center; background-color:#E6E6E6;'><a href='#' title='".$y_axis_ident_res[0]['NAME']."'>".$y_axis_ident_res[0]['KURZTEXT']."</a></td>".PHP_EOL;
    261.             $return .= "\t\t<td ". $single_col_width_str ." colspan='".sizeof($x_ax_headers)."' style='text-align: center;'>".utf8_encode("Übersicht für: ".implode(', ', array_keys($UsedItemTypes)))."</td>".PHP_EOL;
    262.             $return .= "\t</tr>".PHP_EOL;
    263.            
    264.             ########################################################
    265.             # Horizontale Auflösung
    266.             ########################################################
    267.             $return .= "\t<tr>".PHP_EOL;
    268.             $return .= "\t\t<td ". $single_col_width_str ." style='text-align:center; background-color:#E6E6E6;'><a href='#' title='".$x_axis_ident_res[0]['NAME']."'>".$x_axis_ident_res[0]['KURZTEXT']."</a></td>".PHP_EOL;
    269.             $return .= "\t\t<td ". $single_col_width_str ." style='text-align:center; background-color:#A2A2A2;'>&nbsp;</td>".PHP_EOL;
    270.             foreach($x_ax_headers as $x_ax_head){
    271.                 $return .= "\t\t<td ". $single_col_width_str ." style='text-align:center; background-color:#E6E6E6;'>".str_replace('.',',',$x_ax_head)."</td>".PHP_EOL;
    272.             }
    273.             $return .= "\t</tr>".PHP_EOL;
    274.            
    275.             ########################################################
    276.             # Vertikale Aufläösung
    277.             ########################################################
    278.             $y_index    = 0;
    279.             foreach( $y_axis_array as $y_ax_head => $y_ax_key ){
    280.                 if( sizeof($y_ax_key) > 0 ){
    281.                     $y_index++;
    282.                     $x_index = 0;
    283.                     $return .= "\t<tr>".PHP_EOL;
    284.                     $return .= "\t\t<td ". $single_col_width_str ." >&nbsp;</td>".PHP_EOL;
    285.                     $return .= "\t\t<td  ". $single_col_width_str ." style='text-align:center; background-color:#E6E6E6;'>".str_replace('.',',',$y_ax_head)."</td>".PHP_EOL;
    286.                     foreach( $x_axis_array as $x_temp__){
    287.                         $x_index++;
    288.                         $found = false;
    289.                         foreach($x_temp__ as $x_products_id){
    290.                             if( in_array( $x_products_id, $y_ax_key ) && !$found){
    291.                                 $found[] = $x_products_id;
    292.                             }
    293.                         }
    294.                         if( $found ){
    295.                             $return .= "\t\t<td ". $single_col_width_str ." style='text-align:center;' id='{$x_index}x{$y_index}_{$ident}' onMouseOver='markme_{$ident}(this);' onMouseOut='unmarkme_{$ident}(this);'>";
    296.                             foreach($found as $found_id){
    297.                                 $return .= "<a target='viewItem' href='". $token($id($found_id)) ."' title='".$title($found_id)."'>".$ItemCoords[$found_id]['x']."x".$ItemCoords[$found_id]['y']."</a> <br />";
    298.                             }
    299.                             $return .= "</td>".PHP_EOL;
    300.                         }else{
    301.                             $return .= "\t\t<td ". $single_col_width_str ."  id='{$x_index}x{$y_index}_{$ident}' onMouseOver='markme_{$ident}(this);' onMouseOut='unmarkme_{$ident}(this);'>&nbsp;</td>".PHP_EOL;
    302.                         }
    303.                     }
    304.                     $return .= "\t</tr>".PHP_EOL;
    305.                 }
    306.             }
    307.             $return .= "</table>".PHP_EOL;
    308.             $sql->insert_update('z_artikel_gruppenuebersichten', array('TABLE_STR'=>addslashes(utf8_decode($return))),"IDENT LIKE '$ident'\r\n\tAND X LIKE '{$xal['x']}'\r\n\tAND Y LIKE '{$xal['y']}'", array('addToInsert'=>array('IDENT'=>$ident,'X'=>$xal['x'],'Y'=>$xal['y'])));
    309.             unset($xal['src']);
    310.             unset($xal['y']);
    311.             unset($xal['x']);
    312.            
    313.            
    314.             //Zusatzparameter für <table>Kopf auswerten und einfügen
    315.             if( sizeof($xal) > 0): // wenn nach dem Löschen der vordefinierten Variablen noch was übrig ist
    316.                 $param_str  = null;
    317.                 foreach($xal as $parameter_name => $parameter_value){
    318.                     $param_str  .= " ".$parameter_name."='".str_replace("'",'"',$parameter_value)."' "; //zwei-gestrichene Anführungszeichen erzwingen (evtl wichtig bei JScript)
    319.                 }
    320.                 $return = str_replace("{param}",  $param_str, $return );
    321.             endif;
    322.             return $return;
    323.         endif;
    324.         return false;
    325.     }else{
    326.         $return     = $ident_result[0]['TABLE_STR'];
    327.             if( sizeof($xal) > 0): // wenn nach dem Löschen der vordefinierten Variablen noch was übrig ist
    328.                 $param_str  = null;
    329.                 foreach($xal as $parameter_name => $parameter_value){
    330.                     $param_str  .= " ".$parameter_name."='".str_replace("'",'"',$parameter_value)."' "; //zwei-gestrichene Anführungszeichen erzwingen (evtl wichtig bei JScript)
    331.                 }
    332.                 $return = str_replace("{param}",  $param_str, $return );
    333.             endif;
    334.         return $return;
    335.     }
    336. }
    337.  
    338. function prepare_table_callback( $treffer ){
    339.     $xml    = new SimpleXMLElement($treffer[0]);
    340.     $xmlattr    = $xml->attributes();
    341.     foreach($xmlattr as $key=>$elem){
    342.         $element    = (array) $elem;
    343.         $attr[$key] = $element[0];
    344.     }
    345.     //check if src && x && y is given
    346.     if(( strlen($attr['src']) > 0) && (strlen($attr['y']) > 0) && (strlen($attr['x']) > 0))
    347.     {
    348.         return table( $attr );
    349.     }
    350.     return false;
    351. }
    352.  
    353. /**
    354.  * Headlinererstellung
    355.  *
    356.  * @return string
    357.  */
    358. function create_title( $text ){
    359.     global $sql;
    360.    
    361.     if(!$sql){
    362.         die("Globale Variable \$sql nicht gefunden.");
    363.     }
    364.     $Headline   = $text;#$sql->Query("SELECT KURZTEXT_EBAY FROM z_artikel_grund WHERE ARTIKEL_ID='$CAO_ID'","KURZTEXT_EBAY");
    365.     $ret    = preg_replace_callback("§%[a-z0-9_]{1,25}::[a-z0-9_]{1,25}%§si", "callback_var",$Headline);
    366.     $ret    = preg_replace_callback("§". quotemeta('[[[') ."(.*?)". quotemeta('][') ."(.*?)". quotemeta('][') ."(.*?)". quotemeta(']]]') ."§si", "link_callback", $ret);
    367.     $ret    = preg_replace_callback('/<grptable(.*?)\/>/si', "prepare_table_callback", $ret);
    368.     return $ret;
    369. }
    370.  
    371.  ?>
    Als Toplevel-Funktion ist create_title angedacht. ( Der Name ist allerdings für den Sinn der Funktion relativ "unpassend", aber naja ;) )
    Aufpassen solltest Du aber, wie in meinem Beispiel schön zu sehen, dass das ganze nicht zu unübersichtlich wird, was meines aufjedenfall ist!
    Hierbei gibt es 2 Arten von Platzhaltern. Einmal das Format %[Tabellenname]::[Feldname]% und <grtable [param1=[param2=[...[paramN=]]]]>.
    Wie gesagt pass bloß auf, dass Du dabei nicht den Überblick verlierst, denn das passiert sehr schnell :)
     
    Zuletzt bearbeitet: 10.09.2008
    #10      
x
×
×
teststefan