Location: PHPKode > scripts > Admidio > admidio-2.2.9/adm_program/system/classes/table_photos.php
<?php
/******************************************************************************
 * Klasse fuer den Zugriff auf die Datenbanktabelle adm_photos
 *
 * Copyright    : (c) 2004 - 2011 The Admidio Team
 * Homepage     : http://www.admidio.org
 * License      : GNU Public License 2 http://www.gnu.org/licenses/gpl-2.0.html
 *
 * Diese Klasse dient dazu ein Fotoveranstaltungsobjekt zu erstellen.
 * Eine Fotoveranstaltung kann ueber diese Klasse in der Datenbank verwaltet werden.
 *
 * Neben den Methoden der Elternklasse TableAccess, stehen noch zusaetzlich
 * folgende Methoden zur Verfuegung:
 *
 * countImages($pho_id = 0)    - Rekursive Funktion gibt die Anzahl aller Bilder 
 *                               inkl. der Unteralben zurueck
 * shuffleImage($pho_id = 0)   - Rekursive Funktion zum Auswaehlen eines 
 *                               Beispielbildes aus einem moeglichst hohen Album
 * createFolder()      - erzeugt den entsprechenden Ordner unter adm_my_files/photos
 * deleteInDatabase($photo_id) - Rekursive Funktion die die uebergebene Veranstaltung
 *                               und alle Unterveranstaltungen loescht
 * deleteInFilesystem($folder) - Rekursive Funktion die alles innerhalb des uebergebenen
 *                               Ordners mit Unterordnern und allen Dateien loescht
 *
 *****************************************************************************/

$absolute_path = substr(__FILE__, 0, strpos(__FILE__, 'adm_program')-1);
require_once($absolute_path.'/adm_program/system/classes/table_access.php');
require_once($absolute_path. '/adm_program/system/classes/my_files.php');

class TablePhotos extends TableAccess
{
    public function __construct(&$db, $photo_id = 0)
    {
        parent::__construct($db, TBL_PHOTOS, 'pho', $photo_id);
    }

    // Rekursive Funktion gibt die Anzahl aller Bilder inkl. der Unteralben zurueck
    // pho_id noetig fuer rekursiven Aufruf
    public function countImages($pho_id = 0)
    {
        $total_images = 0;

        // wurde keine ID uebergeben, dann Anzahl Bilder des aktuellen Albums ermitteln
        if($pho_id == 0)
        {
            $pho_id = $this->getValue('pho_id');
            $total_images = $this->getValue('pho_quantity');
        }

        // alle Unteralben ermitteln
        $sql = 'SELECT pho_id, pho_quantity
                  FROM '. TBL_PHOTOS. '
                 WHERE pho_pho_id_parent = '.$pho_id.'
                   AND pho_locked = 0';
        $pho_result = $this->db->query($sql);

        while($pho_row = $this->db->fetch_array($pho_result))
        {
            $total_images = $total_images + $pho_row['pho_quantity'] + $this->countImages($pho_row['pho_id']);
        }

        return $total_images;
    }

    // Legt den Ordner fuer die Veranstaltung im Dateisystem an
    public function createFolder()
    {
        $error = array('code' => '0', 'text' => '');

        // Pfad in adm_my_files pruefen und ggf. anlegen
        $myFilesPhotos = new MyFiles('PHOTOS');
        if($myFilesPhotos->checkSettings() == false)
        {
            $error['text'] = $myFilesPhotos->errorText;
            $error['path'] = $myFilesPhotos->errorPath;
            return $error;
        }
        
        // nun den Ordner fuer die Veranstaltung anlegen
        $folderName = $this->getValue('pho_begin', 'Y-m-d'). '_'. $this->getValue('pho_id');
        if($myFilesPhotos->createFolder($folderName, true) == false)
        {
            $error['text'] = 'SYS_FOLDER_NOT_CREATED';
            $error['path'] = 'adm_my_files/photos/'.$folderName;
        }
        return $error;
    }

    // interne Funktion, die die Fotoveranstaltung in Datenbank und File-System loeschen
    // die Funktion wird innerhalb von delete() aufgerufen
    public function delete()
    {
        if($this->deleteInDatabase($this->getValue('pho_id')))
        {
            return parent::delete();
        }
        return false;
    }    

    // Rekursive Funktion die die uebergebene Veranstaltung und alle
    // Unterveranstaltungen loescht
    public function deleteInDatabase($photo_id)
    {
        $return_code = true;
    
        // erst einmal rekursiv zur tiefsten Tochterveranstaltung gehen
        $sql     = 'SELECT pho_id FROM '. TBL_PHOTOS. '
                     WHERE pho_pho_id_parent = '.$photo_id;
        $result1 = $this->db->query($sql);
        
        while($row = $this->db->fetch_array($result1))
        {
            if($return_code)
            {
                $return_code = $this->deleteInDatabase($row['pho_id']);
            }
        }

        // nun DB-Eintrag und Ordner loeschen
        if($return_code)
        {
            //Ordnerpfad zusammensetzen
            $folder = SERVER_PATH. '/adm_my_files/photos/'.$this->getValue('pho_begin', 'Y-m-d').'_'.$photo_id;
            
            // aktuellen Ordner incl. Unterordner und Dateien loeschen, falls er existiert
            if(file_exists($folder))
            {
                // nun erst rekursiv den Ordner im Dateisystem loeschen
                $myFilesPhotos = new MyFiles('PHOTOS');
                $myFilesPhotos->setFolder($folder);
                $return_code = $myFilesPhotos->delete($folder);
            }

            if($return_code)
            {
                // Veranstaltung jetzt in DB loeschen            
                $sql = 'DELETE FROM '. TBL_PHOTOS. '
                         WHERE pho_id = '.$photo_id;
                $this->db->query($sql);
            }
        }
        
        return $return_code;
    }
    
    // interne Funktion, die Defaultdaten fur Insert und Update vorbelegt
    // die Funktion wird innerhalb von save() aufgerufen
    public function save($updateFingerPrint = true)
    {
        global $g_current_organization;
        
        if($this->new_record)
        {
            $this->setValue('pho_org_shortname', $g_current_organization->getValue('org_shortname'));
        }

        parent::save($updateFingerPrint);
    }

    // Rekursive Funktion zum Auswaehlen eines Beispielbildes aus einem moeglichst hohen Album
    // Rueckgabe eines Arrays mit allen noetigen Infos um den Link zu erstellen
    public function shuffleImage($pho_id = 0)
    {
        $shuffle_image = array('shuffle_pho_id' => 0, 'shuffle_img_nr' => 0, 'shuffle_img_begin' => '');

        // wurde keine ID uebergeben, dann versuchen das Zufallsbild aus dem aktuellen Album zu nehmen
        if($pho_id == 0)
        {
            $pho_id = $this->getValue('pho_id');
            $shuffle_image['shuffle_pho_id']    = $this->getValue('pho_id');
            $shuffle_image['shuffle_img_begin'] = $this->getValue('pho_begin', 'Y-m-d');

            if($this->getValue('pho_quantity') > 0)
            {
                $shuffle_image['shuffle_img_nr'] = mt_rand(1, $this->getValue('pho_quantity'));
            }
        }
        
        if($shuffle_image['shuffle_img_nr'] == 0)
        {   
            // kein Bild vorhanden, dann in einem Unteralbum suchen
            $sql = 'SELECT *
                      FROM '. TBL_PHOTOS. '
                     WHERE pho_pho_id_parent = '.$pho_id.'
                       AND pho_locked = 0
                     ORDER BY pho_quantity DESC';
            $result_child = $this->db->query($sql);
            
            while($pho_row = $this->db->fetch_array($result_child))
            {
                if($shuffle_image['shuffle_img_nr'] == 0)
                {
                    $shuffle_image['shuffle_pho_id'] = $pho_row['pho_id'];
                    $shuffle_image['shuffle_img_begin'] = $pho_row['pho_begin'];

                    if($pho_row['pho_quantity'] > 0)
                    {
                        $shuffle_image['shuffle_img_nr'] = mt_rand(1, $pho_row['pho_quantity']);
                    }
                    else
                    {
                        $shuffle_image = $this->shuffleImage($pho_row['pho_id']);
                    }
                }
            }
        }
        return $shuffle_image;
    }
}
?>
Return current item: Admidio