PHP Kurs anhand Contenido Contenido
-
- Beiträge: 1082
- Registriert: Di 22. Jul 2003, 10:14
- Wohnort: Hessen
- Kontaktdaten:
PHP Kurs anhand Contenido Contenido
Eines der Sätze, die ich am häufigsten hier im Forum lese ist: Bin noch nicht sehr Erfahren in PHP oder bin PHP Newbie gleichzeitg verbunden nach einer Anfrage, wie man am besten irgend ein Modul erstellt bzw. anpasst.
Erschwerend kommt hinzu, dass Programmierer selten Schriftsteller sind und Kommentare im Code abosult rudimentär sind. Was für Timo oder Emergence noch auf einen Blick erkenntlich ist, bringt die meisten zur Verzweiflung.
Wie wäre es, hier einen Mini-Php Kurs zu machen (keine Hello World) anhand eines bestehenden Contenido-Moduls? Man könnte z.B. die Sevicenavigation nehmen (relativ kurz), das Original mit Zeilennummern posten und dann systematisch die einzelnen Funktionen kommentieren.
Natürlich kann auch jedes andere Modul gewählt werden (Text (1) (HTML) verstehe sogar ich gut )
Gruß Florian
Erschwerend kommt hinzu, dass Programmierer selten Schriftsteller sind und Kommentare im Code abosult rudimentär sind. Was für Timo oder Emergence noch auf einen Blick erkenntlich ist, bringt die meisten zur Verzweiflung.
Wie wäre es, hier einen Mini-Php Kurs zu machen (keine Hello World) anhand eines bestehenden Contenido-Moduls? Man könnte z.B. die Sevicenavigation nehmen (relativ kurz), das Original mit Zeilennummern posten und dann systematisch die einzelnen Funktionen kommentieren.
Natürlich kann auch jedes andere Modul gewählt werden (Text (1) (HTML) verstehe sogar ich gut )
Gruß Florian
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
Naja, das Problem ist, daß viele Module "Fließtextstyle" sind - d.h. dort werden kaum Funktionen oder gar Objekte verwendet.
Mein Ziel ist es, irgendwann eine schöne API für Contenido zu haben, wo eben nicht jeder Programmierer nochmals SQL-Statements schreiben muß (was derzeit auch ein Verständnis der Datenbankstruktur erfordert), sondern im Prinzip einem Objekt nur noch sagt:
"Hallo Objekt, hole mir alle Kategoriepunkte unter Kategoriepunkt X, und dafür alle Artikel" oder ähnlich. Dadurch wird auch die meiste Dokumentation überflüssig, denn einfache Funktions- und Objektaufrufe sind einfacher als der derzeitige Stand von Modulen.
Bevor man also ein Modul schreibt, sollte man sich erstmal in der Datenbank informieren, wo die benötigten Daten stehen (auch hilft es, z.b. über den DBDesigner ein Reverse Engineering der Datenbankstruktur zu machen). Wenn man das Verstanden hat, versteht man auch ein wenig mehr von den Modulen.
Ich hoffe, ich hab ein wenig Weitergeholfen
Mein Ziel ist es, irgendwann eine schöne API für Contenido zu haben, wo eben nicht jeder Programmierer nochmals SQL-Statements schreiben muß (was derzeit auch ein Verständnis der Datenbankstruktur erfordert), sondern im Prinzip einem Objekt nur noch sagt:
"Hallo Objekt, hole mir alle Kategoriepunkte unter Kategoriepunkt X, und dafür alle Artikel" oder ähnlich. Dadurch wird auch die meiste Dokumentation überflüssig, denn einfache Funktions- und Objektaufrufe sind einfacher als der derzeitige Stand von Modulen.
Bevor man also ein Modul schreibt, sollte man sich erstmal in der Datenbank informieren, wo die benötigten Daten stehen (auch hilft es, z.b. über den DBDesigner ein Reverse Engineering der Datenbankstruktur zu machen). Wenn man das Verstanden hat, versteht man auch ein wenig mehr von den Modulen.
Ich hoffe, ich hab ein wenig Weitergeholfen
-
- Beiträge: 5478
- Registriert: Di 2. Mär 2004, 21:11
- Wohnort: Halchter, wo sonst? ;-)
- Kontaktdaten:
Das hat ja Snoopy, glaube ich, sogar schon gemacht, aber man sollte wenigstens ein bisschen Ahnung von Datenbanken haben, um zu wissen, wo man was nachschaut.timo hat geschrieben:Bevor man also ein Modul schreibt, sollte man sich erstmal in der Datenbank informieren, wo die benötigten Daten stehen (auch hilft es, z.b. über den DBDesigner ein Reverse Engineering der Datenbankstruktur zu machen).
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
Klar. Aber wenn du man irgendwann eine Objektbasierte API verwendet, könnte man auch ein "Tool" entwickeln, welches über einen GUI einen Prozess in PHP-Code verwandelt, den der "unbedarfte" Prozessausdenker (ich nenne ihn mal einfach so) umsetzen kann (ähnlich diesem Apple-Script-Teil, welches mit Mac OS X jetzt ausgeliefert wird). Außerdem sind Aufrufe an Objekten wesentlich einfacher zu verstehen als die ganzen SQL-Statements.SkyBlader hat geschrieben:@timo
es ist aber eigentlich egal, ob die api irgendwannsteht oder nicht.
Erfarhung in PHP braucht mann, eine gewisse Erfahrung in MySQL/DB auch, und ob man nun SQL Statemants schreibt oder die Objekte verwendet, ist im endefekkt doch wurscht ... einarbeiten muß man sich so oder so.
-
- Beiträge: 1082
- Registriert: Di 22. Jul 2003, 10:14
- Wohnort: Hessen
- Kontaktdaten:
Ich wollte keine Streit darüber entfachen, wer wann wie arbeiten soll. Meine Frage ist, ob zum jetzigen Zeitpunkt eine Lernkurs anhand von Contenido sinnvoll ist und wer sich vorstellen kann, da mitzuhelfen. Vielleicht denkt ihr aber auch, wenn das jeder weiß, dann kommen noch mehr Probleme auf uns zu (nach meiner Auffassung auch eine legitime Denkweise).timo hat geschrieben:Klar. Aber wenn du man irgendwann....
Ich glaube, Bedarf ist genügend da.
Gruß
Florian
also bei mir pers ist einfach die zeit das problem
1. bundeswehr
2. projekt
3. meine eigenen module
4. frau
5. hochzeits/zukunfsplanung
und der tag hat nunmal nur 24h ....
klar ist Bedarf da ... aber es ist ja nichts, wo es irgendwo schon was gibt
PHP Kann man lernen, und wenn man sich bei nem kurz anmeldet
MySQL ist kein geheimnis
und der rest ist einach das ganze zu verknüpfen und sich halt mal mit Contenido auseinander gesetzt zu haben. ( und forum posts lesen + contenido_faq ) wo es genügend infos über die DB Strukturen gibt.
So machen is ja einige die php/mysql beherschen auch ...
Und was ist an einem PHP Kurs anhand contenido anderst als ein normaler php/mysql kurs + forum / erfahrung sammeln ?
rein online shcwr zu realisieren, und für die standard dinge gibt es schon eine menge im netz.
Aber wenn du paar findest die es machen, warum nicht. Seh halt einfach das problem eher darin, das die die richtig fitt in contenido/php/mysql sind eher wengier die Zeit dazu haben einen "speziellen" kurs zu erstellen. Und der müsste ja auch wieder diferenziert werden ( je nach vorkenntnisse in php/mysql ).
Ist also im Prinzip schon fast ein Projekt für sich alleine.
Wünsch dir dennoch alles gute.
@timo btw die api klassen sind dennoch genial, mein letzen post nich falsch verstehen *g*
gruß
stefan
1. bundeswehr
2. projekt
3. meine eigenen module
4. frau
5. hochzeits/zukunfsplanung
und der tag hat nunmal nur 24h ....
klar ist Bedarf da ... aber es ist ja nichts, wo es irgendwo schon was gibt
PHP Kann man lernen, und wenn man sich bei nem kurz anmeldet
MySQL ist kein geheimnis
und der rest ist einach das ganze zu verknüpfen und sich halt mal mit Contenido auseinander gesetzt zu haben. ( und forum posts lesen + contenido_faq ) wo es genügend infos über die DB Strukturen gibt.
So machen is ja einige die php/mysql beherschen auch ...
Und was ist an einem PHP Kurs anhand contenido anderst als ein normaler php/mysql kurs + forum / erfahrung sammeln ?
rein online shcwr zu realisieren, und für die standard dinge gibt es schon eine menge im netz.
Aber wenn du paar findest die es machen, warum nicht. Seh halt einfach das problem eher darin, das die die richtig fitt in contenido/php/mysql sind eher wengier die Zeit dazu haben einen "speziellen" kurs zu erstellen. Und der müsste ja auch wieder diferenziert werden ( je nach vorkenntnisse in php/mysql ).
Ist also im Prinzip schon fast ein Projekt für sich alleine.
Wünsch dir dennoch alles gute.
@timo btw die api klassen sind dennoch genial, mein letzen post nich falsch verstehen *g*
gruß
stefan
-
- Beiträge: 1082
- Registriert: Di 22. Jul 2003, 10:14
- Wohnort: Hessen
- Kontaktdaten:
ich verstehe das problem nicht ganz. in contenido ist php immer noch normales php und mysql bleibt mysql. mit anderen worten: einführungen in beides sind nicht eben mangelware! wenn allerdings die leute zu faul sind, sich ein bisschen einzuarbeiten, dann wird auch ein kurs hier in diesem forum nicht weiterhelfen.
es ginge oft darum, nur eine zeile code zu verstehen und zu ändern. aber die antwort lautet einfach in neun von zehn fällen: bin drum nicht so fit in php. das könnte man einfach ändern. googeln hilft. wer allerdings zu faul ist, wird's auch hier im forum nicht lernen wollen. und die anderen finden etwas, das ihnen weiter hilft. es gibt massig angebote im netz.
gruss,
andreas
es ginge oft darum, nur eine zeile code zu verstehen und zu ändern. aber die antwort lautet einfach in neun von zehn fällen: bin drum nicht so fit in php. das könnte man einfach ändern. googeln hilft. wer allerdings zu faul ist, wird's auch hier im forum nicht lernen wollen. und die anderen finden etwas, das ihnen weiter hilft. es gibt massig angebote im netz.
gruss,
andreas
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
-
- Beiträge: 6284
- Registriert: Do 15. Mai 2003, 18:32
- Wohnort: Da findet ihr mich nie!
- Kontaktdaten:
Das war auch nicht meine Absicht Ich wollte nur meine Wunschvorstellung zeigen, wo ich mit Contenido irgendwann hinmöchteBeleuchtfix hat geschrieben:Ich wollte keine Streit darüber entfachen, wer wann wie arbeiten soll. Meine Frage ist, ob zum jetzigen Zeitpunkt eine Lernkurs anhand von Contenido sinnvoll ist und wer sich vorstellen kann, da mitzuhelfen.timo hat geschrieben:Klar. Aber wenn du man irgendwann....
da es eigentlich mein vorschlag war das ganze via forum abzuwickeln, find ich die diskussion doch ganz intressant...
ich denke mir warum denn nicht... nehmen wir doch einfach mal das service navigation modul her...
ich nehm hier einfach mal den orginal output code (etwas formatiert)
ich geh dann einfach mal zeile für zeile durch wenns recht ist...
das ganze eventuell mit warum und wieso es so gemacht wurde (da kann ich dann zeitweise auch nur schätzen... )
ich denke mir warum denn nicht... nehmen wir doch einfach mal das service navigation modul her...
ich nehm hier einfach mal den orginal output code (etwas formatiert)
Code: Alles auswählen
<?php
include_once ($cfg["path"]["contenido"].$cfg["path"]["includes"]."functions.con.php");
$catStart = "CMS_VALUE[0]";
if ($catStart != "") {
$catIds = conDeeperCategoriesArray($catStart);
echo '<table cellpadding="0" cellspacing="0" border="0"><tr>';
echo '<td><img src="images/wuerfel.gif"></td>';
if (is_array($catIds)) {
foreach ($catIds as $key => $val) {
// Ersten Eintrag ueberspringen, weil das der Menupunkt selbst ist
// und nicht angezeigt werden soll.
if ($key != 0) {
$sql = "SELECT
CAT.idcat AS idcat,
name
FROM
".$cfg["tab"]["cat"]." AS CAT,
".$cfg["tab"]["cat_lang"]." AS CATLANG
WHERE
CAT.idcat = ".$val."
AND CAT.idcat = CATLANG.idcat
AND CATLANG.idlang = '$lang'
AND CATLANG.visible = '1'";
$db->query($sql);
while ($db->next_record()) {
echo '<td height="21" class=".navigation" style="border: 0px; border-top:1px; border-color: #F7C473; border-style: dashed; background-color: #FFFFFF; padding-left:7px; padding-right:7px;">
<a class="klein" href="front_content.php?idcat='.$db->f("idcat").'">'.$db->f("name").'</a></td>';
} // end while
} // if
} // end foreach
} // end if (is_array)
echo '</tr></table>';
}
?>
das ganze eventuell mit warum und wieso es so gemacht wurde (da kann ich dann zeitweise auch nur schätzen... )
*** make your own tools (wishlist :: thx)
grundsätzliches zum input und output bereich
seit der 4.4.x serie ist es so das der input bereich sich automatisch schon im php modus befindet...
der output bereich nicht
d.h.
es reicht im
input:
bereich.
im output
bereich werden die php tags benötigt... (dafür gibt es zwei schreibweisen:
oder
ich würde an sich immer <?php ?> empfehlen...
es gäbe dann zwar noch asp style das ist aber wiederrum von der php konfiguration abhängig...
seit der 4.4.x serie ist es so das der input bereich sich automatisch schon im php modus befindet...
der output bereich nicht
d.h.
es reicht im
input:
Code: Alles auswählen
echo "hello world";
im output
Code: Alles auswählen
<?php echo "hello world"; ?>
Code: Alles auswählen
<? echo "hello world"; ?>
Code: Alles auswählen
<?php echo "hello world"; ?>
es gäbe dann zwar noch asp style das ist aber wiederrum von der php konfiguration abhängig...
*** make your own tools (wishlist :: thx)
im php bereich kann man an sich ganz normales php verwenden, schreiben...
hiezu sollte man wissen das einige variablen seitens contenido zur verfügung stehen...
bleiben wir mal bei den einfachen...
siehe
contenido/includes/config.php -> allgemeine contenido variablen
contenido/includes/cfg_sql.inc.php -> variablen für die db tabellen
ebenso sehr intressant in der
contenido/includes/functions.general.php
wird bei jeder seite die funktion reread clients aufgerufen...
diese stellt die
$cfgClient variable global zur verfügung... (für den jeweiligen aktiven client)
weitere variablen
sind via folgenden code ersichtlich
info zu print_r
-> http://at.php.net/manual/de/function.print-r.php
zu den netten anderen variablen zb $_GLOBALS
-> http://www.php.net/manual/de/language.v ... efined.php
hiezu sollte man wissen das einige variablen seitens contenido zur verfügung stehen...
bleiben wir mal bei den einfachen...
siehe
contenido/includes/config.php -> allgemeine contenido variablen
contenido/includes/cfg_sql.inc.php -> variablen für die db tabellen
ebenso sehr intressant in der
contenido/includes/functions.general.php
wird bei jeder seite die funktion reread clients aufgerufen...
diese stellt die
$cfgClient variable global zur verfügung... (für den jeweiligen aktiven client)
weitere variablen
sind via folgenden code ersichtlich
Code: Alles auswählen
<?php
echo "<pre>";
print_r($_GLOBALS);
echo "</pre>";
?>
-> http://at.php.net/manual/de/function.print-r.php
zu den netten anderen variablen zb $_GLOBALS
-> http://www.php.net/manual/de/language.v ... efined.php
*** make your own tools (wishlist :: thx)
beginnen wir mal allgemein mit dem include_once
was macht nun include_once
siehe -> http://at.php.net/manual/de/function.include-once.php
andere teile sind vordefiniert seitens contenido
$cfg["path"]["contenido"] -> contenido/includes/config.php
$cfg["path"]["includes"] -> contenido/includes/config.php
der punkt macht nichts anderes als diese variablen zu einem string zusammen zu fassen.
man könnte das auch anders schreiben:
weiters wäre es möglich noch ne andere schreibweise zu verwenden...
in der contenido api gibt es die nette funktion cInclude
zu finden in contenido/includes/api/functions.api.general.php
dies funktion nimmt drei parameter davon ist der letzte optional
man könnte auf grund dieser funktion auch folgendes schreiben
die funktion mach dann nichts anderes wie
auszuführen...
kommen wir jetzt mal dazu warum dieses include eigentlich aufrufen wird.
include_once kontrolliert zuerst ob die functions.con.php nicht bereits schon geladen ist (mit genau diesem pfad!) falls nicht wird sie nachgeladen.
sobald das passiert ist stehen die alle funktionen die in dieser datei enthalten sind zur verfügung.
ich denk mir eigentlich: diese zeile wird nicht benötigt, da functions.con.php benahe immer geladen ist.
somit könnte man sagen sicherheitshalber kontrollieren wird das ganz einfach...
Code: Alles auswählen
include_once ($cfg["path"]["contenido"].$cfg["path"]["includes"]."functions.con.php");
siehe -> http://at.php.net/manual/de/function.include-once.php
andere teile sind vordefiniert seitens contenido
$cfg["path"]["contenido"] -> contenido/includes/config.php
$cfg["path"]["includes"] -> contenido/includes/config.php
der punkt macht nichts anderes als diese variablen zu einem string zusammen zu fassen.
man könnte das auch anders schreiben:
Code: Alles auswählen
$fullpath = $cfg["path"]["contenido"].$cfg["path"]["includes"]."functions.con.php";
include_once ($fullpath);
in der contenido api gibt es die nette funktion cInclude
zu finden in contenido/includes/api/functions.api.general.php
dies funktion nimmt drei parameter davon ist der letzte optional
man könnte auf grund dieser funktion auch folgendes schreiben
Code: Alles auswählen
cInclude ("includes", "functions.con.php");
Code: Alles auswählen
include_once ($cfg["path"]["contenido"].$cfg["path"]["includes"]."functions.con.php");
kommen wir jetzt mal dazu warum dieses include eigentlich aufrufen wird.
include_once kontrolliert zuerst ob die functions.con.php nicht bereits schon geladen ist (mit genau diesem pfad!) falls nicht wird sie nachgeladen.
sobald das passiert ist stehen die alle funktionen die in dieser datei enthalten sind zur verfügung.
ich denk mir eigentlich: diese zeile wird nicht benötigt, da functions.con.php benahe immer geladen ist.
somit könnte man sagen sicherheitshalber kontrollieren wird das ganz einfach...
*** make your own tools (wishlist :: thx)
kommen wir zum nächsten teil:
im outputbereich bevor der code ausgeführt wird, wird der php code zuerst nach platzhalter variablen durchsucht.
-> CMS_VALUE[0]
diese werden einfach mittels einer search and replace funktion durch den wert der im input bereich vordefiniert ist ersetzt.
d.h.
wenn im input bereich für dieses modul
CMS_VALUE[0] = test gesetzt wäre
würde der code der dann ausgeführt wird, so aussehen:
da komm ich zu einen ganz kleinen wichtigen hinweis
diese Platzhalter sollten immer von quotes umschlossen sein !
beispiel:
würde dann
ergeben...
wäre nichts gesetzt sprich der wert ist leer oder beinhaltet ein leerzeichen wäre das ergebniss
was schlussendlich zu einem php fehler führen würde!
nun gut wie auch immer
es wird nichts anderes gemacht als der vordefinierten wert in der variable
$catStart zu speichern...
in bedacht auch die nächste zeile die kontrolliert ob $catStart einen wert enthält wäre es vernünftiger die zeile wie folgt zu definieren:
trim macht nichts anderes wie leerzeichen am beginn und am ende zu entfernen
-> http://at.php.net/manual/de/function.trim.php
Code: Alles auswählen
$catStart = "CMS_VALUE[0]";
-> CMS_VALUE[0]
diese werden einfach mittels einer search and replace funktion durch den wert der im input bereich vordefiniert ist ersetzt.
d.h.
wenn im input bereich für dieses modul
CMS_VALUE[0] = test gesetzt wäre
würde der code der dann ausgeführt wird, so aussehen:
Code: Alles auswählen
$catStart = "test";
diese Platzhalter sollten immer von quotes umschlossen sein !
beispiel:
Code: Alles auswählen
$catStart = CMS_VALUE[0];
Code: Alles auswählen
$catStart = test;
wäre nichts gesetzt sprich der wert ist leer oder beinhaltet ein leerzeichen wäre das ergebniss
Code: Alles auswählen
$catStart = ;
nun gut wie auch immer
es wird nichts anderes gemacht als der vordefinierten wert in der variable
$catStart zu speichern...
in bedacht auch die nächste zeile die kontrolliert ob $catStart einen wert enthält wäre es vernünftiger die zeile wie folgt zu definieren:
Code: Alles auswählen
$catStart = trim("CMS_VALUE[0]");
-> http://at.php.net/manual/de/function.trim.php
*** make your own tools (wishlist :: thx)