PHP-Code:
<?php
$GLOBALS['TL_DCA']['tl_calendar_tickets'] = array
(
// Config
'config' => array
(
'dataContainer' => 'Table',
'ptable' => 'tl_calendar_events',
'sql' => array
(
'keys' => array
(
'id' => 'primary',
'pid' => 'index',
'member' => 'index'
)
)
),
// List
'list' => array
(
'sorting' => array
(
'mode' => 4,
'disableGrouping' => true,
'headerFields' => array('title', 'startDate', 'availableSeats'),
'header_callback' => array('tl_calendar_tickets', (Input::get('type') == "member") ? 'header_callback_member' : 'header_callback'),
'panelLayout' => 'filter;sort,search,limit',
'filter' => (Input::get('type') == "member") ? array(array('member=? OR id IS NULL',Input::get('id'))) : null,
'child_record_callback' => array('tl_calendar_tickets', (Input::get('type') == "member") ? 'child_record_callback_member' : 'child_record_callback')
),
'global_operations' => array
(
'all' => array
(
'label' => &$GLOBALS['TL_LANG']['MSC']['all'],
'href' => 'act=select',
'class' => 'header_edit_all',
'attributes' => 'onclick="Backend.getScrollOffset()" accesskey="e"'
)
),
'operations' => array
(
'edit' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_calendar_events']['edit'],
'href' => 'act=edit',
'icon' => 'edit.gif'
),
'delete' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_calendar_events']['delete'],
'href' => 'act=delete',
'icon' => 'delete.gif',
'attributes' => 'onclick="if(!confirm(\'' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\'))return false;Backend.getScrollOffset()"'
),
'pdf' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_calendar_events']['pdf'],
'href' => 'key=pdf',
'icon' => '/system/modules/tickettool/assets/pdf.png'
),
)
),
// Palettes
'palettes' => array
(
'default' => '{tickets_legend},pid,member,amount'
),
// Fields
'fields' => array
(
'id' => array
(
'sql' => "int(10) unsigned NOT NULL auto_increment"
),
'pid' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_calendar_tickets']['pid'],
'foreignKey' => 'tl_calendar_events.id',
'options_callback' => array('tl_calendar_tickets','pid_options_callback'),
'inputType' => 'select',
'sql' => "int(10) unsigned NOT NULL default '0'",
'eval' => array('mandatory'=>true,'chosen'=>true,'includeBlankOption'=>true,'tl_class'=>'w50'),
'relation' => array('type'=>'belongsTo', 'load'=>'eager')
),
'tstamp' => array
(
'sql' => "int(10) unsigned NOT NULL default '0'"
),
'member' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_calendar_tickets']['member'],
'options_callback' => array('tl_calendar_tickets','member_options_callback'),
'inputType' => 'select',
'eval' => array('mandatory'=>true,'chosen'=>true,'includeBlankOption'=>true,'tl_class'=>'w50'),
'sql' => "int(10) unsigned NOT NULL"
),
'amount' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_calendar_tickets']['amount'],
'inputType' => 'text',
'eval' => array('mandatory'=>true,'rgxp'=>'natural','tl_class'=>'w50'),
'sql' => "int(4) unsigned NULL"
)
)
);
class tl_calendar_tickets extends Backend {
public function header_callback($headerArr,$headerObj)
{
$pid = $this->Input->get('id');
$guests = $this->Database->prepare("SELECT SUM(amount) AS g FROM tl_calendar_tickets WHERE pid=?")->execute($pid)->g;
$headerArr["Gäste"] = $guests ? number_format($guests,0,",",".") : "0";
return $headerArr;
}
public function header_callback_member($headerArr,$headerObj)
{
$member = MemberModel::findById($this->Input->get('id'));
$headerArr = Array(
"Name" => $member->firstname . " " . $member->lastname,
"Adresse" => $member->street . ", " . $member->postal . " " . $member->city
);
if ( $member->email ) { $headerArr["E-Mail"] = '<a href="mailto:'.$member->email.'">'.$member->email.'</a>'; }
if ( $member->phone ) { $headerArr["Telefon"] = $member->phone; }
$headerArr["Vorstellungen"] = 0;
$headerArr["Tickets"] = 0;
$tickets = CalendarTicketsModel::findByMember($member->id);
while ( $tickets && $tickets->next() ) {
$headerArr["Vorstellungen"] += 1;
$headerArr["Tickets"] += (int)$tickets->amount;
}
return $headerArr;
}
public function child_record_callback($arrRow)
{
$member = MemberModel::findById($arrRow['member']);
return sprintf(
"%s %s <span style=\"color:#b3b3b3;padding-left:3px\">[%s Ticket%s]</span>",
$member->firstname,
$member->lastname,
$arrRow['amount'],
($arrRow['amount']==="1")?'':'s'
);
}
public function child_record_callback_member($arrRow)
{
$event = CalendarEventsModel::findById($arrRow['pid']);
$calendar = CalendarModel::findById($event->pid);
return sprintf(
"%s: %s <span style=\"color:#b3b3b3;padding-left:3px\">[%s Ticket%s]</span>",
date("d.m.Y",$event->startTime),
$calendar->title,
$arrRow['amount'],
($arrRow['amount']==="1")?'':'s'
);
}
public function pid_options_callback()
{
$options = Array();
$events = CalendarEventsModel::findAll(['order'=>'startTime DESC']);
while ( $events && $events->next() ) {
$options[$events->id] = sprintf('%s: %s',date('d.m.Y',$events->startTime), $events->title);
}
return $options;
}
public function member_options_callback()
{
$options = Array();
$members = MemberModel::findAll(['order'=>'lastName']);
while ( $members && $members->next() ) {
$options[$members->id] = sprintf('%s %s',$members->firstname, $members->lastname);
}
return $options;
}
}
'header_callback', 'child_record_callback' und 'filter' werden nun unterschiedlich gesetzt, je nachdem ob der GET-Parameter 'type=member' gesetzt wurde. In diesem Fall gehört die übermittelte ID zum Mitglied und nicht zum Event.
PHP-Code:
public function replaceBacklink($strBuffer)
{
return $this->TicketsByMember() ? preg_replace_callback('/<[^>]*class="header_back"[^>]*>/',array('Tickettool','replaceBacklinkHref'),$strBuffer) : $strBuffer;
}
private function replaceBacklinkHref($match)
{
$url = '/contao/main.php?do=member&rt='.REQUEST_TOKEN;
return preg_replace('/ href="[^"]*/',' href="'.$url,$match[0]);
}
public function replaceEditlink($strBuffer)
{
return $this->TicketsByMember() ? preg_replace_callback('/<[^>]*class="tl_header[^"]*"[^>]*>[^>]*<[^>]*class="tl_content_right"[^>]*>[^>]*<[^>]*class="edit"[^>]*>/',array('Tickettool','replaceEditlinkHref'),$strBuffer) : $strBuffer;
}
private function replaceEditlinkHref($match)
{
$url = '/contao/main.php?do=member&act=edit&id='.CURRENT_ID.'&rt='.REQUEST_TOKEN;
return preg_replace('/ href="[^"]*/',' href="'.$url,$match[0]);
}
Leider habe ich es noch nicht geschafft, dass kein Event vorausgewählt ist, wenn man in der Mitgliederübersicht auf "Neue Tickets" klickt. Hier wäre es natürlich sinnvoll, wenn das entsprechende Mitglied vorausgewählt ist und kein Event. Hier müsste aber vermutlich noch einiges umgebaut werden, da unter Mode 4 ja immer eine entsprechende pid vorhanden sein muss und das fest verdrahtet ist. Man kann es über 'default' im DCA also nicht überschreiben.
Lesezeichen