Frage zu CXP [ERLEDIGT]

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
Benutzeravatar
Bertram Hansen
1000 working lines a day
1000 working lines a day
Beiträge: 796
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Kontaktdaten:

Frage zu CXP [ERLEDIGT]

Beitrag von Bertram Hansen » Do, 20. Feb 2020 16:03

Hallo zusammen,

wir versuchen gerade die ersten Schritte mit CXP.
Generell läuft bei uns CXP unter Apache.
Jetzt versuchen wir in einem kleinen Project in einer CXP-Datei eine eigene Function aufzurufen, die wir im Project in einerm anderen PRG-File definiert haben und innerhalb einer dynamsichen DLL mit in das Project eingebunden haben. Und das funktioniert nicht.
Definieren wir die eigene Function auch in der CXP-Datei (hier default.cxp), dann können wir diese auch aufrufen.

Dieser Code funktioniert:
Auszug aus einer CXP-Datei

Code: Alles auswählen

<%#Page layout="global.layout" trace="no" %>

<p>
<body>
  <h1>@(GetHelloWord())</h1>
  <%
     ? "Heute ist: " + CDow(Date()) + " der " + LEFT(DTOC(DATE()),2) + " " + Monat()
  %>
</body>

<%
FUNCTION Monat()
RETURN CDOW(Date())

FUNCTION GetHelloWord()
RETURN "Hallo Welt!"

%>
Dieser Code funktioniert nicht:
Auszug aus einer CXP-Datei

Code: Alles auswählen

<%#Page layout="global.layout" trace="no" %>

<p>
<body>
  <h1>@(GetHelloWord())</h1>
  <%
     ? "Heute ist: " + CDow(Date()) + " der " + LEFT(DTOC(DATE()),2) + " " + GetMonat()
  %>
</body>

<%
FUNCTION GetHelloWord()
RETURN "Hallo Welt!"

%>
Auszug aus einer separaten PRG-Datei mit der ausgelagerten Function Monat(), die wir innerhalb einer dynamsichen DLL mit in das Project eingebunden haben.

Code: Alles auswählen

FUNCTION GetMonat()
RETURN CDOW(Date())
Inhalt der Project-Datei:

Code: Alles auswählen

[PROJECT]
    VERSION       = 2.2
    Project.xpj

[Project.xpj]
    Test1.web
    Test2.dll

[Test1.web]
    COMPILE       = xpp
    COMPILE_FLAGS = /q /w
    DEBUG         = yes
    GUI           = no
    LINKER        = ALINK
    LINK_FLAGS    =
    RC_COMPILE    = ARC
    RC_FLAGS      =
    HOSTPROCESS   = default.cxp
    SITE_ROOT     = c:\xampp\htdocs\
    SITE_URL      = http://localhost:80/
// $START-AUTODEPEND
// $STOP-AUTODEPEND
    application.config
    default.cxp
    global.css
    global.layout
    robots.txt
    Test2.lib

[Test2.dll]
    COMPILE       = xpp
    COMPILE_FLAGS = /dll:DYNAMIC /wi /wl /wu /q /w
    DEBUG         = yes
    GUI           = no
    LINKER        = alink
    LINK_FLAGS    = /dll
    RC_COMPILE    = arc
    RC_FLAGS      =
    INTERMEDIATE_DEBUG   = .debug
    INTERMEDIATE_RELEASE = .release
// $START-AUTODEPEND
    Utils.obj
// $STOP-AUTODEPEND
    Utils.prg
Fehlermeldung CXP:

Code: Alles auswählen

<CXP:BuildError/>
Link Error
Description: One or more errors occurred during the link phase of this page. Please review the following specific error details and modify your source code appropriately. 
Files:
CXP File: C:\xampp\htdocs\Test1\default.cxp
Intermediate Xbase++ Code: C:\xampp\htdocs\Test1\cxp-application\default.cxp.20200220-57685837.dll
Message(s):
Linker: error ALK2102: unresolved external symbol GETMONAT in Line 0
The linker has detected an undeclared symbol for a function or procedure. Declare the missing function or use the /FORCE option to force ALINK to produce an output file.
Zuletzt geändert von Bertram Hansen am Di, 25. Feb 2020 12:54, insgesamt 2-mal geändert.
:wave:
Gruß Bertram
http://www.tobax.de

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1740
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Frage zu CXP

Beitrag von Werner_Bayern » Do, 20. Feb 2020 17:33

Servus,

wieso heisst es in der Fehlermeldung getmonat und in Deinem Code Monat()?
es grüßt euch

Werner

<when the music is over, turn off the light!>

Benutzeravatar
Marcus Herz
UDF-Programmierer
UDF-Programmierer
Beiträge: 64
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Marcus Herz » Fr, 21. Feb 2020 8:34

Hallo Bertram

Ich ruf meine DLL Funktionen immer so auf: (das ist noch Code von ganz zu Beginn, vielleicht nicht der neueste Lösungsweg)

In der CXP Datei
...
</head>
<%
hDll := dllLoad(::PhysicalPath+"helpers\Mobil.dll")
oResult := dllCall(hDll,, "cxpauftrag", ::Session, ::params)
%>
<body>
....

Benutzeravatar
Bertram Hansen
1000 working lines a day
1000 working lines a day
Beiträge: 796
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Bertram Hansen » Fr, 21. Feb 2020 9:18

Werner_Bayern hat geschrieben:
Do, 20. Feb 2020 17:33
Servus,

wieso heisst es in der Fehlermeldung getmonat und in Deinem Code Monat()?
Hallo Werner,

du hast natürlch Recht. In meinem Beispielcode muss der Functionname natürlich GetMonat heißen. :roll:
Aber das ist nicht die Ursache für den Fehler.

Den Vorschlag von Marcus versuchen wir gerade zu realisieren.
:wave:
Gruß Bertram
http://www.tobax.de

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7914
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Tom » Fr, 21. Feb 2020 9:42

Müssen die DLLs denn dynamisch gelinkt sein? Wenn Du sie statisch linkst (indem Du ihre .LIB-Dateien in die AUTODEPEND-Bereiche der jeweiligen PRGs nimmst), sollten die Funktionen auch sichtbar sein. Wozu ist das dynamische Linken gut?
Herzlich,
Tom

Benutzeravatar
Marcus Herz
UDF-Programmierer
UDF-Programmierer
Beiträge: 64
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Marcus Herz » Fr, 21. Feb 2020 9:50

Hi

VIelleicht, weil ich noch andere nicht Alaska DLLs laden muss. So jedenfalls hat es nur damals (2013) funktioniert.
Da gibts auch ein Sample von Alaska zum Einbinden einer eigenen DLL

Benutzeravatar
Bertram Hansen
1000 working lines a day
1000 working lines a day
Beiträge: 796
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Bertram Hansen » Fr, 21. Feb 2020 11:58

Hallo,

mit dem Hinweis von Markus sind wir schon mal ein Stück weiter gekommen.
Aktuell erstellen wir eine eigene DLL über den Source mit unseren eigenen Funktionen, die wir in der CXP-Datei benutzen. Hier bei dem Beispiel nur mit der Funktion GetMonat()
Dann binden wir die DLL in die CXP-Datei folgendermaßen ein:

Code: Alles auswählen

hDll := dllLoad("Test2.dll")
cVar := dllCall(hDll,, "GetMonat")
 
Die Rückgabe cVar können wir dann wieder in der CXP-Datei anwenden.

Den Hinweis von Tom werden wir auch noch ausprobieren.

Gibt es vielleicht auch einen Weg ohne über eine DLL zu gehen?
:wave:
Gruß Bertram
http://www.tobax.de

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!

Benutzeravatar
Frank Grossheinrich
Rookie
Rookie
Beiträge: 17
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Krichheim an der Weinstraße
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Frank Grossheinrich » Fr, 21. Feb 2020 13:13

Hi Bertram,

... oder man starte die Workbench, Hilfe, "Internet Technologies", "Compiled Xbase++ Pages", "Technical Concepts", "Organizing your code with helpers".

Man muss keine DLL im CXP Code laden.

Grüße,
Frank

Durch einen Übersetzer gejagt:
"Organisieren Sie Ihren Code mit Helfern
Als Entwickler kennen Sie vielleicht schon die Idee "Teilen und Erobern" und folgen ihr hoffentlich. Wenn eine Code-Einheit zu groß wird und zu viele Elemente enthält, ist sie schwer zu navigieren, schwer zu überblicken und schwer zu verstehen. Kurz gesagt: es wird komplex. Unsere Hauptwaffe gegen diese Komplexität ist Teilen und Erobern: Wir teilen die Einheit in kleinere Teile auf, die wir isoliert verstehen und testen können.

Dies gilt insbesondere, wenn Sie sich Ihre CXP-Seiten ansehen: Sie bestehen aus HTML-Markup, möglicherweise Javascript-Code und schließlich Ihrem Xbase++-Code. Dies ist in Ordnung, solange Sie nur dynamische Inhalte oder super kleine Webanwendungen erstellen. Aber was ist, wenn Sie eine Webanwendung mit Geschäftslogik und -ansichten entwickeln? Ein Hinweis darauf, dass Sie tatsächlich eine Webanwendung erstellen, ist die Anzahl der CXP-Seiten. Wenn Ihr Projekt aus mehr als 3-4 CXP-Seiten mit gemeinsamer Logik oder derselben Datenquelle besteht, dann müssen Sie die folgenden Regeln ausnahmslos befolgen:

Verschieben Sie den gesamten Javascript- und CSS-Code in separate Dateien, die in einer von Ihren CXP-Seiten verwendeten Layoutseite enthalten sind.

Verwenden Sie Mitglieder oder Methoden nur über die @() Inline-Syntax innerhalb Ihrer CXP-Seiten/Views.

Verwenden Sie die @ einzeilige Syntax für Iteratoren und bedingte Abschnitte.

Haben Sie niemals Code in Ihrer CXP-Seite, der ?/? HTML-Ausgabe ausführt.

Versuchen Sie, Code-Abschnitte (<% %>) in Ihren CXP-Seiten zu vermeiden. Natürlich können Sie CXP-Seiten haben, die nur Code enthalten.

Fügen Sie Ihrem Projekt ein DLL-Target hinzu. Der Speicherort des DLL-Targets muss sich in .\Hilfen befinden.

Verschieben Sie Ihre gesamte Geschäftslogik oder Ihren Funktionscode auf dieses DLL-Ziel.

Fügen Sie ein Unit-Test-Ziel zu Ihrem DLL-Ziel hinzu, damit Sie automatisierte Tests für Ihre Geschäftslogik schreiben können.

Aber woher weiß eine CXP-Seite, dass die Klassen und Funktionen, die Sie in Ihrem Code verwenden wollen, in einer Helper-DLL liegen? Nun, dazu müssen Sie einen Helfer-Abschnitt zu Ihrer Datei <Dateiname>.cxp.config oder application.config hinzufügen, wie unten gezeigt:

<helpers lib="featuremgmt.lib"
lib="sitecore.lib"
dll="anotherdll.dll" />

Die vorherige Helfer-Deklaration zwingt den cxc-builder dazu, zwei Bibliotheken mit Ihrer CXP-Seite zu verknüpfen, wenn die Binärdatei der Seite erstellt wird. Die "dll"-Einträge Ihrer Helferdeklaration werden jedoch vom cxp-Worker verwendet, der diese DLLs in den Prozess lädt, bevor er Ihre CXP-Binärdatei lädt und den Code in Ihrer Seite ausführt.

Es ist zu beachten, dass in den Helfer-LIB- und DLL-Referenzen keine Pfadelemente erlaubt sind. Der Grund dafür ist, dass jede Webanwendung in sich abgeschlossen sein und ohne Neukonfiguration an einen anderen Ort verschoben werden sollte. Folglich müssen alle Helfer-DLLs und -LIBs in einem Helfer-Unterverzeichnis relativ zu Ihrer CXP-Seite bereitgestellt werden.

*** Übersetzt mit www.DeepL.com/Translator (kostenlose Version) ***"

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1640
Registriert: Mi, 28. Jul 2010 17:16

Re: Frage zu CXP

Beitrag von ramses » Fr, 21. Feb 2020 15:50

Hallo Bertram

wenn du noch am Anfang deiner Entwicklung stehst kann ich dir wirklich nur dringend Empfehlen dich über den Aufbau und Funktion von "Single-Page-Webanwendung" zu informieren und dann vielleicht diesen Weg zu gehen. Dieser Weg bringt dir vermutlich viel bessere und Ansprechendere Resultate. Dein Freund auf diesem Weg ist xb2.net .....

Wir haben unsere Web-Anwendung auf SPW umgebaut, die Anwender sind begeistert, kein vergleich zu GUI Apps oder klassischen Web Apps. Die funktionsgleichen GUI-Apps wollen die User gar nicht mehr nutzen.....
Valar Morghulis

Gruss Carlo

Benutzeravatar
Marcus Herz
UDF-Programmierer
UDF-Programmierer
Beiträge: 64
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Marcus Herz » Fr, 21. Feb 2020 18:20

Das wäre doch ein Thema für eine interessante Session

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1640
Registriert: Mi, 28. Jul 2010 17:16

Re: Frage zu CXP

Beitrag von ramses » Fr, 21. Feb 2020 22:46

Marcus Herz hat geschrieben:
Fr, 21. Feb 2020 18:20
Das wäre doch ein Thema für eine interessante Session
Hallo Marcus

SPW sind nicht nur äusserst Interesant sondern bringt im Gegensatz zu CXP einige beinahme unbezahlbare Vorteile. Z.B. finden sich sehr einfach Mitarbeiter mit sehr sehr guten HTML/CSS/JS Kenntnissen und auch viele viele Tools fürs Frontend mit Möglichkeiten die mit CXP nicht umsetzbar sind. So lassen sich die Arbeiten auf Front-/Backend sehr einfach aufteilen so werden beide Teile homogen und äusserst kompakt und sehr sehr schnell. Auch die Möglichkeiten und Performance sind um Welten besser Galaxien besser und schneller als es mit Xbase-GUI, klassischen Web-App oder CXP überhaupt möglich wäre. Sogar Off-Line Teile sind möglich. Es ist auch eine klare Trennung zwischen Font/Backend auch was die Sprachen angeht. Facebook, Google und Co. haben hier Pionierarbeit geleistet ohne SPW wären diese Dienste gar nicht mehr so möglich wie wir diese heute kennen. Auf SPW umzustellen war für mich / uns eine der besten Entscheidungen ever ..... ich würde niemals mehr etwas anderes als das SPW Design verwenden. Deshalb finde ich dass sich jeder Entwickler zu beginn eines Projektes sich unbedingt ausführlich dazu Gedanken machen sollte: CXP, SPW XB2Net, klassische Web-Apps .....
Valar Morghulis

Gruss Carlo

Benutzeravatar
HaPe
Foren-Moderator
Foren-Moderator
Beiträge: 813
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: Frage zu CXP

Beitrag von HaPe » Sa, 22. Feb 2020 9:08

... wobei du besser von SPA sprechen solltest, damit man im Web auch gleich zum Buzzword die richtigen Infos bekommt.

https://www.simicart.com/blog/pwa-vs-spa/
--
Hans-Peter

Organisator der XUG Stuttgart
Beisitzer des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Bertram Hansen
1000 working lines a day
1000 working lines a day
Beiträge: 796
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Bertram Hansen » Di, 25. Feb 2020 11:25

Hallo Frank,

vielen Dank für die Infos aus erster Hand. Damit haben wir es hinbekommen. :D
:wave:
Gruß Bertram
http://www.tobax.de

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!

Benutzeravatar
Bertram Hansen
1000 working lines a day
1000 working lines a day
Beiträge: 796
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Bertram Hansen » Di, 25. Feb 2020 11:27

Hallo Carlo,

danke auch für deine Tipps, aber wir wollen ein CXP-Projekt erstellen.
:wave:
Gruß Bertram
http://www.tobax.de

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7914
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Tom » Di, 25. Feb 2020 11:51

SPA ist auch nicht für jede Anwendungsart das Optimum.
Herzlich,
Tom

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1640
Registriert: Mi, 28. Jul 2010 17:16

Re: Frage zu CXP

Beitrag von ramses » Di, 25. Feb 2020 11:57

Hallo Tom

Das könnte durchaus sein.

Deshalb schrieb ich ja: "....dass sich jeder Entwickler zu beginn eines Projektes sich unbedingt ausführlich dazu Gedanken machen sollte....."

Aber an was denkst du, wenn du meinst: "nicht das Optimum"?
Valar Morghulis

Gruss Carlo

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7914
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Frage zu CXP

Beitrag von Tom » Di, 25. Feb 2020 12:32

Hallo, Carlo.

Komplexere Anwendungen werden mit dieser Technologie schnell unübersichtlich und sind dann schwierig zu warten. Die starke Clientorientierung - und Offlinefähigkeiten verbunden mit der Möglichkeit, Peristenz zu realisieren - verlangt viel vom Backend, bricht u.U. Regeln der Datenhoheit und kann für Inkonsistenzen sorgen. Anwendungen mit viel Geschäftslogik, die sich auf die Stringenz von voneinander abhängigen Daten verlassen können müssen, sind hierfür in meinen Augen nicht geeignet. Bei Facebook oder Insta ist es egal, ob die Timeline oder die Likecounter aufs Promill mit dem echten Datenbestand übereinstimmen, und zwar für alle Clients, die ihn sehen, weil nach der nächsten Aktualisierung sowieso wieder alles anders ist. In einem Geschäftssystem ist das anders.

Alles hat seine Vor- und Nachteile.
Herzlich,
Tom

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1640
Registriert: Mi, 28. Jul 2010 17:16

Re: Frage zu CXP [ERLEDIGT]

Beitrag von ramses » Di, 25. Feb 2020 13:29

Hallo Tom

ja mit Offlinefähigkeiten lassen sich wirklich nur ganz spezifische Aufgaben abdecken. Aber sonst, in einer OnLine SPA lassen sich Dinge erreichen die in einer GUI-App oder klassischen Web-App gar nicht mehr möglich sind.

Aber richtig: Alles hat seine Vor- und Nachteile und jeder auch seine Vorlieben.
Valar Morghulis

Gruss Carlo

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7914
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Frage zu CXP [ERLEDIGT]

Beitrag von Tom » Di, 25. Feb 2020 14:03

Hallo, Carlo.

Ich habe nicht Desktop mit Web verglichen, sondern webbasiert mit SPA. Da gibt es viele, viele Abstufungen. Manchmal ist es leichter, übersichtlicher und auch wartbarer, wenn man mit seitengestützten Konzepten arbeitet. Und die ganze wunderbare Welt der Möglichkeiten hat man trotzdem, je nach Framework.
Herzlich,
Tom

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1640
Registriert: Mi, 28. Jul 2010 17:16

Re: Frage zu CXP [ERLEDIGT]

Beitrag von ramses » Di, 25. Feb 2020 14:36

Hallo Tom

es gibt unterschiedliche Vorgaben, Auflagen und Lösungswege ..... die je nach dem auch einen Weg bestimmen oder verbieten ....
Valar Morghulis

Gruss Carlo

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12286
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Frage zu CXP

Beitrag von AUGE_OHR » Mi, 26. Feb 2020 7:53

hi,
Bertram Hansen hat geschrieben:
Di, 25. Feb 2020 11:25
vielen Dank für die Infos aus erster Hand. Damit haben wir es hinbekommen. :D
schön das du es mit Frank++ Hilfe zum laufen gebracht hast. =D>

und ... wie ist die Performance :?:
gruss by OHR
Jimmy

Benutzeravatar
Bertram Hansen
1000 working lines a day
1000 working lines a day
Beiträge: 796
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Kontaktdaten:

Re: Frage zu CXP [ERLEDIGT]

Beitrag von Bertram Hansen » Mi, 26. Feb 2020 10:38

Hallo Jimmy,

wir sind noch am Anfang von unserem Projekt. Es ging erstmal um Grundlagen. Jetzt versuchen wir Tabellen mit der ADS-Klasse von Friedhelm einzubinden. Darum kann ich dir jetzt noch nicht mitteilen, wie die Performace ist.
:wave:
Gruß Bertram
http://www.tobax.de

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!

Antworten