PHP Kurs anhand Contenido Contenido

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 19. Nov 2004, 12:06

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.
*** make your own tools (wishlist :: thx)

Beleuchtfix
Beiträge: 1082
Registriert: Di 22. Jul 2003, 10:14
Wohnort: Hessen
Kontaktdaten:

Beitrag von Beleuchtfix » Fr 19. Nov 2004, 12:18

Super :D :) :o :lol: :P :wink: und Danke
Florian

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 19. Nov 2004, 12:20

weiters

Code: Alles auswählen

$catIds = conDeeperCategoriesArray($catStart);
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.

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;
}
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

Code: Alles auswählen

global $db, $client, $cfg;
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 !
Zuletzt geändert von emergence am Do 14. Apr 2005, 09:41, insgesamt 1-mal geändert.
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 19. Nov 2004, 12:34

gehen wir weiter:

Code: Alles auswählen

   echo '<table cellpadding="0" cellspacing="0" border="0"><tr>'; 
   echo '<td><img src="images/wuerfel.gif"></td>'; 
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..

Code: Alles auswählen

$string = "hello world - \"my world\"\n";
echo $string;
ergebniss:

Code: Alles auswählen

hello world - "my world"[+ line break]

Code: Alles auswählen

$string = 'hello world - "my world"\n';
echo $string;
ergebniss:

Code: Alles auswählen

hello world - "my world"\n
sogenannte steuerzeichen funktionieren nur innerhalb von " "

jedoch das funkt:

Code: Alles auswählen

$string = 'hello world - "my world"'."\n";
echo $string;
ergebniss:

Code: Alles auswählen

hello world - "my world"[+ line break]
auch nicht unintressant:

Code: Alles auswählen

$string = 'hello world - "my world"'."\n";
echo "this -> $string";
ergebniss:

Code: Alles auswählen

this -> hello world - "my world"[+ line break]
hingegen:

Code: Alles auswählen

$string = 'hello world - "my world"'."\n";
echo 'this -> $string';
ergebniss:

Code: Alles auswählen

this -> $string
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 19. Nov 2004, 12:47

weiters

Code: Alles auswählen

if (is_array($catIds)) {
...
}
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):

Code: Alles auswählen

$a = 1;
$b = 1;
if ($a == $b) 
    echo "ident !";
echo "echt wahr";
echo "end of line";
ergebniss:

Code: Alles auswählen

ident !echt wahrend of line
sollte $b nun 2 sein wird nur
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";
wird nur

Code: Alles auswählen

end of line
ausgegeben...

zu den netten = == === zeichen
-> http://at.php.net/manual/de/language.operators.php
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 19. Nov 2004, 12:52

foreach
die erklärung dazu ist wirklich sehr detailiert...
-> http://at.php.net/manual/de/control-str ... oreach.php
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 19. Nov 2004, 13:26

okay gehen wir weiter
kommen wir zu der db klasse

das einfach zu erklären :shock:

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;
}
-> 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

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);
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...

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' 
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

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);
schreiben...

aber bleiben wir mal beim ersten teil des queries...

Code: Alles auswählen

            $sql = "SELECT 
                       A.idcat AS idcat, 
                       name 
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

Code: Alles auswählen

$db->query($sql);
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...
Zuletzt geändert von emergence am Fr 19. Nov 2004, 14:52, insgesamt 1-mal geändert.
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 19. Nov 2004, 13:36

okay zum letzten teil:

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 
so richtig schön übersichtlich geschrieben ;-)

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 
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

Code: Alles auswählen

SELECT A.idcat as idcat, name ...
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...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 19. Nov 2004, 13:42

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

Code: Alles auswählen

echo "test".'was auch immer "jaja "."end";
korrekt wäre ja

Code: Alles auswählen

echo "test".'was auch immer "jaja "'."end";
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...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 19. Nov 2004, 14:22

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/

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"); ?>
was möchte ich damit erreichen bzw. was mache ich genau... ?
*** make your own tools (wishlist :: thx)

tinof
Beiträge: 197
Registriert: Mi 24. Jan 2007, 20:38
Wohnort: Kirchberg / Sa.
Kontaktdaten:

Beitrag von tinof » Di 13. Mär 2007, 16:30

Ok, ist zwar schon über 2 Jahr 'alt', aber ich will zeigen, das ich mich bemühe :

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"); ?> 
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 :oops: )

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 14. Mär 2007, 08:01

@tinof
100 punkte ;-)
*** make your own tools (wishlist :: thx)

Gesperrt