PHP Kurs anhand Contenido Contenido
das nächste kürz ich jetzt einfach nur mal ab:
ad. if etc.
-> http://at.php.net/manual/de/language.co ... ctures.php
-> http://at.php.net/manual/de/language.operators.php
das zu wissen ist an sich grund elementar um jetzt weiter zu machen.
ad. if etc.
-> http://at.php.net/manual/de/language.co ... ctures.php
-> http://at.php.net/manual/de/language.operators.php
das zu wissen ist an sich grund elementar um jetzt weiter zu machen.
*** make your own tools (wishlist :: thx)
-
- Beiträge: 1082
- Registriert: Di 22. Jul 2003, 10:14
- Wohnort: Hessen
- Kontaktdaten:
weiters
conDeeperCategoriesArray ist ne funktion die in functions.con.php definiert ist...
was macht nun diese nette funktion, wobei wir vorher sicher stellten das sie mittels include_once vorhanden ist.
eine aktualisierte version dieser funktion findet ihr hier:
http://www.contenido.org/forum/viewtopi ... 3734#43734
zu funktionen allgemein:
innerhalb von funktionen stehen selbstdefinierte variablen nur dann zur verfügung wenn sie mittels
global
angefordert werden.
super globale variablen stehen automatisch zur verfügung
-> http://www.php.net/manual/de/language.v ... efined.php
es wird also mit
dafür sorge getragen das die db klasse $db
$client -> die variable beinhaltet den aktiven client
$cfg -> alle $cfg variablen
innerhalb dieser funktion zur verfügung stehen...
die funktion liefert alle kategorien die in dieser kategorie vorhanden sind als array zurück.
-> http://at.php.net/manual/de/language.types.array.php
das intressante an der funktion ist
falls keine kategorien gefunden werden wird nichts zurückgeliefert !
Code: Alles auswählen
$catIds = conDeeperCategoriesArray($catStart);
was macht nun diese nette funktion, wobei wir vorher sicher stellten das sie mittels include_once vorhanden ist.
Code: Alles auswählen
/**
*
* Fetch all deeper categories by a given id
*
* @param int $idcat Id of category
* @return array Array with all deeper categories
*
* @author Olaf Niemann <olaf.niemann@4fb-de>
* Jan Lengowski <jan.lengowski@4fb.de>
*
* @copyright four for business AG <www.4fb.de>
*/
function conDeeperCategoriesArray($idcat_start)
{
global $db, $client, $cfg;
$sql = "SELECT
*
FROM
".$cfg["tab"]["cat_tree"]." AS A,
".$cfg["tab"]["cat"]." AS B
WHERE
A.idcat = B.idcat AND
idclient = '".$client."'
ORDER BY
idtree";
$db->query($sql);
$i = 0;
while ( $db->next_record() ) {
if ($db->f("parentid") < $idcat_start) { // ending part of tree
$i = 0;
}
if ($db->f("idcat") == $idcat_start) { // starting part of tree
$i = 1;
}
if ($i == 1) {
$catstring[] = $db->f("idcat");
}
}
return $catstring;
}
http://www.contenido.org/forum/viewtopi ... 3734#43734
zu funktionen allgemein:
innerhalb von funktionen stehen selbstdefinierte variablen nur dann zur verfügung wenn sie mittels
global
angefordert werden.
super globale variablen stehen automatisch zur verfügung
-> http://www.php.net/manual/de/language.v ... efined.php
es wird also mit
Code: Alles auswählen
global $db, $client, $cfg;
$client -> die variable beinhaltet den aktiven client
$cfg -> alle $cfg variablen
innerhalb dieser funktion zur verfügung stehen...
die funktion liefert alle kategorien die in dieser kategorie vorhanden sind als array zurück.
-> http://at.php.net/manual/de/language.types.array.php
das intressante an der funktion ist
falls keine kategorien gefunden werden wird nichts zurückgeliefert !
Zuletzt geändert von emergence am Do 14. Apr 2005, 09:41, insgesamt 1-mal geändert.
*** make your own tools (wishlist :: thx)
gehen wir weiter:
an sich klar was da gemacht wird; ich hole hier doch etwas weiter aus...
-> http://at.php.net/manual/de/function.echo.php
ein paar kleine beispiele: meine anmerkung setz ich in [ ] hinein..
ergebniss:
ergebniss:
sogenannte steuerzeichen funktionieren nur innerhalb von " "
jedoch das funkt:
ergebniss:
auch nicht unintressant:
ergebniss:
hingegen:
ergebniss:
Code: Alles auswählen
echo '<table cellpadding="0" cellspacing="0" border="0"><tr>';
echo '<td><img src="images/wuerfel.gif"></td>';
-> http://at.php.net/manual/de/function.echo.php
ein paar kleine beispiele: meine anmerkung setz ich in [ ] hinein..
Code: Alles auswählen
$string = "hello world - \"my world\"\n";
echo $string;
Code: Alles auswählen
hello world - "my world"[+ line break]
Code: Alles auswählen
$string = 'hello world - "my world"\n';
echo $string;
Code: Alles auswählen
hello world - "my world"\n
jedoch das funkt:
Code: Alles auswählen
$string = 'hello world - "my world"'."\n";
echo $string;
Code: Alles auswählen
hello world - "my world"[+ line break]
Code: Alles auswählen
$string = 'hello world - "my world"'."\n";
echo "this -> $string";
Code: Alles auswählen
this -> hello world - "my world"[+ line break]
Code: Alles auswählen
$string = 'hello world - "my world"'."\n";
echo 'this -> $string';
Code: Alles auswählen
this -> $string
*** make your own tools (wishlist :: thx)
weiters
wie bereits vorhin bei der funktion conDeeperCategoriesArray
angemerkt liefert die funktion entweder nen array oder nichts zurück...
das is_array kontrolliert ob das nun wirklich ein array ist. wenn ja gehts weiter falls nein -> eh klar.
ad is_array
-> http://at.php.net/manual/de/function.is-array.php
kommen wir dazu warum das wichtig ist innerhalb der service navigation:
die nachfolgende for_each erwartet einen array
falls es keiner wäre hätte man nen php fehler...
ad. control-structures
es gibt zeitweise die abkürzung das die { } nicht vorhanden sind.
das bedeutet (ich machs mit einrückung ersichtlich):
ergebniss:
sollte $b nun 2 sein wird nur
echt wahrend of line
ausgegeben...
schreibt man
wird nur
ausgegeben...
zu den netten = == === zeichen
-> http://at.php.net/manual/de/language.operators.php
Code: Alles auswählen
if (is_array($catIds)) {
...
}
angemerkt liefert die funktion entweder nen array oder nichts zurück...
das is_array kontrolliert ob das nun wirklich ein array ist. wenn ja gehts weiter falls nein -> eh klar.
ad is_array
-> http://at.php.net/manual/de/function.is-array.php
kommen wir dazu warum das wichtig ist innerhalb der service navigation:
die nachfolgende for_each erwartet einen array
falls es keiner wäre hätte man nen php fehler...
ad. control-structures
es gibt zeitweise die abkürzung das die { } nicht vorhanden sind.
das bedeutet (ich machs mit einrückung ersichtlich):
Code: Alles auswählen
$a = 1;
$b = 1;
if ($a == $b)
echo "ident !";
echo "echt wahr";
echo "end of line";
Code: Alles auswählen
ident !echt wahrend of line
echt wahrend of line
ausgegeben...
schreibt man
Code: Alles auswählen
$a = 1;
$b = 2;
if ($a == $b) {
echo "ident !";
echo "echt wahr";
}
echo "end of line";
Code: Alles auswählen
end of line
zu den netten = == === zeichen
-> http://at.php.net/manual/de/language.operators.php
*** make your own tools (wishlist :: thx)
foreach
die erklärung dazu ist wirklich sehr detailiert...
-> http://at.php.net/manual/de/control-str ... oreach.php
die erklärung dazu ist wirklich sehr detailiert...
-> http://at.php.net/manual/de/control-str ... oreach.php
*** make your own tools (wishlist :: thx)
okay gehen wir weiter
kommen wir zu der db klasse
das einfach zu erklären
innerhalb von contenido kann man immer davon ausgehen das eine db klasse mit $db vorhanden ist.
man kann nun ne eigene definieren oder die bestehende hernehmen...
deshalb wurde am beginn des moduls auch keine klasse initialisiert...
machen wir es mal ganz sauber...
ich verwende dafür gerne etwas wie das hier
-> http://at.php.net/manual/de/function.is-object.php
mach nichts anderes wie zu kontrollieren ob die $db bereits initialisiert ist, falls nicht -> ! wird eine neue initialisiert.
mit dieser klasse können wir nun eine x-beliebige db abfrage ausführen...
um host user, pass etc brauchen wir uns da in weiterer folge nicht mehr sonderlich viel kümmern... (deshalb ist es auch so praktisch )
die db abfrage in unserem fall sieht so aus
bei der syntax bei $sql muss man sich nichts weiters dabei denken, ist so nur lesbarer... in $sql wird nur ein string zusammen gebaut der dann an die klasse übergeben und ausgeführt wird...
im string sobald die variablen ersetzt wurden erhält man zb etwas wie das hier
ein kleiner mysql abstecher...
sicher etwas verwirrend ist das CAT oder CATLANG
-> sind innerhalb von sql selbstgewählte abkürzungen für die tabellen namen. sieht man nach FROM
man könnte auch
schreiben...
aber bleiben wir mal beim ersten teil des queries...
A.idcat AS idcat hat den hintergrund das das feld nicht den bezeichner A.idcat hat sondern nur mittels idcat angesprochen werden kann...
nun gut warum hat name das nicht ?
weil name innerhalb der beiden tabellen nur einmal vorkommt ! und somit ist es eindeutig...
idcat kommt sowohl in der ersten tabelle A als auch in der zweiten tabelle B vor
selektiert werden soll der wert von der ersten tabelle... (an sich könnte man auch B.idcat nehmen -> ist egal)
einen guten hintergrund wie man sql queries zusammenstellt findet man auf
-> http://dev.mysql.com/doc/mysql/en/index.html (da empfehle ich wirklich die englische doku, da die deutsche nicht auf den aktuellsten stand ist)
einen hintergrund wofür die einzelnen tabellen von contenido da sind findet man auf
-> http://www.thilo-sommer.de/PHPMyFAQ/ind ... 74&lang=de
snoopy war so nett und hat die hübschen grafiken dazu erstellt...
und nun weiter
die klasse $db wurde ja initialisiert...
innerhalb dieser klasse gibt es funktionen die nur innerhalb dieser klasse zur verfügung stehen und an diese gebunden sind..
-> http://at.php.net/manual/de/language.oop.php
okay wir wissen nun das query eine funktion innerhalb der klasse $db ist.
in diese funktion übergeben wir den erzeugt string der in $sql vorher erstellt wurde!
was steht nun alles in dieser klasse als funktionen zur verfügung ?
siehe
conlib/local.php -> hier ist die DB_Contenido definiert
diese klasse erweitert bzw kann funktionen die in der
conlib/db_mysql.inc
sind verwenden...
da sollte man noch wissen das diese conlib auf der phplib klasse basiert...
d.h. doku findet man hier:
http://www.sanisoft.com/phplib/manual/
-> http://kris.koehntopp.de/artikel/phplib-deutsch/
intressant ist dort nur die db klasse mit den zur verfügung gestellten funktionen...
kommen wir zu der db klasse
das einfach zu erklären
innerhalb von contenido kann man immer davon ausgehen das eine db klasse mit $db vorhanden ist.
man kann nun ne eigene definieren oder die bestehende hernehmen...
deshalb wurde am beginn des moduls auch keine klasse initialisiert...
machen wir es mal ganz sauber...
ich verwende dafür gerne etwas wie das hier
Code: Alles auswählen
if ( !is_object($db) ) {
$db = new DB_Contenido;
}
mach nichts anderes wie zu kontrollieren ob die $db bereits initialisiert ist, falls nicht -> ! wird eine neue initialisiert.
mit dieser klasse können wir nun eine x-beliebige db abfrage ausführen...
um host user, pass etc brauchen wir uns da in weiterer folge nicht mehr sonderlich viel kümmern... (deshalb ist es auch so praktisch )
die db abfrage in unserem fall sieht so aus
Code: Alles auswählen
$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);
im string sobald die variablen ersetzt wurden erhält man zb etwas wie das hier
ein kleiner mysql abstecher...
Code: Alles auswählen
SELECT CAT.idcat AS idcat, name FROM con_cat AS CAT, con_cat_lang AS CATLANG WHERE CAT.idcat = 1 AND CAT.idcat = CATLANG.idcat AND CATLANG.idlang = '1' AND CATLANG.visible = '1'
-> sind innerhalb von sql selbstgewählte abkürzungen für die tabellen namen. sieht man nach FROM
man könnte auch
Code: Alles auswählen
$sql = "SELECT
A.idcat AS idcat,
name
FROM
".$cfg["tab"]["cat"]." AS A,
".$cfg["tab"]["cat_lang"]." AS B
WHERE
A.idcat = ".$val."
AND A.idcat = B.idcat
AND B.idlang = '$lang'
AND B.visible = '1'";
$db->query($sql);
aber bleiben wir mal beim ersten teil des queries...
Code: Alles auswählen
$sql = "SELECT
A.idcat AS idcat,
name
nun gut warum hat name das nicht ?
weil name innerhalb der beiden tabellen nur einmal vorkommt ! und somit ist es eindeutig...
idcat kommt sowohl in der ersten tabelle A als auch in der zweiten tabelle B vor
selektiert werden soll der wert von der ersten tabelle... (an sich könnte man auch B.idcat nehmen -> ist egal)
einen guten hintergrund wie man sql queries zusammenstellt findet man auf
-> http://dev.mysql.com/doc/mysql/en/index.html (da empfehle ich wirklich die englische doku, da die deutsche nicht auf den aktuellsten stand ist)
einen hintergrund wofür die einzelnen tabellen von contenido da sind findet man auf
-> http://www.thilo-sommer.de/PHPMyFAQ/ind ... 74&lang=de
snoopy war so nett und hat die hübschen grafiken dazu erstellt...
und nun weiter
die klasse $db wurde ja initialisiert...
innerhalb dieser klasse gibt es funktionen die nur innerhalb dieser klasse zur verfügung stehen und an diese gebunden sind..
-> http://at.php.net/manual/de/language.oop.php
Code: Alles auswählen
$db->query($sql);
in diese funktion übergeben wir den erzeugt string der in $sql vorher erstellt wurde!
was steht nun alles in dieser klasse als funktionen zur verfügung ?
siehe
conlib/local.php -> hier ist die DB_Contenido definiert
diese klasse erweitert bzw kann funktionen die in der
conlib/db_mysql.inc
sind verwenden...
da sollte man noch wissen das diese conlib auf der phplib klasse basiert...
d.h. doku findet man hier:
http://www.sanisoft.com/phplib/manual/
-> http://kris.koehntopp.de/artikel/phplib-deutsch/
intressant ist dort nur die db klasse mit den zur verfügung gestellten funktionen...
Zuletzt geändert von emergence am Fr 19. Nov 2004, 14:52, insgesamt 1-mal geändert.
*** make your own tools (wishlist :: thx)
okay zum letzten teil:
so richtig schön übersichtlich geschrieben
vereinfachen wir das ganze mal auf das notwendigste
im prinzip will das ganze modul nichts anderes wie die idcat und den namen auszugeben die pro zeile als ergebniss geliefert werden !
deshalb auch das while
-> http://at.php.net/manual/de/control-str ... .while.php
solange der aufruf $db->next_record() ein ergebniss liefert wird die schleife ausgeführt !
das mit echo haben wir schon weiter oben behandelt...
wie greife ich nur auf ein solches ergebniss feld zu... und wie weiss ich wie sie heissen...
nach dem sql string den das modul erzeugt hat wissen wir folgendes
erstes feld -> "idcat"
zweites feld -> "name"
die ausgabe erfolgt nun mittels der in der klasse zur verfügung gestellten funktion
echo $db->f("idcat");
wir übergeben also nichts anderes wie den namen des feldes und die funktion innerhalb der klasse liefert uns das ergebniss zurück
das selbe nun beim feld name...
echo $db->f("name");
tja das ist es im grossen und ganzen...
bei controll-structures sollte man sich immer merken
wenn ich was aufmache, muss ich es auch wieder zumachen...
die folge ist sonst meist ein php fehler...
Code: Alles auswählen
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
vereinfachen wir das ganze mal auf das notwendigste
Code: Alles auswählen
while ($db->next_record()) {
echo 'front_content.php?idcat='.$db->f("idcat").' -> '.$db->f("name");
} // end while
deshalb auch das while
-> http://at.php.net/manual/de/control-str ... .while.php
solange der aufruf $db->next_record() ein ergebniss liefert wird die schleife ausgeführt !
das mit echo haben wir schon weiter oben behandelt...
wie greife ich nur auf ein solches ergebniss feld zu... und wie weiss ich wie sie heissen...
nach dem sql string den das modul erzeugt hat wissen wir folgendes
Code: Alles auswählen
SELECT A.idcat as idcat, name ...
zweites feld -> "name"
die ausgabe erfolgt nun mittels der in der klasse zur verfügung gestellten funktion
echo $db->f("idcat");
wir übergeben also nichts anderes wie den namen des feldes und die funktion innerhalb der klasse liefert uns das ergebniss zurück
das selbe nun beim feld name...
echo $db->f("name");
tja das ist es im grossen und ganzen...
bei controll-structures sollte man sich immer merken
wenn ich was aufmache, muss ich es auch wieder zumachen...
die folge ist sonst meist ein php fehler...
*** make your own tools (wishlist :: thx)
ad. fehler
es empfiehlt sich immer wenn etwas nicht so funktioniert wie es funktionieren soll einen blick in das errorlog.txt von contenido zu machen...
entweder wurde irgendwo ein bug mit den quotes reingebaut
so wie da
korrekt wäre ja
oder ein ; oder } ) wurde vergessen...
bei sql abfragen ist es immer empfehlenswert, wenn man sich nicht sicher ist wie das query wirklich funktioniert etwas wie
echo $sql."\n<br>";
einzusetzen und direkt im phpmyadmin oder ähnlichem auszuprobieren...
fehlermeldungen im errorlog.txt sind meist logisch sobald man sich die mühe macht nur zu versuchen zu verstehen was der blöde kasten da wieder bemängelt...
es empfiehlt sich immer wenn etwas nicht so funktioniert wie es funktionieren soll einen blick in das errorlog.txt von contenido zu machen...
entweder wurde irgendwo ein bug mit den quotes reingebaut
so wie da
Code: Alles auswählen
echo "test".'was auch immer "jaja "."end";
Code: Alles auswählen
echo "test".'was auch immer "jaja "'."end";
bei sql abfragen ist es immer empfehlenswert, wenn man sich nicht sicher ist wie das query wirklich funktioniert etwas wie
echo $sql."\n<br>";
einzusetzen und direkt im phpmyadmin oder ähnlichem auszuprobieren...
fehlermeldungen im errorlog.txt sind meist logisch sobald man sich die mühe macht nur zu versuchen zu verstehen was der blöde kasten da wieder bemängelt...
*** make your own tools (wishlist :: thx)
wenn teile einer zeile nicht klar sind am besten auf
http://at.php.net/
einfach in der funktions liste suchen...
oder unter google...
da hab ich noch nen netten kleinen test falls es jemanden intressiert:
eine datei (test.php) mit folgenden inhalt befindet sich in contenido/external/wysiwyg/spaw/
was möchte ich damit erreichen bzw. was mache ich genau... ?
http://at.php.net/
einfach in der funktions liste suchen...
oder unter google...
da hab ich noch nen netten kleinen test falls es jemanden intressiert:
eine datei (test.php) mit folgenden inhalt befindet sich in contenido/external/wysiwyg/spaw/
Code: Alles auswählen
<?php
@include (implode (DIRECTORY_SEPARATOR , array_slice(explode(DIRECTORY_SEPARATOR , dirname(__FILE__)), 0, -3)) . DIRECTORY_SEPARATOR . "includes" . DIRECTORY_SEPARATOR . "config.php"); ?>
*** make your own tools (wishlist :: thx)
Ok, ist zwar schon über 2 Jahr 'alt', aber ich will zeigen, das ich mich bemühe :
von innen nach aussen :
*0*
__FILE__
liefert den vollständigen Pfad der aktuellen Datei, also
"xx/xx/contenido/external/wysiwyg/spaw/test.php"
*1*
dirname(*0*)
liefert davon den Pfad, also
"xx/xx/contenido/external/wysiwyg/spaw/"
*2*
explode(DIRECTORY_SEPARATOR , *1*)
macht aus diesem Pfad ein Feld von einzelnen Strings, jeweils immer am "/" aufgetrennt, also
[xxxx][contenido][external][wysiwyg][spaw]
*3*
array_slice(*2*, 0, -3))
liefert das Array - vermindert um die 3 letzten Elemente zurück. Übrig bleibt
[xx][xx][contenido]
*4*
implode(DIRECTORY_SEPARATOR , *3* )
baut aus diesem 'Rest' - Array wieder einen String, indem es die einzelnen Elemente mit dem DIRECTORY_SEPARATOR "/" wieder zusammenfügt :
xx/xx/contenido
*5*
*4* . DIRECTORY_SEPARATOR . "includes" . DIRECTORY_SEPARATOR . "config.php"
fügt dazu jetzt noch "/includes/config.php" und fertig ist :
*6*
include(xx/xx/contenido/includes/config.php");
Danke und viele Grüße
Tino
(der sich seit 8 Wochen durch's php - Neuland kämpft..
.. diese Array - Funktionen sind schon echt goil )
Code: Alles auswählen
<?php
@include (implode (DIRECTORY_SEPARATOR , array_slice(explode(DIRECTORY_SEPARATOR , dirname(__FILE__)), 0, -3)) . DIRECTORY_SEPARATOR . "includes" . DIRECTORY_SEPARATOR . "config.php"); ?>
*0*
__FILE__
liefert den vollständigen Pfad der aktuellen Datei, also
"xx/xx/contenido/external/wysiwyg/spaw/test.php"
*1*
dirname(*0*)
liefert davon den Pfad, also
"xx/xx/contenido/external/wysiwyg/spaw/"
*2*
explode(DIRECTORY_SEPARATOR , *1*)
macht aus diesem Pfad ein Feld von einzelnen Strings, jeweils immer am "/" aufgetrennt, also
[xxxx][contenido][external][wysiwyg][spaw]
*3*
array_slice(*2*, 0, -3))
liefert das Array - vermindert um die 3 letzten Elemente zurück. Übrig bleibt
[xx][xx][contenido]
*4*
implode(DIRECTORY_SEPARATOR , *3* )
baut aus diesem 'Rest' - Array wieder einen String, indem es die einzelnen Elemente mit dem DIRECTORY_SEPARATOR "/" wieder zusammenfügt :
xx/xx/contenido
*5*
*4* . DIRECTORY_SEPARATOR . "includes" . DIRECTORY_SEPARATOR . "config.php"
fügt dazu jetzt noch "/includes/config.php" und fertig ist :
*6*
include(xx/xx/contenido/includes/config.php");
Danke und viele Grüße
Tino
(der sich seit 8 Wochen durch's php - Neuland kämpft..
.. diese Array - Funktionen sind schon echt goil )