PHP Kurs anhand Contenido Contenido
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.
-
- Beiträge: 1082
- Registriert: Di 22. Jul 2003, 10:14
- Wohnort: Hessen
- Kontaktdaten:
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 !
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
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
die erklärung dazu ist wirklich sehr detailiert...
-> http://at.php.net/manual/de/control-str ... oreach.php
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...
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...
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...
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"); ?>
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
