Avatar billede cbadk Novice
06. juli 2013 - 17:07 Der er 6 kommentarer og
1 løsning

CMS system med sektion inddelt tags

Sidder og er ved at lave et lille CMS system der skal håndtere alle vores sider og deres CSS koder.

CMS systemet er opdelt i 3 tabeller:

"core_cms_templates" indeholder selve hoved templaten
templateId INT(11) NOT NULL AUTO_INCREMENT,
templateName VARCHAR(255) DEFAULT NULL,
templateCode LONGTEXT DEFAULT NULL,
templateCSS LONGTEXT DEFAULT NULL,

"core_cms_layout" indeholder layoutet til templaten
layoutId INT(11) NOT NULL AUTO_INCREMENT,
layoutName VARCHAR(255) DEFAULT NULL,
layoutCode LONGTEXT DEFAULT NULL,
layoutCSS LONGTEXT DEFAULT NULL,
layoutTotalGroups INT(11) DEFAULT NULL,

"core_cms_page" indeholder selve indholdet til layoutet
  pageID INT(11) NOT NULL AUTO_INCREMENT,
  pageTitle VARCHAR(255) DEFAULT NULL,
  pageCode LONGTEXT DEFAULT NULL,
  pageCSS LONGTEXT DEFAULT NULL,
  pageTemplateID INT(11) DEFAULT NULL,
  pageLayoutID INT(11) DEFAULT NULL,


Templaten er lavet ud fra en HTML5 grundskalabon og derefter tilføjet #PAGE_TITLE# osv. tags og derefter bruger vi en replace funktion til at erstatte dem med de informationer der ligger i layout og page tabellen. Vi har så tilføjet #LAYOUT# der i skabelonen hvor selve indholdet skal være som så skal erstattes af den skabelon der ligger i layout. Men her kommer så mit problem.

Jeg vil gerne have flere layoutpositioner i et layout, f. eks.

<div id="header">
#LAYOUTPOS1#
</div>
<div id="news">
#LAYOUTPOS2#
</div>
<div id="newposts">
#LAYOUTPOS3#
</div>

Så det jeg ønsker er at når man har en streng med forskellige "sektioner" som vist ovenfor, og en streng mere der så skal ind i de forskellige positioner med f. eks. OG at den selv kan regne ud hvor mange layoutpos der skal fyldes, så jeg ikke behøver at definere en X værdi for en repeat funktion.
#LAYOUTPOS1_START#
Mit indhold til LAYOUTPOS1
#LAYOUTPOS1_END#
#LAYOUTPOS2_START#
Mit indhold til LAYOUTPOS2
#LAYOUTPOS2_END#
#LAYOUTPOS3_START#
Mit indhold til LAYOUTPOS3
#LAYOUTPOS3_END#

Meget forvirende måske. Men jeg håber i kan forstå det.
Avatar billede Syska Mester
06. juli 2013 - 21:29 #1
var t = Regex.Matches("<div id=\"header\">#LAYOUTPOS10#</div><div id=\"news\">#LAYOUTPOS2#</div><div id=\"newposts\">#LAYOUTPOS3#</div>",
@"#LAYOUTPOS\d{1,}#");

foreach(Match match in t)
{
    Console.WriteLine(match.Captures[0].Value);
}

Læg mærke til at jeg udskriver det til Console ...

Et eller andet sted skulle jeg jo se om det virkede.

Håber det kan bruges eller må du fortælle hvad det er du vil på en anden måde, for kan ikke helt se ideen.
Avatar billede cbadk Novice
06. juli 2013 - 22:10 #2
Tror vist jeg forklarede det lidt dumt...

Der er 2 strenge...

En som er mit layout:

<div id="header">
#LAYOUTPOS1#
</div>
<div id="news">
#LAYOUTPOS2#
</div>
<div id="newposts">
#LAYOUTPOS3#
</div>

og en med som indeholder det "fyld" der skal "fyldes" i layoutet.

#LAYOUTPOS1_START#
Mit indhold til LAYOUTPOS1
#LAYOUTPOS1_END#
#LAYOUTPOS2_START#
Mit indhold til LAYOUTPOS2
#LAYOUTPOS2_END#
#LAYOUTPOS3_START#
Mit indhold til LAYOUTPOS3
#LAYOUTPOS3_END#

Indholdet

#LAYOUTPOS1_START#
<div>Mit dejlige indhold som skal placeres i LAYOUTPOS1</div>
#LAYOUTPOS1_END#

skal så placeres i "#LAYOUTPOS1#" i den første streng.


Det der er mit problem er at jeg skal have lavet en LØKKE som den her:

string pageCode = "#LAYOUTPOS1_START#<div>hej med dig1</div>#LAYOUTPOS1_START##LAYOUTPOS2_START#<div>hej med dig2</div>#LAYOUTPOS2_END##LAYOUTPOS3_START#<div>hej med dig3</div>#LAYOUTPOS3_END#";
int startPos = email.LastIndexOf("#LAYOUTPOS1_START#") + "hello my friend".Length + 1;
int length = email.IndexOf("#LAYOUTPOS1_START#") - startPos;
string layoutcode = email.Substring(startPos, length);

men hvor den bare selv finder ud af hvor mange "LAYOUTPOS1" der er ... altså der hvor 1 tallet er placere

:D
Avatar billede cbadk Novice
06. juli 2013 - 22:28 #3
lige en rettelse:


x = 10 // Det er så her der skal laves en count funktion der tæller hvor mange LAYOUTPOS1 der er...
while (i < x)
{
string pageCode = "#LAYOUTPOS1_START#<div>hej med dig1</div>#LAYOUTPOS1_START##LAYOUTPOS2_START#<div>hej med dig2</div>#LAYOUTPOS2_END##LAYOUTPOS3_START#<div>hej med dig3</div>#LAYOUTPOS3_END#";
int startPos = pageCode.LastIndexOf("#LAYOUTPOS1_START#") + "hello my friend".Length + 1;
int length = pageCode.IndexOf("#LAYOUTPOS1_START#") - startPos;
string layoutcode = email.Substring(startPos, length);

i++;

}
Avatar billede Syska Mester
06. juli 2013 - 22:35 #4
Det er vel også det jeg viser dig hvordan du kan gøre.

Dette stykker finder dine "#LAYOUTPOSx#" hvor x er et tal.

Dette udover de tal den finder. Så er det vel bare at søge i din anden string hvad der skal ind i "#LAYOUTPOSx#".

var t = Regex.Matches("<div id=\"header\">#LAYOUTPOS10#</div><div id=\"news\">#LAYOUTPOS2#</div><div id=\"newposts\">#LAYOUTPOS3#</div>",
@"#LAYOUTPOS(\d{1,})#");

foreach(Match match in t)
{
    Console.WriteLine(match.Groups[1].Value);
}
Avatar billede Syska Mester
06. juli 2013 - 22:37 #5
udover = udskriver.

Men hvorfor have det så rodet?

Burde du ikke have det i forskellige felter i din DB, så du kan slå op på "#LAYOUTPOS1#" i din DB i stedet for at blande dem sammen og gøre det hele meget mere besværligt?

mvh
Avatar billede cbadk Novice
08. juli 2013 - 14:27 #6
Hej Igen!

Du gav mig faktisk en ide. Jeg brugte substring til at find den del jeg ønskede. Så min kode kom til at se sådan her ud:

            string templateCode = Code.TemplateCodeByID(templateID);

            string layoutCode = Code.LayoutCodeByID(layoutID);

            string layoutCodenew = "";

            string temppageCode = pageCode;

            Int32 layoutGroupsCounter = 1;

            string layoutTxt = "#LAYOUT" + layoutGroupsCounter + "#";

            while (layoutCode.Contains("#LAYOUT" + layoutGroupsCounter + "#") == true)
            {
                string startindex = "#LAYOUT" + layoutGroupsCounter + "_START#";

                int startPos = temppageCode.LastIndexOf(startindex) + startindex.Length + 1;
                int length = temppageCode.IndexOf("#LAYOUT" + layoutGroupsCounter + "_END#") - startPos;

                string replaceLayoutCode = temppageCode.Substring(startPos, length);
                layoutCode = layoutCode.Replace("#LAYOUT" + layoutGroupsCounter + "#", replaceLayoutCode);
                layoutCodenew = layoutCode;
                layoutGroupsCounter = layoutGroupsCounter + 1;
            }

Tak for hjælpen alligevel :)
Avatar billede Syska Mester
10. juli 2013 - 23:14 #7
Svar. Det er jo næsten og samme løsning.

Min finder bare alle selvom der er hul i rækkefølgen. Du kunne så nøjes med den liste af tal der kommer ud af min måde.
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

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