Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Find nål i høstak

0 views
Skip to first unread message

Anders M

unread,
Oct 28, 2009, 8:46:05 AM10/28/09
to
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

unread,
Oct 28, 2009, 9:43:29 AM10/28/09
to
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

unread,
Oct 28, 2009, 11:50:10 AM10/28/09
to
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
for...@efternavn.dk

Anders M

unread,
Oct 28, 2009, 12:04:41 PM10/28/09
to
Peter Farsinsen wrote in dk.edb.internet.webdesign.serverside.php:

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 -

Anders M

unread,
Oct 28, 2009, 5:21:31 PM10/28/09
to
Jonathan Stein wrote in dk.edb.internet.webdesign.serverside.php:

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

Peter Farsinsen

unread,
Oct 28, 2009, 7:18:21 PM10/28/09
to
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
for...@efternavn.dk

Anders M

unread,
Oct 29, 2009, 10:41:04 AM10/29/09
to
Peter Farsinsen wrote in dk.edb.internet.webdesign.serverside.php:

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

Peter Farsinsen

unread,
Oct 29, 2009, 4:33:54 PM10/29/09
to
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
for...@efternavn.dk

Anders M

unread,
Oct 29, 2009, 5:03:18 PM10/29/09
to
> <?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?

Peter Farsinsen

unread,
Oct 29, 2009, 5:45:31 PM10/29/09
to
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
for...@efternavn.dk

Jonathan Stein

unread,
Oct 29, 2009, 7:04:15 PM10/29/09
to
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.

Jonathan Stein

unread,
Oct 29, 2009, 7:07:00 PM10/29/09
to
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.

Jonathan Stein

unread,
Oct 29, 2009, 7:07:54 PM10/29/09
to
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)

Anders M

unread,
Oct 31, 2009, 12:20:27 PM10/31/09
to
Peter Farsinsen wrote in dk.edb.internet.webdesign.serverside.php:

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

0 new messages