|
| 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 |
| | |
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/
| |
|
|