[ABD] Simple Calendar

In diesem Forum können Mod-Autoren ihre Mods vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Dralor
Mitglied
Beiträge: 13
Registriert: 18.06.2009 16:56

Re: [0.6.0] Simple Calendar

Beitrag von Dralor »

Leider habe ich zu wenig Ahnung von dieser Materie, daher weiß ich auch nicht wie technisch schwierig solche Umsetzungen sind. Aber um nochmal auf diese Frage zurück zukommen. Könnte man es dahin vielleicht vereinfachen, dass sich nur eine Person anmelden könnte und diese nicht nur unter der Rubrik "Anmeldungen" sondern an der genannten anderen Stelle erscheinen könnte? sowas wie "Copy" "Paste" ?

Danke für die Hilfe!, Gruß Dralor
dabsy
Mitglied
Beiträge: 108
Registriert: 19.12.2008 23:03
Kontaktdaten:

Re: [0.6.0] Simple Calendar

Beitrag von dabsy »

Hallo

ich bin auf der suche nach einen Kalender für phpbb 3. wo man Termine eintragen kann, also bei den Standart kalender geht das ja leider nicht!

Kann mir da jemand helfen bitte? habe schon alles durchsucht!

LG Dabsy
BB-BF-BM
Mitglied
Beiträge: 2179
Registriert: 28.10.2005 16:38
Wohnort: Essen

Re: [0.6.0] Simple Calendar

Beitrag von BB-BF-BM »

Hallo!

Versuch mal folgende Änderungen:
Sie sind allerdings alle ungetestet, sodass ein Backup der Dateien unbedingt notwendig ist!

/calendar/common.php

Code: Alles auswählen

    public $type = 'cal_date'; 
ersetzen gegen:

Code: Alles auswählen

    public $type = 'cal_date';
    
    public function get_attendant_user()
    {
        foreach ($this->user_data as $user_id => $user_data)
        {
            if ($user_data['attendance_mode'] > 0)
            {
                return $user_id;
            }
        }
        return false;
    } 

Code: Alles auswählen

        if ($this->user_data[$user->id]['notify'] == $notify
         && $this->user_data[$user->id]['attendance_mode'] == $attendance_mode
         && $this->user_data[$user->id]['attendance_comment'] == $attendance_comment)
        {
            return $this;
        } 
ersetzen gegen:

Code: Alles auswählen

        if (($user_id = $this->get_attendant_user()) && $user_id != $user->id)
        {
            $attendance_mode = 0;
            $attendance_comment = '';
        }
        if ($this->user_data[$user->id]['notify'] == $notify
         && $this->user_data[$user->id]['attendance_mode'] == $attendance_mode
         && $this->user_data[$user->id]['attendance_comment'] == $attendance_comment)
        {
            return $this;
        } 

/calendar/show_date.php

Code: Alles auswählen

foreach ($date->user_data as $user_id => $data)
{
    $_user = cal_users::get_user_by_id($user_id);
    if ($data['attendance_mode'] > 0)
    {
        $block_name = 'attendances_yes';
    }
    else if ($data['attendance_mode'] < 0)
    {
        $block_name = 'attendances_no';
    }
    else
    {
        if (!$data['attendance_comment'])
        {
            continue;
        }
        $block_name = 'attendances_other';
    }
    $template->assign_block_vars($block_name, array(
        'USER_ID'        =>    $_user->id,
        'USER_NAME'        =>    $_user->name,
        'USER_COLOUR'    =>    $_user->colour,
        'USER_URL'        =>    $_user->url->get_built(),
        'COMMENT'    =>    nl2br($data['attendance_comment'])
    ));
} 
ersetzen gegen:

Code: Alles auswählen

if ($user_id = $date->get_attendant_user())
{
    $_user = cal_users::get_user_by_id($user_id);
    $template->assign_block_vars('attendance_yes', array(
        'USER_ID'        =>    $_user->id,
        'USER_NAME'        =>    $_user->name,
        'USER_COLOUR'    =>    $_user->colour,
        'USER_URL'        =>    $_user->url->get_built(),
        'COMMENT'    =>    nl2br($date->user_data[$user_id]['attendance_comment'])
    ));
} 
/styles/prosilver/template/calendar/show_date.html

Code: Alles auswählen

	<dt class="attendance_mode">{L_ATTENDANCE}</dt>
	<dd class="attendance_mode"><select name="attendance_mode">
		<!-- IF ATTENDANCE_MODE > 0 -->
		<option value="0">---</option>
		<option value="1" selected="selected">{L_ATTENDANCE_YES}</option>
		<option value="-1">{L_ATTENDANCE_NO}</option>
		<!-- ELSEIF ATTENDANCE_MODE < 0 -->
		<option value="0">---</option>
		<option value="1">{L_ATTENDANCE_YES}</option>
		<option value="-1" selected="selected">{L_ATTENDANCE_NO}</option>
		<!-- ELSE -->
		<option value="0" selected="selected">---</option>
		<option value="1">{L_ATTENDANCE_YES}</option>
		<option value="-1">{L_ATTENDANCE_NO}</option>
		<!-- ENDIF -->
	</select></dd>
	
	<dt class="attendance_comment">{L_ATTENDANCE_COMMENT}:</dt>
	<dd class="attendance_comment"><textarea name="own_attendance_comment" rows="7" cols="15">{ATTENDANCE_COMMENT}</textarea></dd>
	
	<dd class="clear"><hr /></dd>
ersetzen gegen:

Code: Alles auswählen

	<!-- IF attendance_yes == 0 -->
	<dt class="attendance_mode">{L_ATTENDANCE}</dt>
	<dd class="attendance_mode"><select name="attendance_mode">
		<!-- IF ATTENDANCE_MODE > 0 -->
		<option value="0">---</option>
		<option value="1" selected="selected">{L_ATTENDANCE_YES}</option>
		<option value="-1">{L_ATTENDANCE_NO}</option>
		<!-- ELSEIF ATTENDANCE_MODE < 0 -->
		<option value="0">---</option>
		<option value="1">{L_ATTENDANCE_YES}</option>
		<option value="-1" selected="selected">{L_ATTENDANCE_NO}</option>
		<!-- ELSE -->
		<option value="0" selected="selected">---</option>
		<option value="1">{L_ATTENDANCE_YES}</option>
		<option value="-1">{L_ATTENDANCE_NO}</option>
		<!-- ENDIF -->
	</select></dd>
	
	<dt class="attendance_comment">{L_ATTENDANCE_COMMENT}:</dt>
	<dd class="attendance_comment"><textarea name="own_attendance_comment" rows="7" cols="15">{ATTENDANCE_COMMENT}</textarea></dd>
	
	<dd class="clear"><hr /></dd>
	<!-- ENDIF -->

Code: Alles auswählen

	<dt class="attendances">{L_ATTENDANCES}</dt>
	<dd class="attendances"><dl>
	<!-- BEGIN attendances_yes -->
		<dt class="attendance_yes" title="{L_ATTENDANCE_YES}" onmouseover="show_attendance_comment('{attendances_yes.USER_ID}');">
			<a href="{attendances_yes.USER_URL}" style="color: #{attendances_yes.USER_COLOUR};">{attendances_yes.USER_NAME}</a>
		</dt>
		<!-- IF attendances_yes.COMMENT -->
		<dd id="attendance_comment_{attendances_yes.USER_ID}">
			{attendances_yes.COMMENT}
		</dd>
		<!-- ENDIF -->
	<!-- END attendances_yes -->
		
	<!-- BEGIN attendances_no -->
		<dt class="attendance_no" title="{L_ATTENDANCE_NO}" onmouseover="show_attendance_comment('{attendances_no.USER_ID}');">
			<a href="{attendances_no.USER_URL}" style="color: #{attendances_no.USER_COLOUR};">{attendances_no.USER_NAME}</a>
		</dt>
		<!-- IF attendances_no.COMMENT -->
		<dd id="attendance_comment_{attendances_no.USER_ID}">
			{attendances_no.COMMENT}
		</dd>
		<!-- ENDIF -->
	<!-- END attendances_no -->
		
	<!-- BEGIN attendances_other -->
		<dt class="attendance_other" title="{L_ATTENDANCE_OTHER}" onmouseover="show_attendance_comment('{attendances_other.USER_ID}');">
			<a href="{attendances_other.USER_URL}" style="color: #{attendances_other.USER_COLOUR};">{attendances_other.USER_NAME}</a>
		</dt>
		<dd id="attendance_comment_{attendances_other.USER_ID}">
			{attendances_other.COMMENT}
		</dd>
	<!-- END attendances_other -->
	<!-- IF .attendances_yes == 0 && .attendances_no == 0 && .attendances_other == 0 -->
		<dt>{L_NONE}</dt>
	<!-- ENDIF -->
	</dl></dd>
	<dd id="attendance_comment" style="display: none;"><p>{L_ATTENDANCE_COMMENT}:</p><p>&nbsp;</p></dd>
ersetzen gegen:

Code: Alles auswählen

	<dt class="attendances">{L_ATTENDANCES}</dt>
	<dd class="attendances"><dl>
	<!-- BEGIN attendances_yes -->
		<dt class="attendance_yes" title="{L_ATTENDANCE_YES}" onmouseover="show_attendance_comment('{attendances_yes.USER_ID}');">
			<a href="{attendances_yes.USER_URL}" style="color: #{attendances_yes.USER_COLOUR};">{attendances_yes.USER_NAME}</a>
		</dt>
		<!-- IF attendances_yes.COMMENT -->
		<dd id="attendance_comment_{attendances_yes.USER_ID}">
			{attendances_yes.COMMENT}
		</dd>
		<!-- ENDIF -->
	<!-- BEGINELSE -->
		<dt>{L_NONE}</dt>
	<!-- ENDIF -->
	</dl></dd>
	<dd id="attendance_comment" style="display: none;"><p>{L_ATTENDANCE_COMMENT}:</p><p>&nbsp;</p></dd>


Nach diesen Änderungen sollte es nur für einen User möglich sein, sich anzumelden.
(Dies kannst du zunächst auch testen, um im Fehlerfall sagen zu können, wo der Fehler liegt.)


Nun kannst du in der Datei /styles/prosilver/template/calendar/show_date.html mit dem Code

Code: Alles auswählen

<!-- BEGIN attendances_yes -->
	<a href="{attendances_yes.USER_URL}" style="color: #{attendances_yes.USER_COLOUR};">{attendances_yes.USER_NAME}</a>
<!-- END attendance_yes -->
Um den Namen des zuerst angemeldeten Users also hinter dem Termin-Namen auszugeben, musst du

Code: Alles auswählen

		<!-- ENDIF --> {NAME}
	</h3>
	<div class="actions">
ersetzen gegen:

Code: Alles auswählen

		<!-- ENDIF --> {NAME} 
		<!-- BEGIN attendances_yes -->
			 (<a href="{attendances_yes.USER_URL}" style="color: #{attendances_yes.USER_COLOUR};">{attendances_yes.USER_NAME}</a>)
		<!-- END attendance_yes -->
	</h3>
	<div class="actions">

Um auch in der Terminübersicht den Usernamen hinter dem Terminnamen auszugeben, musst du in der Datei /calendar/common.php

Code: Alles auswählen

                $GLOBALS['template']->assign_block_vars('days.events', array(
                    'NAME'    =>    $_date->name,
                    'URL'    =>    $_date->url->get_built(),
                    'CLASSES'    =>    implode(' ', $classes),
                    'TYPE'        =>    $_date->type,
                    'IS_EQUAL'    =>    $_date->copy_name_and_desc,
                    'VISIBLE'    =>    $visible,
                    'INVITED'    =>    $current_user->is_invited_to_date($_date),
                    'ATTENDANCE_MODE'    =>    isset($_date->user_data[$current_user->id]) ? $_date->user_data[$current_user->id]['attendance_mode'] : 0,
                    'NOTIFY'    =>    $current_user->gets_notified_of_date($_date)
                )); 
ersetzen gegen:

Code: Alles auswählen

                if ($attendant_user_id = $_date->get_attendant_user())
                {
                    $attendant_user = cal_users::get_user_by_id($attendant_user_id);
                }
                $GLOBALS['template']->assign_block_vars('days.events', array(
                    'NAME'    =>    $_date->name,
                    'URL'    =>    $_date->url->get_built(),
                    'CLASSES'    =>    implode(' ', $classes),
                    'TYPE'        =>    $_date->type,
                    'IS_EQUAL'    =>    $_date->copy_name_and_desc,
                    'VISIBLE'    =>    $visible,
                    'INVITED'    =>    $current_user->is_invited_to_date($_date),
                    'ATTENDANCE_MODE'    =>    isset($_date->user_data[$current_user->id]) ? $_date->user_data[$current_user->id]['attendance_mode'] : 0,
                    'NOTIFY'    =>    $current_user->gets_notified_of_date($_date),
                    'ATTENDANT_USER'    =>    $attendant_user_id,
                    'ATTENDANT_USER_NAME'    =>    $attendant_user_id ? $attendant_user->name : '',
                    'ATTENDANT_USER_COLOUR'    =>    $attendant_user_id ? $attendant_user->colour : '',
                    'ATTENDANT_USER_URL'    =>    $attendant_user_id ? $attendant_user->url->get_built()
                )); 

/styles/prosilver/template/calendar/dates_list.html

Code: Alles auswählen

				<dt class="name"><a href="{days.events.URL}">{days.events.NAME}</a></dt>
ersetzen gegen:

Code: Alles auswählen

				<dt class="name"><a href="{days.events.URL}">{days.events.NAME}</a></dt>
				<!-- IF days.events.ATTENDANT_USER -->
					 (<a href="{days.events.ATTENDANT_USER_URL}" style="color: #{days.events.ATTENDANT_USER_COLOUR};">{days.events.ATTENDANT_USER_NAME}</a>)
				<!-- ENDIF -->


Wie gesagt: alle Änderungen sind ungetestet!



@Dabsy: was geht nicht mit welchem Kalender?
dabsy
Mitglied
Beiträge: 108
Registriert: 19.12.2008 23:03
Kontaktdaten:

Re: [0.6.0] Simple Calendar

Beitrag von dabsy »

Hallo

na mir den normalen Kalender den man einstellen kann, kann man keine events eintragen! Zb. beim 10.8.2009 Börse in Dreieich um 10 Uhr usw.....

LG Dabsy
BB-BF-BM
Mitglied
Beiträge: 2179
Registriert: 28.10.2005 16:38
Wohnort: Essen

Re: [0.6.0] Simple Calendar

Beitrag von BB-BF-BM »

Hallo Dabsy!

Hast du ihn denn bereits irgendwo installiert?

Du musst angemeldet sein, um Termine erstellen zu können und die Berechtigung dazu besitzen (übers ACP einstellbar).
dabsy
Mitglied
Beiträge: 108
Registriert: 19.12.2008 23:03
Kontaktdaten:

Re: [0.6.0] Simple Calendar

Beitrag von dabsy »

Hallo

nein ich habe es nicht installiert weil ja da steht: Der Kalender funktioniert NUR mit PHP 5.1.2 und höher!

und ich habe nur PHPBB 3.0.5!

Und genau dafür suche ich so ein Mod!

LG Dabsy
BB-BF-BM
Mitglied
Beiträge: 2179
Registriert: 28.10.2005 16:38
Wohnort: Essen

Re: [0.6.0] Simple Calendar

Beitrag von BB-BF-BM »

Hallo Dabsy!

PHP != phpBB

PHP ist eine Skriptsprache, die von phpBB verwendet wird.

Sie sind im Groben unabhängig voneinander.
Du kannst zum Beispiel phpBB 2 mit PHP 3, PHP 4 oder PHP 5 verwenden und phpBB 3 mit PHP 4 oder PHP 5.

Der Kalender ist für PHP 5 und phpBB 3 ausgelegt.
dabsy
Mitglied
Beiträge: 108
Registriert: 19.12.2008 23:03
Kontaktdaten:

Re: [0.6.0] Simple Calendar

Beitrag von dabsy »

dankeschön......so, habe alles getan, aber wenn ich installieren will steht da ständig error da obwohl alles hochgeladen wurde,

wenn ich auf kalender gehe im Forum wird der mir komischerweise schon angezeigt, geht aber noch ned :oops:
Prüfe, ob Sprach-Dateien für "British English" hochgeladen wurden ERROR

Prüfe, ob Sprach-Dateien für "Deutsch (Sie)" hochgeladen wurden ERROR

Prüfe, ob Template-Dateien für "subsilver2" hochgeladen wurden ERROR

Prüfe, ob Template-Dateien für "Getaway Darkblue" hochgeladen wurden ERROR

Prüfe, ob Theme-Dateien für "subsilver2" hochgeladen wurden ERROR

Prüfe, ob Theme-Dateien für "SmoothBLUE" hochgeladen wurden ERROR

Prüfe, ob die Berechtigungsrollen für "Kann Ereignisse erstellen" aktualisiert wurden ERROR / Was muss da rein? Volle Funktionalität?

und von Schritt 10 gehts weiter auf: Allgemeiner Fehler Allgemeiner Fehler
Could not open ./../styles/prosilver/template/colour_swatch.html



Dabsy

Ps. Trotz diesen fehlern und das die installation nicht ausgeführt werden kann, ist der kalender mit allen funktionen erfolgreich online, das verstehe ich nicht :-?
Dralor
Mitglied
Beiträge: 13
Registriert: 18.06.2009 16:56

Re: [0.6.0] Simple Calendar

Beitrag von Dralor »

Buenos Dias!

Änderungen vorgenommen:
/calendar/common.php - geändert OK
/calendar/show_date.php - geändert / nach Änderung keine Anmeldungen mehr sichtbar.
/styles/prosilver/template/calendar/show_date.html - geändert OK
---
/calendar/show_date.php
ohne Änderungen - nur noch ein Benutzer kann sich aktiv anmelden
---
/styles/prosilver/template/calendar/show_date.html - geändert OK
/calendar/common.php - geändert / Parse error
/styles/prosilver/template/calendar/dates_list.html - geändert OK
---
/calendar/common.php
ohne Änderungen - keine sichtbaren Veränderungen
mit Änderung - Parse error
---
Parse error
Parse error: syntax error, unexpected ')' in /var/www (...) calendar/common.php on line 2167

Code: Alles auswählen

                    $attendant_user = cal_users::get_user_by_id($attendant_user_id);
                }
2153             $GLOBALS['template']->assign_block_vars('days.events', array(
                    'NAME'    =>    $_date->name,
2155             'URL'    =>    $_date->url->get_built(),
                    'CLASSES'    =>    implode(' ', $classes),
                    'TYPE'        =>    $_date->type,
                    'IS_EQUAL'    =>    $_date->copy_name_and_desc,
                    'VISIBLE'    =>    $visible,
2160             'INVITED'    =>    $current_user->is_invited_to_date($_date),
                    'ATTENDANCE_MODE'    =>    isset($_date->user_data[$current_user->id]) ? $_date->user_data[$current_user->id]['attendance_mode'] : 0,
                    'NOTIFY'    =>    $current_user->gets_notified_of_date($_date),
                    'ATTENDANT_USER'    =>    $attendant_user_id,
                    'ATTENDANT_USER_NAME'    =>    $attendant_user_id ? $attendant_user->name : '',
2165             'ATTENDANT_USER_COLOUR'    =>    $attendant_user_id ? $attendant_user->colour : '',
                    'ATTENDANT_USER_URL'    =>    $attendant_user_id ? $attendant_user->url->get_built()
2167             ));
			}
		}
2170		if ($bdays)
		{
			foreach ($bdays as $bday)
			{
				$_user = cal_users::get_user_by_id($bday['user_id']);
				$age = cal_bdays::get_age($bday, $day);
				
				if ($age < 0)
Grüße Dralor !
BB-BF-BM
Mitglied
Beiträge: 2179
Registriert: 28.10.2005 16:38
Wohnort: Essen

Re: [0.6.0] Simple Calendar

Beitrag von BB-BF-BM »

Hallo!

dabsy, wenn alles funktioniert, ist alles in Ordnung, du kannst dann die Fehlermeldungen ignorieren.
"Volle Funktionalität" sollte auf jeden Fall Ereignisse erstellen dürfen.


@Dralor: Eine Ergänzung zu den oben genannten Änderungen

/calendar/show_date.php

Code: Alles auswählen

if ($user_id = $date->get_attendant_user())
{
    $_user = cal_users::get_user_by_id($user_id);
    $template->assign_block_vars('attendance_yes', array(
        'USER_ID'        =>    $_user->id,
        'USER_NAME'        =>    $_user->name,
        'USER_COLOUR'        =>    $_user->colour,
        'USER_URL'        =>    $_user->url->get_built(),
        'COMMENT'        =>    nl2br($date->user_data[$user_id]['attendance_comment'])
    ));
} 
ersetzen gegen:

Code: Alles auswählen

if ($user_id = $date->get_attendant_user())
{
    $_user = cal_users::get_user_by_id($user_id);
    $template->assign_block_vars('attendances_yes', array(
        'USER_ID'        =>    $_user->id,
        'USER_NAME'        =>    $_user->name,
        'USER_COLOUR'        =>    $_user->colour,
        'USER_URL'        =>    $_user->url->get_built(),
        'COMMENT'        =>    nl2br($date->user_data[$user_id]['attendance_comment'])
    ));
} 

/styles/prosilver/template/calendar/show_date.html

Code: Alles auswählen

       <!-- IF attendance_yes == 0 -->
       <dt class="attendance_mode">{L_ATTENDANCE}</dt>
       <dd class="attendance_mode"><select name="attendance_mode">
          <!-- IF ATTENDANCE_MODE > 0 -->
          <option value="0">---</option>
          <option value="1" selected="selected">{L_ATTENDANCE_YES}</option>
          <option value="-1">{L_ATTENDANCE_NO}</option>
          <!-- ELSEIF ATTENDANCE_MODE < 0 -->
          <option value="0">---</option>
          <option value="1">{L_ATTENDANCE_YES}</option>
          <option value="-1" selected="selected">{L_ATTENDANCE_NO}</option>
          <!-- ELSE -->
          <option value="0" selected="selected">---</option>
          <option value="1">{L_ATTENDANCE_YES}</option>
          <option value="-1">{L_ATTENDANCE_NO}</option>
          <!-- ENDIF -->
       </select></dd>
       
       <dt class="attendance_comment">{L_ATTENDANCE_COMMENT}:</dt>
       <dd class="attendance_comment"><textarea name="own_attendance_comment" rows="7" cols="15">{ATTENDANCE_COMMENT}</textarea></dd>
       
       <dd class="clear"><hr /></dd>
       <!-- ENDIF -->
ersetzen gegen:

Code: Alles auswählen

       <!-- IF attendances_yes == 0 -->
       <dt class="attendance_mode">{L_ATTENDANCE}</dt>
       <dd class="attendance_mode"><select name="attendance_mode">
          <!-- IF ATTENDANCE_MODE > 0 -->
          <option value="0">---</option>
          <option value="1" selected="selected">{L_ATTENDANCE_YES}</option>
          <option value="-1">{L_ATTENDANCE_NO}</option>
          <!-- ELSEIF ATTENDANCE_MODE < 0 -->
          <option value="0">---</option>
          <option value="1">{L_ATTENDANCE_YES}</option>
          <option value="-1" selected="selected">{L_ATTENDANCE_NO}</option>
          <!-- ELSE -->
          <option value="0" selected="selected">---</option>
          <option value="1">{L_ATTENDANCE_YES}</option>
          <option value="-1">{L_ATTENDANCE_NO}</option>
          <!-- ENDIF -->
       </select></dd>
       
       <dt class="attendance_comment">{L_ATTENDANCE_COMMENT}:</dt>
       <dd class="attendance_comment"><textarea name="own_attendance_comment" rows="7" cols="15">{ATTENDANCE_COMMENT}</textarea></dd>
       
       <dd class="clear"><hr /></dd>
       <!-- ENDIF -->
Alle Änderungen zusammen sollten jetzt eigentlich funktionieren.

Der Parse Error dürfte eigentlich nicht sein: kannst du noch einmal den entsprechenden Codeabschnitt aus der /calendar/common.php posten, wie du ihn geändert hast.
Benutz diesmal

Code: Alles auswählen

[code=php]
[/code]zum Darstellen des Codes!
Antworten

Zurück zu „[3.0.x] Mods in Entwicklung“