Seite 1 von 2

Frage zu Calendar Mod von alightner

Verfasst: 23.03.2014 02:12
von mario d.
Hallo liebe Forengemeinde,

derzeit bin ich an etwas am basteln, bei dem mir hier eventuell jemand helfen kann. Ich habe die Calendar Mod 0.1.1 von alightner verbaut und möchte das in der Mod mitgelieferte ucp-Modul "UCP_MAIN_CALENDAR_MYEVENTS" verändern. Bisher ist es so, dass man dort im persönlichen Bereich alle Termine angezeigt bekommt, die man selbst angelegt hat.

Ich möchte jedoch erreichen, dass Benutzer alle angelegten Termine angezeigt bekommen (egal, ob selbst angelegt oder nicht), sofern diese Termine einer Gruppe zugeordnet sind, deren Mitglieder die Benutzer sind. Andernfalls sollen bestehende Termine in der Liste nicht aufgeführt werden.

Es mag komisch klingen. Diese Änderung macht in meinem Fall jedoch großen Sinn. Die kleinen Sprach- und Template-Änderungen stellen kein Problem für mich dar. Nur die Änderungen in der

Code: Alles auswählen

functions_calendar.php
bereiten mir als sporadischem Laienbastler, der zudem schon seit Jahren nicht mehr aktiv war, enorme Probleme.

Den Teil, auf den es meiner Meinung nach im weiteren Sinne ankommt, stelle ich nachfolgend ein:

Code: Alles auswählen

/* used to generate the UCP "manage my events" module */
function display_posters_next_events_for_x_days( $x, $user_id )
{
	global $auth, $db, $user, $config, $template, $date, $available_etype_colors, $available_etype_images, $available_etype_display_names, $month_sel_code, $day_sel_code, $year_sel_code, $mode_sel_code;

	global $phpEx, $phpbb_root_path;

	$etype_url_opts = get_etype_url_opts();

	// Is the user able to view ANY events?
	$user_can_view_events = false;
	if ( $auth->acl_get('u_calendar_view_events') )
	{

		init_calendar_data();
		$subject_limit = get_calendar_config_value("display_truncated_name", 0);
		$group_options = get_sql_group_options($user->data['user_id']);
		$etype_options = get_etype_filter();

		$start_temp_date = time();
		//$end_temp_date = $start_temp_date + 31536000;
		$end_temp_date = $start_temp_date + ( $x * 86400 );
		// find all day events that are still taking place
		$sort_timestamp_cutoff = $start_temp_date - 86400+1;

		$disp_date_format = get_calendar_config_value("date_format", 'M d, Y');
		$disp_date_time_format = get_calendar_config_value("date_time_format", 'M d, Y h:i a');

		// don't list events that are more than 1 year in the future
		$sql = 'SELECT * FROM ' . CALENDAR_EVENTS_TABLE . '
				WHERE poster_id = '.$user_id.' AND( (event_access_level = 2) OR
					(poster_id = '.$db->sql_escape($user->data['user_id']).' ) OR
					(event_access_level = 1 AND ('.$group_options.') ) ) '.$etype_options.' AND
				((( event_start_time >= '.$db->sql_escape($start_temp_date).' AND event_start_time <= '.$db->sql_escape($end_temp_date).' ) OR
				 ( event_end_time > '.$db->sql_escape($start_temp_date).' AND event_end_time <= '.$db->sql_escape($end_temp_date).' ) OR
				 ( event_start_time < '.$db->sql_escape($start_temp_date).' AND event_end_time > '.$db->sql_escape($end_temp_date)." )) OR (sort_timestamp > ".$db->sql_escape($sort_timestamp_cutoff)." AND sort_timestamp <= ".$db->sql_escape($end_temp_date)." AND event_all_day = 1) ) ORDER BY sort_timestamp ASC";
		$result = $db->sql_query($sql);
		while ($row = $db->sql_fetchrow($result))
		{
			$events['EVENT_URL'] = append_sid("{$phpbb_root_path}calendar.$phpEx", "view=event&calEid=".$row['event_id'].$etype_url_opts);
			$events['IMAGE'] = $available_etype_images[$row['etype_id']];
			$events['COLOR'] = $available_etype_colors[$row['etype_id']];
			$events['ETYPE_DISPLAY_NAME'] = $available_etype_display_names[$row['etype_id']];

			$events['FULL_SUBJECT'] = censor_text($row['event_subject']);
			$events['SUBJECT'] = $events['FULL_SUBJECT'];
			if( $subject_limit > 0 )
			{
				if(utf8_strlen($events['SUBJECT']) > $subject_limit)
				{
					$events['SUBJECT'] = truncate_string($events['SUBJECT'], $subject_limit) . '...';
				}
			}
			$events['IS_RECURRING'] = $row['recurr_id'];
			$events['RECURRING_TXT'] = get_recurring_event_string_via_id( $row['recurr_id'] );

			$poster_url = '';
			$invite_list = '';
			get_event_invite_list_and_poster_url($row, $poster_url, $invite_list );
			$events['POSTER'] = $poster_url;
			$events['INVITED'] = $invite_list;
			$events['ALL_DAY'] = 0;
			if( $row['event_all_day'] == 1 )
			{
				list($eday['eday_day'], $eday['eday_month'], $eday['eday_year']) = explode('-', $row['event_day']);
				$row['event_start_time'] = gmmktime(0,0,0,$eday['eday_month'], $eday['eday_day'], $eday['eday_year'])- $user->timezone - $user->dst;
				$row['event_end_time'] = $row['event_start_time']+86399;
				$events['ALL_DAY'] = 1;
				$events['START_TIME'] = $user->format_date($row['event_start_time'], $disp_date_format, true);
				$events['END_TIME'] = $user->format_date($row['event_end_time'], $disp_date_format, true);
			}
			else
			{
				$events['START_TIME'] = $user->format_date($row['event_start_time'], $disp_date_time_format, true);
				$events['END_TIME'] = $user->format_date($row['event_end_time'], $disp_date_time_format, true);
			}
			//$events['START_TIME'] = $user->format_date($row['event_start_time']);
			//$events['END_TIME'] = $user->format_date($row['event_end_time']);



			$edit_url = "";
			$edit_all_url = "";
			if( $user->data['is_registered'] && $auth->acl_get('u_calendar_edit_events') &&
				(($user->data['user_id'] == $row['poster_id'])|| $auth->acl_get('m_calendar_edit_other_users_events') ))
			{
				$edit_url = append_sid("{$phpbb_root_path}calendarpost.$phpEx", "mode=edit&calEid=".$row['event_id']."&calD=".$date['day']."&calM=".$date['month_no']."&calY=".$date['year']);
				if( $row['recurr_id'] > 0 )
				{
					$edit_all_url = append_sid("{$phpbb_root_path}calendarpost.$phpEx", "mode=edit&calEditAll=1&calEid=".$row['event_id']."&calD=".$date['day']."&calM=".$date['month_no']."&calY=".$date['year']);
				}
			}
			$delete_url = "";
			$delete_all_url = "";
			if( $user->data['is_registered'] && $auth->acl_get('u_calendar_delete_events') &&
				(($user->data['user_id'] == $row['poster_id'])|| $auth->acl_get('m_calendar_delete_other_users_events') ))

			{
				$delete_url = append_sid("{$phpbb_root_path}calendarpost.$phpEx", "mode=delete&calEid=".$row['event_id']."&calD=".$date['day']."&calM=".$date['month_no']."&calY=".$date['year'].$etype_url_opts);
				if( $row['recurr_id'] > 0 )
				{
					$delete_all_url = append_sid("{$phpbb_root_path}calendarpost.$phpEx", "mode=delete&calDelAll=1&calEid=".$row['event_id']."&calD=".$date['day']."&calM=".$date['month_no']."&calY=".$date['year'].$etype_url_opts);
				}
			}
			$events['U_EDIT'] = $edit_url;
			$events['U_EDIT_ALL'] = $edit_all_url;
			$events['U_DELETE'] = $delete_url;
			$events['U_DELETE_ALL'] = $delete_all_url;


			$template->assign_block_vars('myevents', $events);
		}
		$db->sql_freeresult($result);
	}
}
Ich wäre sehr dankbar, so mir denn jemand helfen könnte.

Beste Grüße

Re: Frage zu Calendar Mod von alightner

Verfasst: 23.03.2014 13:20
von Miriam
Ich möchte jedoch erreichen, dass Benutzer alle angelegten Termine angezeigt bekommen (egal, ob selbst angelegt oder nicht), sofern diese Termine einer Gruppe zugeordnet sind, deren Mitglieder die Benutzer sind.
Diese Funktion ist prinzipiell schon da, denn beim Anlegen eines Termins gibt es auch folgende Optionen, die jeweils eingestellt werden sollten:
  • Wer darf diesen Termin sehen?
  • Welche Gruppe darf diesen Termin sehen?
Es ist also (scheinbar) mehr oder minder eine Frage der "Disziplin", Termine und die Berechtigungen diese zu sehen, gleich beim Erstellen einzupflegen.

Re: Frage zu Calendar Mod von alightner

Verfasst: 23.03.2014 15:10
von HabNurNeFrage
Hi,

Folgendes könntest Du testweise mal in die functions_calendar einbauen.

Finden:

Code: Alles auswählen

// no matter what the author can always see their own events
    if( $user_id === $event_data['poster_id'] ) 
Ersetzen durch:

Code: Alles auswählen

// no matter what the author can always see their own events
    // XXX mit Group-ID ersetzen, die alle Events sehen koennen sollen 
    // mehrere Gruppen authorisieren? Fuer jede einmal hinzufuegen: || ( $user->data['group_id'] === XXX )
    if( $user->data['group_id'] === XXX ) 
XXX darin müsste dann noch durch die Group-ID ersetzt werden, die Du authorisieren willst. Näheres im Comment :wink:

Vielleicht führt das zum gewünschten Ergebnis, vielleicht nicht => ist ungetestet...

LG

Re: Frage zu Calendar Mod von alightner

Verfasst: 23.03.2014 16:10
von Miriam
Wenn die Vorgehensweise denn so sein soll, wäre hier die Feststellung der Gruppenmitgliedschaften ggf. unter zu Hilfenahme der Funktion group_memberships() sinnvoll.

Re: Frage zu Calendar Mod von alightner

Verfasst: 23.03.2014 18:16
von HabNurNeFrage
Hi,

dass User öfter auch Mitglied in mehreren Gruppen sind, ist mich doch glatt kurz entfallen :oops:

Dann würde das hier an selbiger Stelle eventuell den Zweck erfüllen:

Code: Alles auswählen

if (!function_exists('group_memberships'))
{
    include_once($phpbb_root_path . 'includes/functions_user.'.$phpEx);
}

// XX ist die Gruppen-ID, die Events sehen soll, Mods und Admins sehen alle Events, auch wenn sie nicht in der Kalender-Gruppe sind:
if (group_memberships(XX,$user->data['user_id'],true) || $auth->acl_get('a_') || $auth->acl_get('m_')) 
XX ist die ID der Kalender-Nutzergruppe und wenn Moderatoren eventuell ausgeschlossen sein sollen, entferne daraus || $auth->acl_get('m_').

LG

Re: Frage zu Calendar Mod von alightner

Verfasst: 23.03.2014 18:26
von Miriam
Eigentlich hatte ich das etwas anders vor meinem geistigen Auge :lol:
Wenn der Lesende auch in mindestens einer Gruppe ist, in der der Terminersteller ist, dann kann er, sie, es den Termin sehen. Die Abfrage der Admin- / Moderatorberechtigung ist natürlich noch ein Bonus.

Re: Frage zu Calendar Mod von alightner

Verfasst: 23.03.2014 18:58
von HabNurNeFrage
mario d. hat geschrieben:... sofern diese Termine einer Gruppe zugeordnet sind, deren Mitglieder die Benutzer sind. ...
Hi,

da fällt mir gerade auf, dass diese Vorgabe noch einfacher gehen müsste:

Code: Alles auswählen

if (!function_exists('group_memberships'))
{
    include_once($phpbb_root_path . 'includes/functions_user.'.$phpEx);
}

if (group_memberships($event_data['group_id'],$user->data['user_id'],true))
@Miriam: Was schwebte Dir denn vor?

LG

Re: Frage zu Calendar Mod von alightner

Verfasst: 23.03.2014 19:06
von Miriam
Am besten, wir warten mal auf eine Reaktion des TS.
Ohne es mir genau angeschaut zu haben, meine ich, daß diese Gruppenproblematik beim Erstellen eines Termins erschlagen werden kann.

Re: Frage zu Calendar Mod von alightner

Verfasst: 24.03.2014 09:29
von mario d.
Hallo zusammen!

Danke schon einmal für tatkräftigen Antworten.
Miriam hat geschrieben:Ohne es mir genau angeschaut zu haben, meine ich, daß diese Gruppenproblematik beim Erstellen eines Termins erschlagen werden kann.
Das bezweifle ich stark, da in der Übersicht "Meine Termine verwalten" nur die Termine angezeigt werden, die man persönlich erstellt hat. Dort sollen jedoch alle Termine angezeigt werden, gleich welcher Benutzer sie erstellt hat. Einschränkung soll lediglich sein, dass der jeweilige Benutzer Mitglied einer bestimmten Gruppe sein soll.

Beispiel:
Benutzer X ist jeweils Mitglied in den Gruppen A und B. Er ruft das Modul "Meine Termine verwalten" im UCP (welches dann selbstverständlich umbenannt sein wird)auf und bekommt alle Termine angezeigt, die eingetragen wurden, auch die, die er nicht persönlich angelegt hat. Es wird jedoch eine Filterung dahingehend vorgenommen, dass ihm nur die Termine angezeigt werden, die mindestens die Adressatenmarkierung "Gruppe B" beim Erstellen des Termins erhalten haben. Folglich bekommt X sämtliche Termine mit der Adressatenmarkierung "Gruppe B" angezeigt, nicht jedoch diese, die lediglich die Adressatenmarkierung der "Gruppe A" haben.

Momentan stehe ich ziemlich unter Druck, sodass ich nur kurz und knapp antworten und die hier dankenswerterweise zur Verfügung gestellten Codes erst am Mittwochabend testen kann. Ich werde dann umgehend berichten.

Beste Grüße
Mario

Re: Frage zu Calendar Mod von alightner

Verfasst: 26.03.2014 22:02
von mario d.
Hallo,

an dieser Stelle noch einmal vielen lieben Dank für die bisherigen Antworten. Ich habe die zur Verfügung gestellten Codes verbaut und getestet. Jedoch leider ohne Erfolg.

In der Kalenderansicht soll alles so bleiben, wie es ist. Aus diesem Grund hilft mir die vorhandene Gruppendiversikationsmöglichkeit beim Anlegen eines Termins nicht weiter. Ich will an dieser Stelle auf mein Beispiel in meinem vorherigen Post verweisen. Wenn die Darstellung im UCP-Modul "Meine Termine verwalten" nach Gruppenzugehörigkeit unterscheiden und gleichzeitig dort alle angelegten Termine anzeigen könnte, wäre ich sehr glücklich. Wichtig ist, dass beispielsweise Termine, die der Adressatengruppe A zugeordenet werden, nicht angezeigt werden. Im Gegenzug jedoch jene Termine, die der Adressatengruppe B zugeordnet sind, sofern der jeweilige Benutzer Mitglied dieser Gruppe ist.

Beste Grüße
Mario