Avatar billede groyk Novice
11. september 2009 - 11:30 Der er 14 kommentarer og
1 løsning

PHPTAL og funktioner

Hej Eksperter

Jeg har kigget lind på PHPTAL og synes rigtigt godt om hvad jeg ser.

Dog falder jeg over en ting der absolut ikke tiltaler mig.

Idag har jeg lavet nogle php funktioner til at "outputte" submitbuttons, links, knapper, iconer mm.
Dette gør at genereringen af knapper med både post og get data er UTROLIG NEM.

Jeg kan ikke lige overskue hvordan jeg får samme koncept overført til PHPTAL.

Lydder måske som sort snak, men her er et eksempel


<?
# Sættes til
$icondir = "http://www.multipumpen.mine.nu/ipcam/icons";

# Åbner alle tags i en string eks. tag='test'
    function oTagS($input,$dataout="both",$tStart=" ",$tMiddle="='",$tEnd="' ",$custom_search="\w+"){
        # Laver ekstra mellemrum i inputtet
            $input = preg_replace('/\s{1}/','  ',$input);
        # Finder alle tags
            preg_match_all("|$tStart($custom_search)$tMiddle(.*?)$tEnd|si"," ".$input." ",$tags);
        # Udskriver alle tags til et dobbelt array
            $i=0;
            foreach($tags[1] as $tag) {
                if($dataout=="both") {
                    $out[trim($tags[1][$i])][0] = " ".preg_replace('/\s+/',' ',trim($tags[0][$i]));
                    $out[trim($tags[1][$i])][1] = preg_replace('/\s+/',' ',trim($tags[2][$i]));
                }
               
                if($dataout=="tag") $out[trim($tags[1][$i])] = " ".preg_replace('/\s+/',' ',trim($tags[0][$i]));
                if($dataout=="value") $out[trim($tags[1][$i])] = preg_replace('/\s+/',' ',trim($tags[2][$i]));
               
                $i++;
            }
        # Returnere arrayet
        return $out;
    }

function CompressHTML($out,$debug="true"){
    # Sletter tomme tags
        $out = preg_replace("/ (\w+)=''/",'',$out);

    # outputter formen læseligt eller sammenfoldet
        if($debug=="true") return $out;
        else return preg_replace('/\s+/',' ',$out);
}

# Generere et billede output fra ikonbiblioteket
    function icon($name,$height,$width,$class="",$alt="") {
        global $icondir;
        #$icondir = $wwwroot."/icons"; // http://www.dinURL.dk/mappe/til/ikoner
        # Outputter billedet
            $out = "<img height='$height' width='$width' class='$class' src='$icondir/$name' border='0' alt='$alt'>";
        # Sletter tomme tags og fjerne dobbelt mellemrum
            $out = preg_replace("/ (\w+)=''/",'',$out);
            $out = preg_replace('/\s+/',' ',$out);
        return $out;
    }

function btn($string) {
    # Åbner tags
        $tag = oTagS($string); // oTagS ligger i regexp.php

    # Laver clases
        if(isset($tag['class'][1])) {
            $class['div'] = $tag['class'][1];
            $class['a'] = $tag['class'][1] . "_a";
            $class['img'] = $tag['class'][1] . "_img";
            $class['button'] = $tag['class'][1] . "_button";
            $class['input'] = $tag['class'][1] . "_input";   
        }

    # laver form navn hvis ikke angivet
        if($tag['form'][1]=="auto") $tag['form'][1] = "btn" . preg_replace("/[^0-9]/", "", microtime(true));

    # Laver linket, hvis intet indsat, linker siden til sig selv
        if(substr($tag['href'][1],0,1)=="?" OR !isset($tag['href'][1])) $tag['href'][1] = $_SERVER['PHP_SELF'] . $tag['href'][1];

    # Laver JS confirms, Laver submit eller link, Insætter også confirm såfremt dette er nødvendigt
        if(isset($tag['form'][1])) $js_href = "document['".$tag['form'][1]."'].submit();";
        elseif(isset($tag['form_name'][1])) $js_href = "document['".$tag['form_name'][1]."'].submit();";
        else $js_href = "parent.location='".$tag['href'][1]."';";

        if(isset($tag['cf'][1])) $js = "onclick=\"if(confirm('".$tag['cf'][1]."')){$js_href}\"";
        else $js = "onclick=\"$js_href\"";

    # Henter icon hvis dette er sat
        if(isset($tag['icon'][1])) $icon = icon($tag['icon'][1],$tag['icon_h'][1],$tag['icon_w'][1],$class['img'],$tag['title'][1]);

    # Sammensætter alle fælles tags
        $shared_tags = $tag['title'][0]." ".$tag['id'][0]." ".$js;

    # Generere koden til outputtet
            # Åbner form
                if(isset($tag['form'])) $out .= "\n<form name='".$tag['form'][1]."' style='display: inline;' method='post' action='".$tag['href'][1]."'>\n";

            # Åbner div
                $out .= " <div".$class['div']." style='display: inline;'>\n";
           
            # Generere post data
                if(isset($tag['post'])) {
                      $posts = explode(",",$tag['post'][1]);
                    foreach($posts as $post) {
                        $postname = explode("=",$post);
                        $postvalue = substr($post,strlen($postname[0])+1);
                        $out .= "    <input type='hidden' name='$postname[0]' value='$postvalue'>\n";
                    }
                }

            # Opretter inputfelt
                if(!isset($tag['input_size'][1])) $tag['input_size'][1] = 15;
                $input_tags = "value='".$tag['input_value'][1]."' class='".$class['input'][1]."' id='".$tag['input_id'][1]."' size='".$tag['input_size'][1]."'";
                if(isset($tag['input'])) $out .= "    <input type='text' name='".$tag['input'][1]."' $input_tags>\n";

            # Laver linket, knappen, ikonet   
                if(isset($tag['icon'][1])) $out .= "    <a href='#' class='".$class['a']."' $shared_tags>$icon</a>\n";
                elseif(isset($tag['submit'][1])) $out .= "    <input type='button' class='".$class['button']."' value='".$tag['submit'][1]."' $shared_tags>\n";
                elseif(isset($tag['link'][1])) $out .= "    <a href='#' class='".$class['a']."' $shared_tags>".$tag['link'][1]."</a>\n";

            # lukker div
                $out .= " </div>\n";

            # Lukker formen hvis den er åben
                if(isset($tag['form'])) $out .= "</form>\n";

    return CompressHTML($out,$tag['debug'][1]);
}


# Eksempler
    # Delete icon med confirm og post data
        echo btn("form='auto' href='$PHP_SELF' icon='delete.png' icon_h='15' title='Slet' post='id=test,slet=true' debug='true' cf='Vil du slette navn?'");
        echo "<br /><br />";
   
    # Delete icon uden confirm og post data
        echo btn("form='auto' href='$PHP_SELF' icon='delete.png' icon_h='15' title='Slet' post='id=test,slet=true' debug='true'");
        echo "<br /><br />";
   
    # Delete icon med confirm og get data
        echo btn("form='auto' href='$PHP_SELF?id=test&slet=true' icon='delete.png' icon_h='15' title='Slet' debug='true' cf='Vil du slette navn?'");
        echo "<br /><br />";
   
    # submitter en form
        echo "<form name='TEST' style='display: inline;' method='get'>
                <input type='test' name='test' value='tester'>";
        echo btn("form_name='TEST' href='$PHP_SELF' icon='edit.png' icon_h='15' title='Slet' post='id=test,slet=true' debug='true' cf='Vil du slette navn?'");
/*

Eksempel på brug
    echo btn("    form='auto'
                    href='kurv.php'
                    /icon='edit.png'
                    /icon_w='15'
                    /icon_h='15'
                    /link='Køb'
                    submit='".BYE."'
                    title='".PRODUKTSIDE_STOCK_BASKET_HINT."'
                    input='antal'
                    input_value='1'
                    input_size='3'
                    post='action=insert,varenr=$varenr,page=$this_url'
                    class='kob'
                    /debug='true'
                    /cf='Er du sikke på at du vil købe varen'
                    ");
    */
?>


Håber der er en der forstår spørgsmålet, synes det er lidt svært at forklare
Avatar billede j4k0b Nybegynder
11. september 2009 - 11:38 #1
Hvis du definerer funktionerne før du genererer HTML fra dit template, kan du så ikke kalde dem ved at skrive php: foran udtrykket?

<div tal:content="php:oTagS('test')"></div>
Avatar billede j4k0b Nybegynder
11. september 2009 - 11:39 #2
Jeg har desværre ikke arbejdet så meget med PHPTAL, men i Python bruger jeg en implementation der hedder SimpleTAL. Her videregiver jeg blot funktionen som en reference til templatet, og så kan den kaldes med det navn jeg videregiver den som. Men i PHP kan man (så vidt jeg ved) ikke videregive referencer til funktioner
Avatar billede repox Seniormester
11. september 2009 - 11:51 #3
Puha, godt det ikke er mig der skal vedligeholde sådan en kode :/
Nå, men jeg har egentlig ikke noget konstruktivt at bidrage med, jeg vil bare gerne vide hvad det er der gør at du har valgt at bruge sådan et template system?
Avatar billede j4k0b Nybegynder
11. september 2009 - 11:56 #4
repox: Hvorfor han har valgt at bruge et template system, eller hvorfor han har valgt at bruge PHPTAL frem for et andet?
Avatar billede repox Seniormester
11. september 2009 - 11:58 #5
#4
God pointe egentlig.
Begge spørgsmål er lige gode, så lad os tage den derfra.
Avatar billede groyk Novice
11. september 2009 - 12:15 #6
Som skrevet tidligere bruger jeg koden for at spare tid når jeg koder, og ensarte outputtiet til knapper submits mv.

Jo det er noget crap at veligeholde, men indtil nu er funktionerne også kun "slamkodet".

Hvis du har prøvet at teste koden, kan du se at det er MEGET nemt at ændre ex. fra icon til link til submit mv.

Hvis du har andre alternativer hører jeg gerne om dem.

Vedr. et template system. her er jeg selv MEGET i tvivl om det begrænser mere en det hjælper mig. Hvorfor mener du at jeg IKKE skal bruge dette?

Jeg er jo kun autodidakt, så kan ikke kalde mig for expert.

kan da godt være at jeg bare skal droppe både TAL og mine egne små funktioner
Avatar billede j4k0b Nybegynder
11. september 2009 - 12:34 #7
> Vedr. et template system. her er jeg selv MEGET i tvivl om det begrænser mere en det hjælper mig. Hvorfor mener du at jeg IKKE skal bruge dette?

Du skal bestemt bruge et template system. Der er ingen grund til ikke at gøre det, med mindre projektet er meget lille.
Avatar billede repox Seniormester
11. september 2009 - 14:31 #8
#6
Hvis du selv synes du sparer tid på det er det jo fint nok.
Jeg gider ikke teste kode for funktionalitet som jeg ikke kunne drømme om at implementere - ikke engang for sjov. Du føler det letter dit arbejde, jeg synes det er dårlig struktureret.

Problemet med sådan noget her er at der ikke er nogen 'rigtig' måde at gøre tingene på; så længe det virker. Men man kan refaktorere sin kode så den bliver nem at vedligholde og udvide. Omvendt kan man også være ligeglad og tilføje funktionalitet i samme rækkefølge som behovet opstår.

Templatesystemer ala Smarty eller PHPTAL er ikke noget for mig; jeg har PHP til at lave output for mig som jeg ønsker det. Jovist, nogle ville da argumentere for at det kan du også med templatesystemer, men her må mit svar være: Ja, det kan du da, så længe du gør som systemet forlanger.

Se på eksemplerne på http://phptal.org/introduction.html
For mig virker det som om de bevidst laver et dårligt eksempel, for at fremstille PHPTAL som et bedre alternativ.
Istedet for deres rodede opstilling til PHP eksemplet ville jeg gøre således:

<?php foreach ($values as $value): ?>
<div class="item">
  <div class="title">
      <?php if($value->hasDate()) echo $value->getDate(); ?>   
    <a href="<?php echo $value->getUrl(): ?>"><?php echo $value->getTitle(ENT); ?></a>
  </div>
  <div class="content">
    <?php echo $value->getContent(ENT); ?>
  </div>
</div>
<?php endforeach; ?>


Løsningen er ikke mere korrekt, men jeg synes at det er pænere. Og så stiller det ikke PHP's egne muligheder i et lige så dårligt lyst som PHPTAL portrætterer det.

At j4k0b anbefaler dig at bruge et templatesystem - bogstaveligt talt - uden at begrunde det (og nej, 'der er ingen grund til ikke at gøre det' er ikke en begrundelse, det er cirkellogik) virker som mangel på forståelse af formålet med et templatesystem.

Hvis du prøver et templatesystem af, oplever at det virkelig hjælper dig, er nemt at udvide og vedligholde og samtidig letter din fremgangsmåder har du pludselig hele fire gode grunde (for dig selv) for at bruge templatesystemet. Men hvis du gør det, fordi andre synes det er en god idé, har du skudt dig selv i foden. Keep it simple.

Hvis jeg endelig skulle anebfale dig noget for at lette din udvikling ville jeg mene du skulle kigge på nogle frameworks: http://www.phpframeworks.com/

Stadigvæk - jeg har ikke altid ret og der er ikke en løsning som konsekvent er den rigtige - men dine begrundelser for din gøren og laden skal give mening; det er ikke nok at spørge sig selv 'hvorfor ikke?' (eller have andre til at stille det samme dumme spørgsmål). Forlang svar på 'hvorfor?'!
Avatar billede groyk Novice
11. september 2009 - 16:36 #9
Hej repox

Mange tak for svaret, var noget mere brugbart end det j4k0b kom med. Som du selv skriver, ingen argumentation.

Uden at have brugt meget tid på template systemer synes jeg de begrænser mig i at bruge de muligheder der er i php.

Og jeg vil give dig ret i at kode absolut ikke behøver at være rodet fordi der indgår php i koden.

vedr. de funktioner jeg smed i starten, hvorfor er de ikke noget for dig? er det opbygningen, eller er det fordi du mener det er dårlig skik at lave et "abstraktionslag" til HTML delen?
Avatar billede repox Seniormester
11. september 2009 - 19:25 #10
#9

Abstraktionslag er generelt en god idé (hvis ikke formålet er at gøre det bare for at gøre det ;) ).
Men grunden til at jeg synes dine funktioner er dårlige er fordi det netop bare er en funktion til at skrive HTML.

Her ville det være nærliggende at spørge efter noget objektorienteret til at styre disse ting med istedet - f.eks. ved hjælp af polymorfi eller lignende.
Avatar billede groyk Novice
11. september 2009 - 21:20 #11
polymofi!? Her rækker mit "talent" ikke. Kan heller ikke finde noget om emnet sammen med php.

Vil tage dine kommentarer til efterretning og endnu engang læse om phpframeworks

Hvilket et vil du anbefale?

Skal være et lille framework der er simpelt at gå til og udvide.
Avatar billede groyk Novice
11. september 2009 - 22:32 #12
Faldt lige over codeigniter - www.codeigniter.com

tror jeg giver det et skud
Avatar billede repox Seniormester
12. september 2009 - 20:37 #13
Hvad angår polymorfi, kan du starte med at kigge her
http://www.devshed.com/c/a/PHP/PHP-5-and-Polymorphism/

Det er blot et en af de fordele der er ved at benytte OOP i PHP.

Jeg vil ikke anbefale et framework frem for et andet. Jeg har selv lavet mit eget (med fokus på MVC) som følge af den erfaring jeg har fået med tiden og med brug af frameworks. Nogle foretrækker CakePHP mens andre foretrækker Yii.
I bund og grund handler det egentlig bare om at opnå en fornemmelse af at tingene bliver bedre og nemmere for dig.
Avatar billede groyk Novice
13. september 2009 - 12:34 #14
OK, takker mange gange.

Kan du ikke smide et svar, for den gode vejledning?
Avatar billede repox Seniormester
13. september 2009 - 13:22 #15
Selv tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester