BrowseLinks Hooks

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    12. 02. 2013, 10:37

    Hi,

    Ich muss den Link Browser (der sich unter anderem aus dem RTE öffnet) so erweitern, dass ich einnen eigenen Datentypen verlinken kann.

    Ich weiß, dass es da eine Erweiterung gibt, die möchte ich aber nicht benutzen, sondern einen Hook für BrowseLinks einbinden.

    Ich finde aber keine konkreten How-Tos oder irgendwas, das mir dabei hilft. Die Klasse ans ich ist auch nicht sehr aufschlussreich dokumentiert.

    Das ganze sollte nach TYPO3-6.0 Konventionen laufen inkl. Namespaces.

    Gibts irgendwo ein brauchbares Tutorial dazu?

  • Hilfreichster Beitrag

  • mischa mischa
    Jedi-Meister
    1 x
    411 Beiträge
    5 Hilfreiche Beiträge
    30. 06. 2014, 12:42 - Hilfreichster Beitrag

    Hallo,

    super Anleitung. Vielen Dank dafür.

    Eine kleine Ergänzung:

    Ich frage in der getTab() ab, ob ich im RTE bin oder nicht und binde dann den ganzen Klassenauswahl udn title-Felder ein.

    1. if($this->isRTE()) {
    2. $rte = GeneralUtility::makeInstance('TYPO3\\CMS\\Rtehtmlarea\\BrowseLinks');
    3. $rte->anchorTypes[] = $linkSelectorAction;
    4. $rte->init();
    5. $out .= $rte->addAttributesForm();
    6. }

    So kann man im TSConfig eigene Klassen und Title-Attribute für den RTE definieren. (Nach API)

    Meine isRTE() schaut so aus (aus der EXT linkhandler geklaut)

    1. protected function isRTE() {
    2. if ($this->pObj->mode=='rte') {
    3. return true;
    4. }
    5. else {
    6. return false;
    7. }
    8. }

    LG,

    Mischa.


  • 1
  • MajPay MajPay
    Jedi-Meister
    1 x
    345 Beiträge
    2 Hilfreiche Beiträge
    13. 02. 2013, 13:45

    War ein brutales Stück Arbeit, habe absolut nichts brauchbars im Netz gefunden, schlussendlich hat mir das durchforsten der linkhandler extension und das Sourcecode studieren geholfen. Damit nicht jeder Stundenlang durch 1000e Zeilen Code durch muss ein paar Dinge dazu:

    Hooks hinzufügen:

    1. //register hook for adding regional_object tab to Link Browser in RTE
    2. $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/rtehtmlarea/mod3/class.tx_rtehtmlarea_browse_links.php']['browseLinksHook'][] = 'Vendor\\RegionalObject\\Hook\\BrowseLinksHook';
    3. $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/class.browse_links.php']['browseLinksHook'][] = 'Vendor\\RegionalObject\\Hook\\BrowseLinksHook';
    4.  
    5. //register hook for parsing regional_object link in the frontend
    6. $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['typolinkLinkHandler']['typo3/regional_object'] = 'Vendor\\RegionalObject\\Hook\\LinkHandler';

    Hooks im Autoloader registrieren.

    Der Browselinkshook leitet sich vom Interface \TYPO3\CMS\Core\ElementBrowser\ElementBrowserHookInterface ab, die nötigen Methoden anlegen...

    init Methode: Hier muss nichts passieren, es hilft euch aber, wenn ihr dem Hook eine Eigenschaft parentObject gibt und dieses dort referenziert

    In addAllowedItems pushed ihr in das Array, das per Parameter kommt euren Key und returned es.

    In modifyMenuDefinition bekommt ihr ein array, dem ihr eure neue Definition anhängt. Sieht in etwa so aus:

    1. if (in_array('regional_object',$this->parentObject->allowedItems)) {
    2. $menuDefinition['regional_object']['isActive'] = $this->parentObject->act == 'regional_object';
    3. $menuDefinition['regional_object']['label'] = $GLOBALS['LANG']->sL('LLL:EXT:regional_object/Resources/Private/Language/locallang_ttc.xml:browseLinks.regional_object',1);
    4. $menuDefinition['regional_object']['url'] = '#';
    5. $menuDefinition['regional_object']['addParams'] = 'onclick="jumpToUrl(\'' . htmlspecialchars(('?act=regional_object&mode=' . $this->parentObject->mode . '&bparams=' . $this->parentObject->bparams)) . '\');return false;"';
    6. }
    7. return $menuDefinition;

    in getTab returned ihr euren neuen Inhalt.

    Pagetree und Records könnt ihr so laden:

    1. $pageTree = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TBE_PageTree');
    2. $tree = $pageTree->printTree($pageTree->getBrowsableTree());
    3. $cElements = $this->getRegionalObjects();

    die getRegionalObjects methode von mir beinhaltet folgendes:

    1. $tablename = 'tx_regionalobject_domain_model_regionalobject';
    2. $out = '';
    3. // Set page id (if any) to expand
    4. $expPageId = $this->parentObject->expandPage;
    5. // If there is an anchor value (content element reference) in the element reference, then force an ID to expand:
    6. if (!$this->parentObject->expandPage && $this->parentObject->curUrlInfo['cElement']) {
    7. // Set to the current link page id.
    8. $expPageId = $this->parentObject->curUrlInfo['pageid'];
    9. }
    10. // Draw the record list IF there is a page id to expand:
    11. if ($expPageId && \TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($expPageId) && $GLOBALS['BE_USER']->isInWebMount($expPageId)) {
    12. // Set header:
    13. $out .= $this->parentObject->barheader($GLOBALS['LANG']->sL('LLL:EXT:regional_object/Resources/Private/Language/locallang_db.xml:tx_regionalobject_domain_model_regionalobject',1));
    14. // Create header for listing, showing the page title/icon:
    15. $titleLen = intval($GLOBALS['BE_USER']->uc['titleLen']);
    16. $mainPageRec = \TYPO3\CMS\Backend\Utility\BackendUtility::getRecordWSOL('pages', $expPageId);
    17. $picon = \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIconForRecord('pages', $mainPageRec);
    18. $picon .= \TYPO3\CMS\Backend\Utility\BackendUtility::getRecordTitle('pages', $mainPageRec, TRUE);
    19. $out .= $picon . '<br />';
    20. // Look up tt_content elements from the expanded page:
    21. $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
    22. 'uid,type,hidden,starttime,endtime,title',
    23. $tablename,
    24. 'pid=' . intval($expPageId) .
    25. \TYPO3\CMS\Backend\Utility\BackendUtility::deleteClause($tablename) .
    26. \TYPO3\CMS\Backend\Utility\BackendUtility::versioningPlaceholderClause($tablename), '', 'sorting,title,uid');
    27.  
    28. $cc = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
    29.  
    30. // Traverse list of records:
    31. $c = 0;
    32. while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
    33. $c++;
    34. $icon = \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIconForRecord($tablename, $row);
    35. if ($this->parentObject->curUrlInfo['act'] == 'page' && $this->parentObject->curUrlInfo['cElement'] == $row['uid']) {
    36. $arrCol = '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($GLOBALS['BACK_PATH'], 'gfx/blinkarrow_left.gif', 'width="5" height="9"') . ' class="c-blinkArrowL" alt="" />';
    37. } else {
    38. $arrCol = '';
    39. }
    40. // Putting list element HTML together:
    41. //
    42. // onclick="return link_typo3Page(\'' . $expPageId . '\',\'#' . $row['uid'] . '\');"
    43. $onclick = 'onclick="return link_spec(\'regional_object:' . $row['uid'] . '\');"';
    44. $out .=
    45. '<img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($GLOBALS['BACK_PATH'], ('gfx/ol/join' . ($c == $cc ? 'bottom' : '') . '.gif'), 'width="18" height="16"') . ' alt="" />'. $arrCol .
    46. '<a href="#" '.$onclick.'>' . $icon . \TYPO3\CMS\Backend\Utility\BackendUtility::getRecordTitle($tablename, $row, TRUE) . '</a><br />';
    47. }
    48. }
    49. return $out;

    in parseCurrentUrl returne ich einfach das info Array.

    ####

    LinkHandler: Ich kopiere das gesamte File hier rein:

    1. <?php
    2.  
    3. namespace Vendor\RegionalObject\Hook;
    4.  
    5. /**
    6.  * LinkHandler Class
    7.  * Generates a link for the frontend for linked regional object elements
    8.  *
    9.  * @author Philipp Wrann
    10.  * @vendor ******
    11.  */
    12.  
    13. class LinkHandler {
    14.  
    15. /**
    16. * Process the typolink
    17. *
    18. * todo: think of rewriting the link
    19. *
    20. * @param string $linktxt The linktext
    21. * @param array $conf Configuraion
    22. * @param string $linkHandlerKeyword should be regional_object
    23. * @param string $linkHandlerValue The uid of the record
    24. * @param string $linkParams Full link params
    25. * @param \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer $contentObjectRenderer
    26. *
    27. * @return string the rendered link
    28. */
    29. function main($linktxt, $conf, $linkHandlerKeyword, $linkHandlerValue, $linkParams, &$contentObjectRenderer) {
    30.  
    31. $regionalObject = $GLOBALS['TSFE']->sys_page->checkRecord('tx_regionalobject_domain_model_regionalobject',$linkHandlerValue);
    32.  
    33. if ($regionalObject && !empty($regionalObject)) {
    34. $typesConfig = $GLOBALS['TSFE']->tmpl->setup['plugin.']['regional_object.']['types.'];
    35. $link = '';
    36. $localContentObjectRenderer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\ContentObject\\ContentObjectRenderer');
    37. $localContentObjectRenderer->start($regionalObject);
    38. $type = $localContentObjectRenderer->data['type'];
    39.  
    40. //get types detail page based on the according typoscript setting
    41. if (isset($typesConfig[$type.'.']['detailPageUid']) && \TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($typesConfig[$type.'.']['detailPageUid']))
    42. $detailPageUid = $typesConfig[$type.'.']['detailPageUid'];
    43. else
    44. $detailPageUid = $typesConfig['default.']['detailPageUid'];
    45.  
    46. $link = $localContentObjectRenderer->typoLink($linktxt,array(
    47. 'parameter' => $detailPageUid,
    48. 'additionalParams' => '&regional_object='.$linkHandlerValue
    49. )
    50. );
    51.  
    52. return $link;
    53. }
    54.  
    55. return $linktxt;
    56. }
    57.  
    58.  
    59.  
    60. }
    61.  
    62. ?>

  • MajPay MajPay
    Jedi-Meister
    0 x
    345 Beiträge
    2 Hilfreiche Beiträge
    14. 02. 2013, 11:04

    Ein Problem gibts noch:

    1. $pageTree = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TBE_PageTree');
    2. $tree = $pageTree->printTree($pageTree->getBrowsableTree());
    3. $cElements = $this->getRegionalObjects();

    Hier wird mir nur der letzte Mount des Users ausgegeben, wenn er mehrere Mounts hat habe ich das Problem, dass ich nicht alle DB Mounts sehe. Ich habe das nun fürs erste so umgangen:

    1. $pageTree->MOUNTS = array('0'=>'0');

    Damit wird nur ein Mount (der der Root Page) angezeigt, es wird alle mal ALLES angezeigt. Jedoch wäre es logischerweise sinnvoller die jeweils zutreffenden Mounts zu benutzen. Woher bekomme ich die, damit die Sichtbarkeitseinstellungen die selben sind wie beim Pagetree im Backend?

  • MajPay MajPay
    Jedi-Meister
    1 x
    345 Beiträge
    2 Hilfreiche Beiträge
    14. 02. 2013, 11:11

    Immer wieder toll, wenn man ewig rumprobiert, dann nachfragt und es kurz danach hinbekommt.

    So funktioniert es:

    1. $pageTree = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TBE_PageTree');
    2. $pageTree->ext_showNavTitle = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.showNavTitle');
    3. $pageTree->ext_showPageId = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.showPageIdWithTitle');
    4. $pageTree->addField('nav_title');
    5.  
    6. $tree = $pageTree->getBrowsableTree();

  • mischa mischa
    Jedi-Meister
    1 x
    411 Beiträge
    5 Hilfreiche Beiträge
    30. 06. 2014, 12:42

    Hallo,

    super Anleitung. Vielen Dank dafür.

    Eine kleine Ergänzung:

    Ich frage in der getTab() ab, ob ich im RTE bin oder nicht und binde dann den ganzen Klassenauswahl udn title-Felder ein.

    1. if($this->isRTE()) {
    2. $rte = GeneralUtility::makeInstance('TYPO3\\CMS\\Rtehtmlarea\\BrowseLinks');
    3. $rte->anchorTypes[] = $linkSelectorAction;
    4. $rte->init();
    5. $out .= $rte->addAttributesForm();
    6. }

    So kann man im TSConfig eigene Klassen und Title-Attribute für den RTE definieren. (Nach API)

    Meine isRTE() schaut so aus (aus der EXT linkhandler geklaut)

    1. protected function isRTE() {
    2. if ($this->pObj->mode=='rte') {
    3. return true;
    4. }
    5. else {
    6. return false;
    7. }
    8. }

    LG,

    Mischa.

  • 1