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
> 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/
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
for...@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 -
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
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
for...@efternavn.dk
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
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
for...@efternavn.dk
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
for...@efternavn.dk
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.
> 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.
> 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)
Jeg har nu fors�gt mig frem, men jeg kan ikke skrive php (<? ?>) fra et textarea.. hvordan g�r man det?