Cal – Kleines Monatsmenü

Um für die Erweiterung cal ein kleines Monatsmenü in der Form

  • Januar 2011
  • Februar 20011
  • März 20011
  • April 20011
  • Mai 20011
  • usw.

zu erstellen, habe ich ein wenig TypoScript und PHP miteinander kombiniert.
Wer möchte, kann sich bedienen:

Hier die Schritte zur Umsetzung:

  1. Menü mit TypoScript & PHP
  2. Anpassung des TypoScripts für cal

TS-Menü

page.includeLibs.calMenu = fileadmin/inc/calMenuFunc.php

lib.cal_menu = COA
lib.cal_menu {
    wrap = |
    20 = HMENU
    20 {
        1 = TMENU
        1 {            
            wrap = <ul class="csc-menu">|</ul>
            itemArrayProcFunc = user_calMenuFunc->getDateRange
            itemArrayProcFunc.cal_range_begin = -6
            itemArrayProcFunc.cal_range_end = 6
            NO {
                allWrap = <li>|</li>
                additionalParams.cObject = COA
                additionalParams.cObject {
                    10 = COA
                    10 {
                        wrap = &tx_cal_controller[from_date]=|
                        10 = TEXT
                        10.wrap = |-
                        10.field = cal_year
                        20 = TEXT
                        20.wrap = |-
                        20.field = cal_month
                        30 = TEXT
                        30.value = 01
                    }
                    20 = COA
                    20 {
                        wrap = &tx_cal_controller[to_date]=|
                        10 = TEXT
                        10.wrap = |-
                        10.field = cal_end_year
                        20 = TEXT
                        20.wrap = |-
                        20.field = cal_end_month
                        30 = TEXT
                        30.value = 01
                    }                    
                    70 = TEXT
                    70.wrap = &tx_cal_controller[timestamp]=|
                    70.field = cal_ts
                    rawUrlEncode = 1
                }
                stdWrap.strftime = %B %Y                
            }
            ACT < .NO
            ACT = 1
            ACT {
                linkWrap = <span class="active">|</span>
                ATagBeforeWrap = 1
                doNotLinkIt = 1
            }
        }
    }
}

Für die eigentlich Generierung kommt dann das inkludierte PHP-Skript zum Tragen:

class user_calMenuFunc {

    /**
     * Create a calendar based menu for the cal extension
     * @param array $menuArr
     * @param array $conf
     * @return array The new menu array
     */
    public function getDateRange($menuArr, $conf) {
        $calMenuArray = array();
        $rangeBegin = isset($conf['cal_range_begin']) ? $conf['cal_range_begin'] : '-6';
        $rangeEnd = isset($conf['cal_range_end']) ? $conf['cal_range_end'] : '6';
        $range = range($rangeBegin, $rangeEnd);
        $format = 'month';
        $calParams = t3lib_div::GPvar('tx_cal_controller');
        $curTimestamp = $this->roundToFirstSecondAndFirstDayOfMonth(isset($calParams['timestamp']) ? intval($calParams['timestamp']) : strtotime('today'));
        if (is_array($range) && !empty($range)) {
            $timestamps = array();
            foreach ($range as $step) {
                $timestamps[] = $this->roundToFirstSecondAndFirstDayOfMonth(strtotime(sprintf('%s %s', $step, $format)));
            }
            foreach ($timestamps as $key => $timestamp) {

                $endtimestamp = strtotime('+1 ' .$format, $timestamp);

                $calMenuArray[$key]['title'] = $timestamp;
                $calMenuArray[$key]['cal_startdate'] = $timestamp;
                $calMenuArray[$key]['cal_enddate'] = $endtimestamp;
                $calMenuArray[$key]['cal_year'] = strftime('%Y', $timestamp);
                $calMenuArray[$key]['cal_month'] = strftime('%m', $timestamp);
                $calMenuArray[$key]['cal_end_year'] = strftime('%Y', $endtimestamp);
                $calMenuArray[$key]['cal_end_month'] = strftime('%m', $endtimestamp);
                $calMenuArray[$key]['cal_ts'] = $timestamp;
                $calMenuArray[$key]['uid'] = $GLOBALS['TSFE']->id;
                $calMenuArray[$key]['ITEM_STATE'] = 'NO';
                if ($curTimestamp === $timestamp) {
                    $calMenuArray[$key]['ITEM_STATE'] = 'ACT';
                }
            }
        }
        return $calMenuArray;
    }

    /**
     * Get the first second of the day
     * @param integer $timestamp
     * @return integer
     */
    protected function roundToFirstSecondAndFirstDayOfMonth($timestamp = 0) {
        if ($timestamp > 0) {
            $timestamp = mktime(0, 0, 1, date('m', $timestamp), 1, date('Y', $timestamp));
        }
        return $timestamp;
    }
}

Die Anpassung an dem cal-TS sieht dann noch so aus:

plugin.tx_cal_controller {
    view {
        list {
            useGetdate = 0
            starttime = TEXT
            starttime {
               value = now
               override.data = GPvar:tx_cal_controller|from_date
               override.if.isTrue.data = GPvar:tx_cal_controller|from_date
            }
            endtime {
               value = +1 month
               override.data = GPvar:tx_cal_controller|to_date
               override.if.isTrue.data = GPvar:tx_cal_controller|to_date
            }
        }
    }
}

Wenn zunächst keine Parameter übergeben wurden, dann wird entweder die Einstellung in den cal-Flexforms gewählt oder aber die cal-Default-Einstellung „ab jetzt“ bis „1 Monat später“.

Im cal-Plugin selber wird nur die Ansicht Liste ausgewählt und bei dem Reiter Listen-Ansicht habe ich Startzeit „Monatsanfang“ und bei Endzeit „Monatsende“ ausgewählt.

Frage:
Habe ich mir viel zu viel Arbeit gemacht? Gibt es diese Funktion bereits in der cal von Haus aus?

Für Fragen und Anregungen bin ich jederzeit dankbar.

Veröffentlicht von

avatar

Sebastian Schreiber

Ich bin 1980 in Bergisch Gladbach geboren. Nach dem Abitur und Zivildienst habe ich 2000 an der Fachhochschule Lippe & Höxter das Studium der Medienproduktin begonnen und nach längeren Aufenthalten in Valencia und Berlin 2003 das Studium mit dem Abschluss Bachelor of Science in Medienproduktion abgeschlossen. Nach einer Festanstellung kurz nach dem Studium in einer kleinen Webagentur in Köln mit Schwerpunkt TYPO3 bin ich nun seit 2008 freiberuflicher Webentwickler.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.