milenishte.org
One tequila, two tequila, three tequila, floor.

Typo3 (или в превод - Тъпо 3) - Obsolete, for older versions of Typo3!!!

По злощастно стечение на обстоятелствата се наложи да науча и това. Тъй заради него се наложи да жертвам от безценното си време за мързел и спане, надявам се да успея да спестя това на някой друг.

Typo3 е web content management система писана на PHP, използва MySQL. С нея може да се направи всичко и затова не е от най-лесните. Има много модули и досега не ми се е налагало да включвам мой код, освен от време на време да оправя по някой бъгав модул. Най-много се гордея с промените по Drop-Down sitemap, за да стане това :)

Ето и най-важното:
  1. Създаване структурата на сайта:
    • меню "Page"
    • клик бърху иконката на "Blank Dummy". Появава се меню, избира се "New"
    • от опциите в дясно се избира Page - Click here for wizard
    • задават се настройки за новата страница: махане на checkbox "Hide", за да не е скрита страницата и т.н. Тази страница ще бъде root и съответно homepage на сайта. Всички подстраници трябва да се въведат под нея.
    • след това със клик върху инконката на всяка създадена страница по аналогичен начин може да се създаде структурата на сайта.
  2. Създаване на темплейт:
    По този начин се обозначават динамичните места в страницата:
    <!--###SOME_NAME### begin -->
    <!--###SOME_NAME### end -->

    При по-голяма страница обаче е по-лесно да се използва plugin Automaketemplate (tx_automaketemplate_pi1). Тогава таговете, които имат параметър ID или CLASS автоматично се маркират. Точно при кои тагове да става това се казва в Setup на темплейта. Например:
    plugin.tx_automaketemplate_pi1 {
        elements {
            TD.all = 1
            TR.all = 1
            DIV.all = 1
            A.all = 1
        }
    }

    Примерен темплейт.

  3. Добавяне на темплейт:
    • меню "Template"
    • избира се root страницата
    • "Create template for a new site"
    • Click here to edit whole template record

    Примерен Setup за горния темплейт.
    page = PAGE
    page.meta.DESCRIPTION = Meta Tag - Description
    page.meta.KEYWORDS = Meta Tag - Keywords

    # За модула Indexed Seach
    page.config.index_enable = 1
    page.config.index_externals = 1

    # Настойки за езика:
    config.language = bg
    # Настойка на locale - ако има такъв инсталиран на системата
    config.locale_all = bg

    # Дали да показва админ панел ако потребителя е логнат в backend администрацията. С посочения пример показва само иконките за редактиране, не целия панел.
    config.admPanel = 0
    admPanel {
        enable.edit = 1
    }

    # Новини
    plugin.tt_news {
        latestLimit = 2
        latestHeader = 0
        pid_list = 100
        singlePid = 111
        backPid = 100
        defaultCode = LATEST
        # Ако случайно не ви допада подреждането по datetime, ето как да се промени на, примерно, title.
        # би трябвало да работи, ако не беше това беузмие.
        listOrderBy = title desc
        _CSS_DEFAULT_STYLE =
        templateFile = fileadmin/template/main/tt_news_v2_template.html
        displayLatest.date_stdWrap.strftime= %e. %B %Y
        displayLatest.subheader_stdWrap.wrap = <p class="newsblock">|</p>
        displayList.date_stdWrap.strftime= %e. %B %Y
        displayList.title_stdWrap.wrap = |
        displayList.author_stdWrap.wrap = |
        displayList.content_stdWrap.wrap = |
        displaySingle.date_stdWrap.strftime= %e. %B %Y
        displaySingle.title_stdWrap.wrap = |
    }

    temp.news < plugin.tt_news


    temp.main_navigation = HMENU
    temp.main_navigation.maxItems = 6
    temp.main_navigation.1 = TMENU
    temp.main_navigation.1 {
        NO = 0
        NO.allWrap = <div class="menu">|</div>
        ACT = 0
        ACT.allWrap = <div class="menu">|</div>
    }

    temp.bottom_navigation1 = HMENU
    temp.bottom_navigation1.begin = 7
    temp.bottom_navigation1.1 = TMENU
    temp.bottom_navigation1.1 {
        # &#124; е кода за права черта
        NO = 0
        NO.allWrap = | &nbsp;&#124;&nbsp;
        ACT = 0
        ACT.allWrap = | &nbsp;&#124;&nbsp;
    }

    # Показват се до 3 нива надолу по навигацията.
    temp.secondary_navigation = HMENU
    temp.secondary_navigation.entryLevel = 1
    temp.secondary_navigation.1 = TMENU
    temp.secondary_navigation.1 {
        NO = 0
        NO.allWrap = <div class="fst">|</div>
    }
    temp.secondary_navigation.2 = TMENU
    temp.secondary_navigation.2 {
        NO = 0
        NO.allWrap = <div class="sec">|</div>
    }
    temp.secondary_navigation.3 = TMENU
    temp.secondary_navigation.3 {
        NO = 0
        NO.allWrap = <div class="third">·&nbsp;|</div>
    }

    temp.rootline = HMENU
    temp.rootline.special = rootline
    temp.rootline.1 = TMENU
    temp.rootline.1 {
        NO.allWrap = |&nbsp;&gt;&nbsp; |*||*| |
    }


    # Подменю на страницата с id 74
    temp.bottom_navigation2 = HMENU
    temp.bottom_navigation2.special = directory
    temp.bottom_navigation2.special.value = 74
    temp.bottom_navigation2.1 = TMENU
    temp.bottom_navigation2.1 {
        NO = 0
        NO.allWrap = <div class="fst">|</div>
    }

    # Configuring the Auto-Parser:
    plugin.tx_automaketemplate_pi1 {
        # Read the template file:
        content = FILE
        content.file = fileadmin/template/main/template_2.html
        # Here we define which elements in the HTML that
        # should be wrapped in subpart-comments:
        elements {
            BODY.all = 1
            BODY.all.subpartMarker = DOCUMENT_BODY
            HEAD.all = 1
            HEAD.all.subpartMarker = DOCUMENT_HEADER
            HEAD.rmTagSections = title
            TD.all = 1
            TR.all = 1
            DIV.all = 1
            A.all = 1
            UL.all = 1
        }
        # Prefix all relative paths with this value:
        relPathPrefix = fileadmin/template/main/
    }

    temp.mainTemplate = TEMPLATE
    temp.mainTemplate {
        template =< plugin.tx_automaketemplate_pi1
        subparts.main_navigation < temp.mainNav
        subparts.secondary_navigation < temp.subNav
        subparts.rootline < temp.rootline
        # Зависи къде е сложено съдържанието в страницата, може да бъде styles.content.getLeft, styles.content.get, styles.content.getRight
        subparts.content < styles.content.get
        subparts.bottom_navigation1 < temp.bottom_navigation1
        subparts.bottom_navigation2 < temp.bottom_navigation2
        subparts.news < temp.news
        subparts.somelink = HTML
        subparts.somelink.value = <a href="index.php?id=88">Линк някакъв</a>
    }



    temp.Template_96 = TEMPLATE
    temp.Template_96 {
        # Тук може да се случва нещо различно
        # ....
    }

    # typeNum дава още един начин на различни места да се правят различни неща
    page.typeNum = 0

    # Ако настоящата страница е с ID 96, прави друго.
    [globalVar = TSFE:id = 96]
        page.10 < temp.Template_96
    [else]
        page.10 < temp.mainTemplate
    [end]

    « скрий

  4. Редакция:
    Typo3 кешира страниците, затова когато направите промяна, която се отразява не само на редактираната страница, а и на други (например промяна в темплейта), най-добре е да се избере "Clear all cache".
  5. Странни неща:
    • Ако в темплейта има следния div, в който трябва да има динамично съдържание: <div id="divname"></div> - няма да работи, тъй като трябва да има нов ред между отварящия и затварящия таг:
      <div id="divname">
      </div>

    • Подреждане в tt_news
      Това тук е комбинация между странни разбирания за живота, вселената и всичко останало и от страна на Typo 3, и от страна на MySQL 5. Интересно защо, в tt_news се групира по tt_news.uid ако нищо друго не е указано изрично. MySQL пък са решили от версия 5 нагоре, при използване на GROUP BY да сортират по ключа, по който се групира, а не по ORDER BY клаузата. Резултатът е, че трябва или в setup да се укаже groupBy, в който да участва и това, по което искате да подредите резултатите (примерно в стандартния случай - datetime), или да се промени следното в class.tx_ttnews.php:

      if ($this->config['groupBy']) {
          $selectConf['groupBy'] = $this->config['groupBy'];
      } else {
          $selectConf['groupBy'] = 'tt_news.uid';
      }

      да стане така:

      if ($this->config['groupBy']) {
          $selectConf['groupBy'] = $this->config['groupBy'];
      } else {
          $selectConf['groupBy'] = '';
      }

  6. Extensions
    • Indexed Search (indexed_search)
      Още един бъг, който ми скапа половин ден :( Функцията за премахване на нежеланите HTML секции (т.е. <script></script> и <style></style>) не работи правилно когато имам по няколко такива секции. Затова изтеглете оттук коригирания модул. Само подменете файла class.indexer.php в директорията на модула (обикновено typo3conf/ext/indexed_search).

      За да индексира страниците в Setup на темплейта трябва да има следното:
      page.config.index_enable = 1
      За да индексира външните фаийлове като PDF и Word, трябва да има следното:
      page.config.index_externals = 1

    • Index Searched Statistics (mv_index_searched_statistics)
      Статистика за търсените думи - backend модул, добавя си линк "IS statistics" в меню-то на администрацията.

    • Job Offers (cl_joboffers)
      Не знам дали не работи при мен, защото е правено за друга версия на Typo3 или заради нещо друго, но от тук можете да изтеглите работеща версия за Typo3 3.7.0. Само подменете файла class.tx_cljoboffers_pi1.php в директорията на модула (обикновено typo3conf/ext/cl_joboffers/cl_joboffers/pi1).

    • Make Print Link (make_printlink)
      Много полезно и много лесно за инсталиране. Прави подходящ за разпечатване вариант на всяка страница, дори и страници с POST променливи.

    • Tip-a-friend (tipafriend)
      Препоръчай на приятел.
      Setup - настройки и генериране на линка, който ще стои на всяка страница
      plugin.tipafriend {
          templateFile = fileadmin/template/main/tipafriend_template.tmpl
          wrap1.wrap = |
          wrap2.wrap = |
          color1.wrap =
          color2.wrap =
          color3.wrap =
          htmlmail = 1
          htmlMail = 1
          notify_to_email = name@domain.com
          notify_to_name = My Name
          notify_from_email = name@domain.com
          notify_from_name = My Name
      }

      temp.tipafriend = USER
      temp.tipafriend {
          userFunc = tx_tipafriend->main_tipafriend
          templateFile = fileadmin/template/main/tipafriend_template.tmpl
          code = TIPLINK
          typolink.parameter = 128 _top # uid of page where Tip-a-Friend plugin is inserted
      }

      « скрий

  7. Полезно
    • Frontend edit
      Ако потребителя е логнат в backend администрацията, може да редактира съдържанието на страницата директно докато разглежда сайта. Трябва само да се добави следното в Setup на темплейта:
      config.admPanel = 1
      admPanel {
          enable.edit = 1
      }
      Може да се махне административния панел (config.admPanel = 0) и да се виждат само иконите за редактиране на съдържанието.

    • Rich Text Editor
      Може да се правят настройки на RTE на админситрацията. Слага се в "TSconfig" на страницата (Edit page header).

      Пример
      RTE.config.tt_content.bodytext.proc.overruleMode = ts_css
      RTE >
          RTE.default {
              dontConvBRtoParagraph = 1
              proc.overruleMode = ts_css
              proc.dontConvBRtoParagraph = 1
              showButtons=textcolor,class
              disableColorPicker = 0
              colors = red, noColor
              classesCharacter = bodytext, redbodytext
          }
          RTE.classes {
              bodytext {
                  name = Body Text (Primary)
                  value = color: #000000;
              }
              redbodytext {
                  name = red
                  value = #8C0010;
              }
          }
          
          RTE.colors {
              red {
              name = Red
              value = #8C0010
          }
          noColor {
              name = No color
              value =
          }
      }
      }

      « скрий

    • Login Form
      За да се сложи формата в страница: New content -> Login form
      Списъка с потребители се вкарва във SysFolder
      За да се каже ID на SysFolder-а с потребителите - в Constants на темплейта се слага следното: styles.content.loginform.pid = ID
      За да се каже коя страница е защитена с парола - Visibility settings.

  8. Препоръки
    Преди да решите да използвате Typo3, посетете този сайт: opensourcecms.com. Може да се окаже че нещо по-просто също ще ви свърши работа :)



Last update: 21.02.2026, contacts: milenishte@gmail.com