Location: PHPKode > scripts > Admidio > admidio-2.2.9/adm_program/system/classes/table_date.php
<?php
/******************************************************************************
 * Klasse fuer den Zugriff auf die Datenbanktabelle adm_dates
 *
 * 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 Terminobjekt zu erstellen. 
 * Ein Termin kann ueber diese Klasse in der Datenbank verwaltet werden
 *
 * Neben den Methoden der Elternklasse TableAccess, stehen noch zusaetzlich
 * folgende Methoden zur Verfuegung:
 *
 * getDescription($type = 'HTML') - liefert die Beschreibung je nach Type zurueck
 *                 type = 'PLAIN'  : reiner Text ohne Html oder BBCode
 *                 type = 'HTML'   : BB-Code in HTML umgewandelt
 *                 type = 'BBCODE' : Beschreibung mit BBCode-Tags
 * getIcal($domain)  - gibt String mit dem Termin im iCal-Format zurueck
 * editRight()       - prueft, ob der Termin von der aktuellen Orga bearbeitet werden darf
 *
 *****************************************************************************/

require_once(SERVER_PATH. '/adm_program/system/classes/table_access.php');
require_once(SERVER_PATH. '/adm_program/system/classes/ubb_parser.php');

class TableDate extends TableAccess
{
    protected $max_members_role = array();
    protected $bbCode;
    protected $visibleRoles = array();
    protected $changeVisibleRoles;
    
    // Konstruktor
    public function __construct(&$db, $dat_id = 0)
    {
        parent::__construct($db, TBL_DATES, 'dat', $dat_id);
    }

    public function clear()
    {
        parent::clear();

        $this->visibleRoles = array();
        $this->changeVisibleRoles = false;
    }
        
    // Methode, die den Termin in der DB loescht
    public function delete()
    {
		$this->db->startTransaction();

        $sql = 'DELETE FROM '.TBL_DATE_ROLE.' WHERE dtr_dat_id = '.$this->getValue('dat_id');
        $result = $this->db->query($sql);

        parent::delete();

        // haben diesem Termin Mitglieder zugesagt, so muessen diese Zusagen noch geloescht werden
        if($this->getValue('dat_rol_id') > 0)
        {
            $sql = 'DELETE FROM '.TBL_MEMBERS.' WHERE mem_rol_id = '.$this->getValue('dat_rol_id');
            $this->db->query($sql);
            
            $sql = 'DELETE FROM '.TBL_ROLES.' WHERE rol_id = '.$this->getValue('dat_rol_id');
            $this->db->query($sql);
        }

		$this->db->endTransaction();
	}    
    
    // prueft, ob der Termin von der aktuellen Orga bearbeitet werden darf
    public function editRight()
    {
        global $g_current_organization;
        
        // Termine der eigenen Orga darf bearbeitet werden
        if($this->getValue('cat_org_id') == $g_current_organization->getValue('org_id'))
        {
            return true;
        }
        // Termine von Kinder-Orgas darf bearbeitet werden, wenn diese als global definiert wurden
        elseif($this->getValue('dat_global') == true
        && $g_current_organization->isChildOrganization($this->getValue('cat_org_id')))
        {
            return true;
        }
    
        return false;
    }

    // liefert die Beschreibung je nach Type zurueck
    // type = 'PLAIN'  : reiner Text ohne Html oder BBCode
    // type = 'HTML'   : BB-Code in HTML umgewandelt
    // type = 'BBCODE' : Beschreibung mit BBCode-Tags
    public function getDescription($type = 'HTML')
    {
        global $g_preferences;
        $description = '';

        // wenn BBCode aktiviert ist, die Beschreibung noch parsen, ansonsten direkt ausgeben
        if($g_preferences['enable_bbcode'] == 1 && $type != 'BBCODE')
        {
            if(is_object($this->bbCode) == false)
            {
                $this->bbCode = new ubbParser();
            }

            $description = $this->bbCode->parse($this->getValue('dat_description'));

            if($type == 'PLAIN')
            {
                $description = strStripTags($description);
            }
        }
        else
        {
            $description = nl2br($this->getValue('dat_description'));
        }
        return $description;
    }

    // gibt einen Termin im iCal-Format zurueck
    public function getIcal($domain)
    {
        $prodid = '-//www.admidio.org//Admidio' . ADMIDIO_VERSION . '//DE';
        $uid = $this->getValue('dat_timestamp_create', 'ymdThis') . '+' . $this->getValue('dat_usr_id_create') . '@' . $domain;
        
        $ical = "BEGIN:VCALENDAR\n".
                "METHOD:PUBLISH\n".
                "PRODID:". $prodid. "\n".
                "VERSION:2.0\n".
                "BEGIN:VEVENT\n".
                "UID:". $uid. "\n".
                "SUMMARY:". $this->getValue('dat_headline'). "\n".
                "DESCRIPTION:". str_replace("\r\n", '\n', $this->getDescription('PLAIN')). "\n".
                "DTSTAMP:". $this->getValue('dat_timestamp_create', 'Ymd')."T".$this->getValue('dat_timestamp_create', 'His')."\n".
                "LOCATION:". $this->getValue('dat_location'). "\n";
        if($this->getValue('dat_all_day') == 1)
        {
            // das Ende-Datum bei mehrtaegigen Terminen muss im iCal auch + 1 Tag sein
            // Outlook und Co. zeigen es erst dann korrekt an
            $ical .= "DTSTART;VALUE=DATE:". $this->getValue('dat_begin', 'ymd'). "\n".
                     "DTEND;VALUE=DATE:". $this->getValue('dat_end', 'ymd'). "\n";
        }
        else
        {
            $ical .= "DTSTART:". $this->getValue('dat_begin', 'Ymd')."T".$this->getValue('dat_begin', 'His')."\n".
                     "DTEND:". $this->getValue('dat_end', 'Ymd')."T".$this->getValue('dat_end', 'His')."\n";
        }
        $ical .= "END:VEVENT\n".
                 "END:VCALENDAR";

        return $ical;
    }
    
    // gibt die Anzahl der maximalen Teilnehmer einer Rolle zurueck
    public function getMaxMembers($rol_id)
    {
        if(array_key_exists($rol_id, $this->max_members_role))
        {
            return $this->max_members_role[$rol_id];
        }
        else
        {
            return '';
        }
    }

    public function getValue($field_name, $format = '')
    {
        if($field_name == 'dat_end' && $this->dbColumns['dat_all_day'] == 1)
        {
            // bei ganztaegigen Terminen wird das Enddatum immer 1 Tag zurueckgesetzt
            list($year, $month, $day, $hour, $minute, $second) = preg_split('/[- :]/', $this->dbColumns['dat_end']);
            $value = date($format, mktime($hour, $minute, $second, $month, $day, $year) - 86400);
        }
        else
        {
            $value = parent::getValue($field_name, $format);
        }

        if($field_name == 'dat_country' && strlen($value) > 0)
        {
            // beim Land die sprachabhaengige Bezeichnung auslesen
            global $g_l10n;
            $value = $g_l10n->getCountryByCode($value);
        }

        return $value;
    }

    // die Methode gibt ein Array  mit den fuer den Termin sichtbaren Rollen-IDs zurueck
    public function getVisibleRoles()
    {
        if(count($this->visibleRoles) == 0)
        {
            // alle Rollen-IDs einlesen, die diesen Termin sehen duerfen
            $this->visibleRoles = array();
            $sql = 'SELECT dtr_rol_id FROM '.TBL_DATE_ROLE.' WHERE dtr_dat_id = '.$this->getValue('dat_id');
            $this->db->query($sql);

            while($row = $this->db->fetch_array())
            {
                if($row['dtr_rol_id'] == null)
                {
                    $this->visibleRoles[] = -1;
                }
                else
                {
                    $this->visibleRoles[] = $row['dtr_rol_id'];
                }
            }
        }
        return $this->visibleRoles;
    }

    // Benutzerdefiniertes Feld mit der uebergebenen ID aus der Datenbank auslesen
    public function readData($dat_id, $sql_where_condition = '', $sql_additional_tables = '')
    {
        if(is_numeric($dat_id))
        {
            $sql_additional_tables .= TBL_CATEGORIES;
            $sql_where_condition   .= '    dat_cat_id = cat_id
                                       AND dat_id     = '.$dat_id;
            return parent::readData($dat_id, $sql_where_condition, $sql_additional_tables);
        }
        return false;
    }

    public function save($updateFingerPrint = true)
    {
        parent::save($updateFingerPrint);

        if($this->changeVisibleRoles == true)
        {
            // Sichbarkeit der Rollen wegschreiben
            if($this->new_record == false)
            {
                // erst einmal alle bisherigen Rollenzuordnungen loeschen, damit alles neu aufgebaut werden kann
                $sql='DELETE FROM '.TBL_DATE_ROLE.' WHERE dtr_dat_id = '.$this->getValue('dat_id');
                $this->db->query($sql);
            }

            // nun alle Rollenzuordnungen wegschreiben
            $date_role = new TableAccess($this->db, TBL_DATE_ROLE, 'dtr');

            foreach($this->visibleRoles as $key => $roleID)
            {
                if($roleID != 0)
                {
                    if($roleID > 0)
                    {
                        $date_role->setValue('dtr_rol_id', $roleID);
                    }
                    $date_role->setValue('dtr_dat_id', $this->getValue('dat_id'));
                    $date_role->save();
                    $date_role->clear();
                }
            }
        }

        $this->changeVisibleRoles = false;
    }

    // prueft die Gueltigkeit der uebergebenen Werte und nimmt ggf. Anpassungen vor
    public function setValue($field_name, $field_value)
    {
        if($field_name == 'dat_end' && $this->getValue('dat_all_day') == 1)
        {
            // hier muss bei ganztaegigen Terminen das bis-Datum um einen Tag hochgesetzt werden
            // damit der Termin bei SQL-Abfragen richtig beruecksichtigt wird
            list($year, $month, $day, $hour, $minute, $second) = preg_split('/[- :]/', $field_value);
            $field_value = date('Y-m-d H:i:s', mktime($hour, $minute, $second, $month, $day, $year) + 86400);
        }
        return parent::setValue($field_name, $field_value);
    }

    // die Methode erwartet ein Array mit den fuer den Termin sichtbaren Rollen-IDs
    public function setVisibleRoles($arrVisibleRoles)
    {
        if(count(array_diff($arrVisibleRoles, $this->visibleRoles)) > 0)
        {
            $this->changeVisibleRoles = true;
        }
        $this->visibleRoles = $arrVisibleRoles;
    }
}
?>
Return current item: Admidio