/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Find nål i høstak
Fra : Anders M


Dato : 28-10-09 13:46

Hej NG,

Jeg er ved at lave et simpelt CM System, og er kommet til layout
delen. Eftersom systemet er modulopbygget kommer der efterhånden
mange funktionaliter, som så skal hentes ud til layoutet.

F.eks. skal man kunne hente indholdet over en kategori, så jeg
har tænkt mig noget i retning af:

Tekst i layout:
<cms include="category" id="1" />

Og så skal jeg så finde både feltet include og dets value og så
feltet id og dets indhold. Er der en simpel metode til det?

Med venlig hilsen

Anders M

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Jonathan Stein (28-10-2009)
Kommentar
Fra : Jonathan Stein


Dato : 28-10-09 14:43

Anders M skrev:

> Tekst i layout:
> <cms include="category" id="1" />

Det ser ud til at være XML-syntaks, og det kan PHP sagtens tolke.
Alternativet er nok at bruge regulære udtryk - eller skrive sin egen parser.

Prøv f.eks. at kigge på
http://w-shadow.com/blog/2009/10/20/how-to-extract-html-tags-and-their-attributes-with-php/

M.v.h.

Jonathan

--
Er din email vigtig? Er du træt af, at din hjemmeside er nede?
Stabilt webhotel på redundant setup med daglig backup.
POP3, IMAP, PHP, JSP, Java, Perl, Python, Telnet, SSH, Cron-jobs m.v.
http://www.jsp-hotel.dk/

Peter Farsinsen (28-10-2009)
Kommentar
Fra : Peter Farsinsen


Dato : 28-10-09 16:50

Jonathan Stein wrote:
>> Tekst i layout:
>> <cms include="category" id="1" />
>
> Det ser ud til at være XML-syntaks, og det kan PHP sagtens tolke.
> Alternativet er nok at bruge regulære udtryk - eller skrive sin egen
> parser.
>
> Prøv f.eks. at kigge på
> http://w-shadow.com/blog/2009/10/20/how-to-extract-html-tags-and-their-attributes-with-php/

DOMDocument og specielt DOMXpath kan godt være lidt tunge at danse med.
Det er knapt så stringent og kønt, men SimpleXML er - for mig i al fald
- ofte hurtigere at komme ud over rampen med.

Anders, tjek evt. eksemplerne her:
http://dk2.php.net/manual/en/simplexml.examples-basic.php

--
Peter Farsinsen
fornavn@efternavn.dk

Anders M (28-10-2009)
Kommentar
Fra : Anders M


Dato : 28-10-09 17:05

Peter Farsinsen wrote in dk.edb.internet.webdesign.serverside.php:
> Jonathan Stein wrote:
> >> Tekst i layout:
> >> <cms include="category" id="1" />
> >
> > Det ser ud til at være XML-syntaks, og det kan PHP sagtens tolke.
> > Alternativet er nok at bruge regulære udtryk - eller skrive sin egen
> > parser.
> >
> > Prøv f.eks. at kigge på
> > http://w-shadow.com/blog/2009/10/20/how-to-extract-html-tags-and-their-attributes-with-php/
>
> DOMDocument og specielt DOMXpath kan godt være lidt tunge at danse med.
> Det er knapt så stringent og kønt, men SimpleXML er - for mig i al fald
> - ofte hurtigere at komme ud over rampen med.
>
> Anders, tjek evt. eksemplerne her:
> http://dk2.php.net/manual/en/simplexml.examples-basic.php
>
> --
> Peter Farsinsen
> fornavn@efternavn.dk

Tak for begge svar.

Det mest bevendte var nok Jonathans eftersom man ofte laver templates i HTML så som:

<html>
- snip -
<body>
<div id="xx"><cms include="category" id="1" /> </div>
- snip -



--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jonathan Stein (30-10-2009)
Kommentar
Fra : Jonathan Stein


Dato : 30-10-09 00:07

Peter Farsinsen skrev:

> DOMDocument og specielt DOMXpath kan godt være lidt tunge at danse med.
> Det er knapt så stringent og kønt, men SimpleXML er - for mig i al fald
> - ofte hurtigere at komme ud over rampen med.

Jeg bruger normalt også SimpleXML til at behandle alm. XML-data, men
lige her er f.eks. funktionen "getElementsByTagName" værd at tage en
svingom med DOMDocument for at få adgang til.

M.v.h.

Jonathan

--
Er din email vigtig? Er du træt af, at din hjemmeside er nede?
Stabilt webhotel på redundant setup med daglig backup.
POP3, IMAP, PHP, JSP, Java, Perl, Python, Telnet, SSH, Cron-jobs m.v.
http://www.jsp-hotel.dk/

Anders M (28-10-2009)
Kommentar
Fra : Anders M


Dato : 28-10-09 22:22

Jonathan Stein wrote in dk.edb.internet.webdesign.serverside.php:
> Anders M skrev:
>
> > Tekst i layout:
> > <cms include="category" id="1" />
>
> Det ser ud til at være XML-syntaks, og det kan PHP sagtens tolke.
> Alternativet er nok at bruge regulære udtryk - eller skrive sin egen parser.
>
> Prøv f.eks. at kigge på
> http://w-shadow.com/blog/2009/10/20/how-to-extract-html-tags-and-their-attributes-with-php/
>
> M.v.h.
>
> Jonathan
>
> --
> Er din email vigtig? Er du træt af, at din hjemmeside er nede?
> Stabilt webhotel på redundant setup med daglig backup.
> POP3, IMAP, PHP, JSP, Java, Perl, Python, Telnet, SSH, Cron-jobs m.v.
> http://www.jsp-hotel.dk/

Hej,

Nu har jeg prøvet mig lidt frem, og har lavet følgende:

<?

         function template($include,$id)
         {
            echo $include.$id;
         }
         $dom = new DOMDocument;
         @$dom->loadHTML($content);
         $cmstags=($dom->getElementsByTagName('cms'));         

         foreach($cmstags as $tag)
         {
            $content=str_replace($tag->getElementByTagName,template($tag->getAttribute('include'),$tag
->getAttribute('id')),$content);
         }       
         $content=str_replace($cmstags,"",$content);
         echo $content;
         

?>

den giver de resultater jeg vil have:
page1category2

men også denne fejl som jeg ikke vil have:
Catchable fatal error: Object of class DOMNodeList could not be converted to string in
/var/www/xxx.xx/public_html/admin/functions/show_template.php on line 15

nogen forslag?

Mvh Anders

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Peter Farsinsen (29-10-2009)
Kommentar
Fra : Peter Farsinsen


Dato : 29-10-09 00:18

Anders M wrote:
> Nu har jeg prøvet mig lidt frem, og har lavet følgende:
>
> <?
>
>          function template($include,$id)
>          {
>             echo $include.$id;
>          }
>          $dom = new DOMDocument;
>          @$dom->loadHTML($content);
>          $cmstags=($dom->getElementsByTagName('cms'));         
>
>          foreach($cmstags as $tag)
>          {
>             $content=str_replace($tag->getElementByTagName,template($tag->getAttribute('include'),$tag
> ->getAttribute('id')),$content);
>          }       
>          $content=str_replace($cmstags,"",$content);
>          echo $content;
>          
>
> ?>

Kan du beskrive, hvad du gerne vil op? Synes ikke det fremgår helt klart
af eksemplet. Jeg forstår, du vil finde attributterne 'category' og
'id', men resten giver ikke rigtig mening.

$content=str_replace($tag->getElementByTagName,template($tag->getAttribute('include'),$tag->getAttribute('id')),$content);

DOMElement ($tag i dit loop her) har ikke en property kaldet
'getElementByTagName' og returnerer derfor null.

$content=str_replace($cmstags,"",$content);

DOMElement::getElementsByTagName returnerer DOMNodeList, så du kan ikke
bruge $cmstags som argument i str_replace() i den sidste linje.

> den giver de resultater jeg vil have:
> page1category2

Kan du ikke prøve at gi' et eksempel på, hvordan dit input ser ud og
hvad output skal være?

--
Peter Farsinsen
fornavn@efternavn.dk

Anders M (29-10-2009)
Kommentar
Fra : Anders M


Dato : 29-10-09 15:41

Peter Farsinsen wrote in dk.edb.internet.webdesign.serverside.php:
> Anders M wrote:
> > Nu har jeg prøvet mig lidt frem, og har lavet følgende:
> >
> > <?
> >
> >          function template($include,$id)
> >          {
> >             echo $include.$id;
> >          }
> >          $dom = new DOMDocument;
> >          @$dom->loadHTML($content);
> >          $cmstags=($dom->getElementsByTagName('cms'));         
> >
> >          foreach($cmstags as $tag)
> >          {
> >             $content=str_replace($tag->getElementByTagName,template($tag->getAttribute('include'),$tag
> > ->getAttribute('id')),$content);
> >          }       
> >          $content=str_replace($cmstags,"",$content);
> >          echo $content;
> >          
> >
> > ?>
>
> Kan du beskrive, hvad du gerne vil op? Synes ikke det fremgår helt klart
> af eksemplet. Jeg forstår, du vil finde attributterne 'category' og
> 'id', men resten giver ikke rigtig mening.
>
> $content=str_replace($tag->getElementByTagName,template($tag->getAttribute('include'),$tag->getAttribute('id')),$content);
>
> DOMElement ($tag i dit loop her) har ikke en property kaldet
> 'getElementByTagName' og returnerer derfor null.
>
> $content=str_replace($cmstags,"",$content);
>
> DOMElement::getElementsByTagName returnerer DOMNodeList, så du kan ikke
> bruge $cmstags som argument i str_replace() i den sidste linje.
>
> > den giver de resultater jeg vil have:
> > page1category2
>
> Kan du ikke prøve at gi' et eksempel på, hvordan dit input ser ud og
> hvad output skal være?
>

Jeg vil gerne erstatte elementerne med <cms xx/> med moduler fra cms'et, og man skal så kunne vælge hvilke. inputet er ala:

<html>
<head>
</head>
<body>
<cms include="page" id="1" />
<cms include="page" id="3" />
<cms include="page" id="2" />
</body>
</html>

Det vil altså sige, at man finde alle elementer (cms) og så finder man attributerne: include og id, og så skal de så
indsættes i en funktion f.eks. template($include,$id)

Håber det giver mening..

Mvh ANders

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Peter Farsinsen (29-10-2009)
Kommentar
Fra : Peter Farsinsen


Dato : 29-10-09 21:34

Anders M wrote:
>> Kan du ikke prøve at gi' et eksempel på, hvordan dit input ser ud og
>> hvad output skal være?
>>
>
> Jeg vil gerne erstatte elementerne med<cms xx/> med moduler fra cms'et, og man skal så kunne vælge hvilke. inputet er ala:
>
> <html>
> <head>
> </head>
> <body>
> <cms include="page" id="1" />
> <cms include="page" id="3" />
> <cms include="page" id="2" />
> </body>
> </html>
>
> Det vil altså sige, at man finde alle elementer (cms) og så finder man attributerne: include og id, og så skal de så
> indsættes i en funktion f.eks. template($include,$id)
>
> Håber det giver mening..

Nu hører jeg til dem, der synes PHP fungerer fint som template-sprog. I
stedet for at bøvle med DOM, kan du gøre flg.:

<?php
   function template($include,$id) {
      return '<p><b>Include</b> '.$include.' (Id: '.$id.'</p>';
   }
?>

<html>
<head>
</head>
<body>
<?php print template('page', 1) ?>
<?php print template('page', 2) ?>
<?php print template('page', 3) ?>
</body>
</html>

Med DOM ser det ud som noget i stil med:

<?
   function template($include,$id) {
      return '<p><b>Include</b> '.$include.' (Id: '.$id.')</p>';
   }
   
   $template = '<html>
   <head>
   </head>
   <body>
   <cms include="page" id="1" />
   <cms include="page" id="3" />
   <cms include="page" id="2" />
   </body>
   </html>';
   
   $dom = new DOMDocument;
   $dom->loadHTML($template);
   $tags = $dom->getElementsByTagName('cms');
   
   $tagElements = array();      

   foreach($tags as $tag) {
      $partial =
template($tag->getAttribute('include'),$tag->getAttribute('id'));
      
      $partialDom = new DOMDocument;
      $partialDom->loadHTML($partial);
      
      $partialNode = $dom->importNode($partialDom->documentElement, true);
      $tag->parentNode->insertBefore($partialNode, $tag);
      
      
      $tagElements[] = $tag;
   }
   
   foreach($tagElements as $tagElement) {
      $tagElement->parentNode->removeChild($tagElement);
   }
   
   print $dom->saveXML();
?>

Alternativt, kan du bruge regulære udtryk, men jeg synes ikke, der er
nogen gevinst ved det.

--
Peter Farsinsen
fornavn@efternavn.dk

Anders M (29-10-2009)
Kommentar
Fra : Anders M


Dato : 29-10-09 22:03

> <?php
>    function template($include,$id) {
>       return '<p><b>Include</b> '.$include.' (Id: '.$id.'</p>';
>    }
> ?>
>
> <html>
> <head>
> </head>
> <body>
> <?php print template('page', 1) ?>
> <?php print template('page', 2) ?>
> <?php print template('page', 3) ?>
> </body>
> </html>

det ville jeg også gerne, men så skal jeg vel placere koden i filer i stedet for i en database?

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Peter Farsinsen (29-10-2009)
Kommentar
Fra : Peter Farsinsen


Dato : 29-10-09 22:46

Anders M wrote:
>> <?php
>>    function template($include,$id) {
>>       return '<p><b>Include</b> '.$include.' (Id: '.$id.'</p>';
>>    }
>> ?>
>>
>> <html>
>> <head>
>> </head>
>> <body>
>> <?php print template('page', 1) ?>
>> <?php print template('page', 2) ?>
>> <?php print template('page', 3) ?>
>> </body>
>> </html>
>
> det ville jeg også gerne, men så skal jeg vel placere koden i filer i stedet for i en database?

Uhm, ja - templates er som oftest filer. Har du dem godt nok i
databasen? Hvorfor? ;)



--
Peter Farsinsen
fornavn@efternavn.dk

Jonathan Stein (30-10-2009)
Kommentar
Fra : Jonathan Stein


Dato : 30-10-09 00:08

Anders M skrev:

> det ville jeg også gerne, men så skal jeg vel placere koden i filer i stedet for i en database?

Ikke nødvendigvis - prøv at kigge på "eval"
(http://php.net/manual/en/function.eval.php)

M.v.h.

Jonathan

--
Er din email vigtig? Er du træt af, at din hjemmeside er nede?
Stabilt webhotel på redundant setup med daglig backup.
POP3, IMAP, PHP, JSP, Java, Perl, Python, Telnet, SSH, Cron-jobs m.v.
http://www.jsp-hotel.dk/

Anders M (31-10-2009)
Kommentar
Fra : Anders M


Dato : 31-10-09 17:20

Peter Farsinsen wrote in dk.edb.internet.webdesign.serverside.php:
> Anders M wrote:
> >> Kan du ikke prøve at gi' et eksempel på, hvordan dit input ser ud og
> >> hvad output skal være?
> >>
> >
> > Jeg vil gerne erstatte elementerne med<cms xx/> med moduler fra cms'et, og man skal så kunne vælge hvilke. inputet er ala:
> >
> > <html>
> > <head>
> > </head>
> > <body>
> > <cms include="page" id="1" />
> > <cms include="page" id="3" />
> > <cms include="page" id="2" />
> > </body>
> > </html>
> >
> > Det vil altså sige, at man finde alle elementer (cms) og så finder man attributerne: include og id, og så skal de så
> > indsættes i en funktion f.eks. template($include,$id)
> >
> > Håber det giver mening..
>
> Nu hører jeg til dem, der synes PHP fungerer fint som template-sprog. I
> stedet for at bøvle med DOM, kan du gøre flg.:
>
> <?php
>    function template($include,$id) {
>       return '<p><b>Include</b> '.$include.' (Id: '.$id.'</p>';
>    }
> ?>
>
> <html>
> <head>
> </head>
> <body>
> <?php print template('page', 1) ?>
> <?php print template('page', 2) ?>
> <?php print template('page', 3) ?>
> </body>
> </html>
>

Jeg har nu forsøgt mig frem, men jeg kan ikke skrive php (<? ?>) fra et textarea.. hvordan gør man det?

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jonathan Stein (30-10-2009)
Kommentar
Fra : Jonathan Stein


Dato : 30-10-09 00:04

Anders M skrev:
>             $content=str_replace($tag->getElementByTagName,template($tag->getAttribute('include'),$tag
> ->getAttribute('id')),$content);

Jeg tror jeg ville satse på at udskifte indholdet af de fundne noder med
det indhold, som template-funktionen genererer - og så til sidst lade
DOMDocument spytte et komplet dokument ud.

M.v.h.

Jonathan

--
Er din email vigtig? Er du træt af, at din hjemmeside er nede?
Stabilt webhotel på redundant setup med daglig backup.
POP3, IMAP, PHP, JSP, Java, Perl, Python, Telnet, SSH, Cron-jobs m.v.
http://www.jsp-hotel.dk/

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste