Fluid: Blätterfunktion ohne Widget „paginate“

Geändert: Dienstag, 11. Oktober 2016 | Erstellt: Freitag, 18. Juli 2014

Wie man das Widget „paginate“ nutzt, kann man unter anderem auf typo3blogger.de nachlesen. Wenn man dieses Widget aber nicht einsetzen kann, z.B. weil man die Datenbankabfrage im Repository mit

$query->statement("SELECT * FROM...");

erzeugt, muss man den Pager selbst erzeugen, hier eine mögliche Vorgehensweise:

Pager-Array generieren

EXT:myExt/Classes/Controller/MyController.php

/**
 * action list
 *
 * @param integer $page: paginator, starts with 0
 * @return void
 */
public function listAction($page = 0) {
    $page = (int)$page;
    $this->view->assign('page', $page);
    $myRecords = $this->objectManager->get(\Vendor\MyExt\Domain\Repository\MyRepository::class)->myQuery();
    $this->view->assign('myRecords', $myRecords);
    // generate pager
    if($myRecords->count()) {
        $paginate = array();
        for($i = 0; $i < $myRecords->count(); $i += (int)$this->settings['pager']['itemsPerPage']) {
            $paginate[] = $i;
        }
        $this->view->assign('paginate', $paginate);
    }
}

TypoScript Setup für Berechnungen in Fluid

Für den Pager werden im Fluid Template Berechnungen durchgeführt. Da Fluid selbst keine Berechnungen durchführen kann, wird dies über TypoScript erledigt.

EXT:myExt/Configuration/TypoScript/setup.txt

plugin.tx_myext {
    math = TEXT
    math {
        current = 1
        prioriCalc = 1
    }
}

Pager als Partial

EXT:myExt/Resources/Private/Partials/Pager/Pager.html

<f:if condition="{paginate->f:count()} > 1">
    <f:alias map="{
        paginateMax:  '{f:cObject(typoscriptObjectPath: \'plugin.tx_myext.math\', data: \'{paginate->f:count()}-1\')}',
        paginatePrev: '{f:cObject(typoscriptObjectPath: \'plugin.tx_myext.math\', data: \'{currentPage}-1\')}',
        paginateNext: '{f:cObject(typoscriptObjectPath: \'plugin.tx_myext.math\', data: \'{currentPage}+1\')}'
        }">
        <ul class="tx_myext-list-browse">
            <f:if condition="{currentPage} > 0">
                <li class="first">
                    <f:link.action addQueryString="1" arguments="{page: '0'}">
                        &lt;&lt;
                    </f:link.action>
                </li>
                <li class="prev">
                    <f:link.action addQueryString="1" arguments="{page: paginatePrev}">
                        &lt;
                    </f:link.action>
                </li>
            </f:if>
            <f:for each="{paginate}" as="paginateItem" key="p" iteration="i">
                <li>
                    <f:link.action addQueryString="1" arguments="{page: p}" class="{f:if(condition: '{p} == {currentPage}', then: 'active')}">
                        {i.cycle}
                    </f:link.action>
                </li>
            </f:for>
            <f:if condition="{currentPage} < {paginateMax}">
                <li class="next">
                    <f:link.action addQueryString="1" arguments="{page: paginateNext}">
                        &gt;
                    </f:link.action>
                </li>
                <li class="last">
                    <f:link.action addQueryString="1" arguments="{page: paginateMax}">
                        &gt;&gt;
                    </f:link.action>
                </li>
            </f:if>
        </ul>
    </f:alias>
</f:if>

Einbindung des Partials im Template

Im Template wird der Pager eingebunden und nur die Datensätze der gewählten Seite ausgegeben.

EXT:myExt/Resources/Private/Templates/MyController/List.html

<f:if condition="{myRecords}">
    <f:render partial="Pager/Pager" arguments="{paginate:paginate, currentPage:page}" />
    <f:for each="{myRecords}" as="myRecord" iteration="i">
        <f:if condition="{i.index} >= {f:cObject(typoscriptObjectPath: 'plugin.tx_myext.math', data: '{page}*{settings.pager.itemsPerPage}')}">
            <f:if condition="{i.index} < {f:cObject(typoscriptObjectPath: 'plugin.tx_myext.math', data: '({page}+1)*{settings.pager.itemsPerPage}')}">
                Record UID: {myRecord.uid}
            </f:if>
        </f:if>
    </f:for>
</f:if>

 

Thema: TYPO3 Extension-Programmierung | Keine Kommentare

Hintergrundbilder im Slider

Geändert: Mittwoch, 2. Juli 2014 | Erstellt: Donnerstag, 26. Juni 2014

In diesem Artikel möchte ich zeigen, wie man (Hintergrund)Bilder in einem Slider verwenden kann. Es gibt zwar einige Bilder-Slider, bei diesen kann man aber meistens nur Bilder durchblättern. Oft ist aber gewünscht, dass über dem Bild noch eine Überschrift Links oder sonstiger Text steht, also Inhalte, für die man die Standard Inhaltselemente von TYPO3 nutzen kann. Gut dafür geeignet ist die oft genutzte Erweiterung jfmulticontent oder aber die Umsetzung mit Ext. gridelements. Bei beiden Varianten können alle TYPO3 Inhaltselemente (Text, Bild, Text mit Bild, Formulare, Plugins, …) im Slider verwendet werden. Und mit meiner Erweiterung backgroundimage4ce kann man für alle Inhaltselemente Hintergrundbilder angeben. Screenshots, wie die Bedienung im TYPO3 Backend erfolgt, die Ausgabe im Frontend, eine Anleitung zur Installation und vieles mehr findet man im Handbuch von Ext. backgroundimage4ce.

Anstatt der „langweiligen“, klassischen Darstellung und Bedienung des Sliders gibt es hierbei viele weitere Möglichkeiten: Man kann zum Beispiel die Hintergrundbilder „supersized“, also verbreitert auf die gesamte Bildschirmbreite und/oder -höhe, darstellen und hinter dem gesamten Seiteninhalt durchscrollen. Oder man verwendet andere Effekte: Anstatt die Inhalte klassisch von rechts nach links durchzusliden, kann man diese zum Beispiel auch überblenden.

Auf diesen Seiten sieht man eine Demonstration des Sliders:

  1. Kombination von backgroundimage4ce mit gridelements: www.datacollect.com
  2. Kombination von backgroundimage4ce mit jfmulticontent: www.spezialitaetenland-bayern.de

Setzt du bei einer Webseite auch diese Kombination für einen Slider ein? Falls ja, nehme ich diese gerne in die Liste auf. Oder kennst du eine andere Möglichkeit für einen Slider in TYPO3, bei dem Text über einem Bild durchgeblättert werden kann?

Thema: TYPO3 Extensions | Keine Kommentare

TYPO3: BE Modul mit persistenten Menü

Erstellt: Freitag, 16. Mai 2014

Wie ein Backend Modul mit Extbase/Fluid erstellt und dort auch ein Menü anbietet, kann man in diesem Artikel nachlesen.

Damit dieses Menü sich nun aber den zuvor ausgewählten Menüpunkt merkt, auch wenn man zwischenzeitlich in einem anderen BE Modul war oder im Seitenbaum klickt, muss man den letzten Menüstatus für den Backend-User abspeichern und beim Aufrufen des BE Moduls prüfen, ob dieser gesetzt ist und ggf. auf ihn weiterleiten:

namespace TYPO3\MyExt\Controller;
class BackendController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
 
    /**
     * Redirect to the saved menu item
     */
    protected function initializeAction() {
        $vars = \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('tx_myext_web_myexttxmyextm1');
        // redirect only, if no menu item has been selected and if the last selection has been saved
        $lastActionMenuItem = $GLOBALS['BE_USER']->uc['my_ext']['lastActionMenuItem'];
        if(!$vars['action'] && $lastActionMenuItem) {
            // one redirect is enough
            self::saveState();
            // redirect
            $this->redirect($lastActionMenuItem);
        }
    }
 
    public function indexAction() {
        // save selected menu item
        self::saveState('index');
    }
 
    /**
     * Save the selected menu item
     *
     * @param string $actionMenuItem
     * @return void
     */
    protected static function saveState($actionMenuItem = '') {
        $GLOBALS['BE_USER']->uc['my_ext']['lastActionMenuItem'] = $actionMenuItem;
        $GLOBALS['BE_USER']->writeUC();
    }
}

Die genaue Schreibweise des GET-Parameters „tx_myext_web_myexttxmyextm1“ findet man am leichtesten heraus, indem man sich die Adresse des Iframes des BE Moduls anzeigen lässt. Der Platzhalter „my_ext“ ist der Extension-Key, „MyExt“ ist der Extension-Key in CamelCase Schreibweise.

Abgeschaut bei System-Extension „reports“.

Thema: TYPO3 Extension-Programmierung | Keine Kommentare

TYPO3-konforme SQL-Anweisungen in ext_tables.sql

Geändert: Mittwoch, 4. April 2018 | Erstellt: Freitag, 9. Mai 2014

Auch in TYPO3 6.2 muss man noch darauf achten, wie man die SQL-Anweisungen in der Datei ext_tables.sql der eigenen Erweiterungen aufbaut, damit diese von TYPO3 „verstanden“ werden. Zwar werden die SQL-Anweisungen korrekt ausgeführt und die Tabelle wird angelegt, aber im „Database Analyser“ des Install Tools werden beim „Database Compare“ Unterschiede aufgezeigt.

So hängt z.B. die Syntax des Default-Wertes vom Spaltentyp ab:

  1. Der Spaltentyp „integer“ muss als Default-Wert DEFAULT '0' NOT NULL haben.
  2. Der Spaltentyp „varchar“ muss als Default-Wert DEFAULT '' NOT NULL haben.
  3. Der Spaltentyp „tinytext“, „text“, „mediumtext“ und „longtext“ darf keinen Default-Wert haben.
  4. Der Spaltentyp „double“ muss als Default-Wert DEFAULT '0' NOT NULL haben.

Außerdem muss man beachten:

  1. Die Anweisung „auto_increment“ muss klein geschrieben werden.
  2. Bei der Definition eines Schlüssels darf es bei den Feldern kein Leerzeichen geben.

Beispiel:

ext_tables.sql

CREATE TABLE tx_mytable (
    uid int(11) NOT NULL auto_increment,
    pid int(11) DEFAULT '0' NOT NULL,
    title varchar(255) DEFAULT '' NOT NULL,
    description text,
    image blob,
    flag tinyint(1) unsigned DEFAULT '0' NOT NULL,
    number1 int(11) DEFAULT '0' NOT NULL,
    number2 double DEFAULT '0' NOT NULL,
    latitude double(13,10) DEFAULT '0.0000000000' NOT NULL,
    date timestamp DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (uid),
    KEY parent (pid),
    KEY whatever (uid,number1)
);

Den Fehler bei Verwendung von „CURRENT_TIMESTAMP“ bekommt man nicht weg. Zwar verschwindet er, wenn man „DEFAULT ‚CURRENT_TIMESTAMP'“ schreibt, die Tabelle lässt sich mit dieser Abweisung aber nicht initial anlegen.

Sind euch noch weitere Fälle bekannt, die man beachten muss?

Thema: TYPO3 Extension-Programmierung | Kommentare (3)

TYPO3: FlashMessages

Geändert: Dienstag, 11. Oktober 2016 | Erstellt: Freitag, 28. Februar 2014

FlashMessages in Extbase

FlashMessages erstellen

Anlegen einer FlashMessage im Controller:

$this->addFlashMessage(
  'The message text.',
  'The title',
  \TYPO3\CMS\Core\Messaging\AbstractMessage::OK
);

oder

$this->controllerContext->getFlashMessageQueue()->enqueue(
  $this->objectManager->get(
    \TYPO3\CMS\Core\Messaging\FlashMessage::class,
    'The message text.',
    'The title',
    \TYPO3\CMS\Core\Messaging\AbstractMessage::OK
  )
);

Die zweite Funktion macht das gleiche wie die erste, die erste Funktion ist lediglich eine vereinfachte Variante der zweiten Funktion.

FlashMessages anzeigen

Auslesen von Meldungen im Controller:

$this->controllerContext->getFlashMessageQueue()->getAllMessages()

oder

$this->controllerContext->getFlashMessageQueue()->getAllMessagesAndFlush()

Ausgeben von Meldungen im Fluid Template:

<f:flashMessages renderMode="div" />

Anpassen der CSS Klassen

Kann sinnvoll, wenn man beispielsweise Bootstrap als Framework nutzt.

Geht vermutlich nur per XCLASS von \TYPO3\CMS\Core\Messaging\FlashMessage, damit wirklich ALLE Meldungen die eigenen CSS Klassen enthalten. Für die Änderung der CSS Klassen von Meldungen, die von einer eigenen Erweiterung erzeugt werden, gibt es folgende Möglichkeit:

EXT:my_ext/Classes/Messaging/FlashMessage.php

namespace TYPO3\MyExt\Messaging;
class FlashMessage extends \TYPO3\CMS\Core\Messaging\FlashMessage {
  protected $classes = array(
    self::NOTICE => 'notice alert alert-info',
    self::INFO => 'info alert alert-info',
    self::OK => 'ok alert alert-success',
    self::WARNING => 'warning alert alert-warning',
    self::ERROR => 'error alert alert-danger'
  );
}

Entsprechend ändert sich dann natürlich der Aufruf:

View

$this->controllerContext->getFlashMessageQueue()->enqueue(
  $this->objectManager->get(
    \Vendor\MyExt\Messaging\FlashMessage::class,
    'The message text.',
    'The title',
    \TYPO3\MyExt\Messaging\FlashMessage::OK
  )
);

FlashMessages in initializeAction()

Ist nicht möglich, da $this->contextController noch nicht bereitsteht.

Alternative: Funktion emitBeforeCallActionMethodSignal() nutzen, diese Funktion wird ebenfalls vor der Action aufgerufen:

/**
 * Called before all actions
 *
 * @param array $preparedArguments
 */
protected function emitBeforeCallActionMethodSignal(array $preparedArguments) {
    parent::emitBeforeCallActionMethodSignal($preparedArguments);
 
    $action = $this->request->getControllerActionName();
    if(in_array($action, array('list', 'new'))) {
        $this->addFlashMessage('Text', 'Title', \TYPO3\CMS\Core\Messaging\AbstractMessage::OK);
    }
}

FlashMessages im Backend (TYPO3 ab Version 6.1)

Nutzbar z.B. in einem Hook, der beim Speichern eines Datensatzes greift.

/** @var $flashMessage FlashMessage */
$flashMessage = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
  'TYPO3\\CMS\\Core\\Messaging\\FlashMessage',
  htmlspecialchars($message),
  htmlspecialchars($title),
  \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR,
  true // store in session
);
/** @var $flashMessageService \TYPO3\CMS\Core\Messaging\FlashMessageService */
$flashMessageService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Messaging\\FlashMessageService');
$defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier();
$defaultFlashMessageQueue->enqueue($flashMessage);

 

Thema: TYPO3 Extension-Programmierung | Kommentare (4)

Seitenbaum Reload via BE Modul

Erstellt: Donnerstag, 27. Februar 2014

Um über ein Backend Modul den Seitenbaum neu zu laden, kann man nachfolgende JavaScript-Anweisung nutzen:

if(top.content && top.content.nav_frame && top.content.nav_frame.refresh_nav) {
  top.content.nav_frame.refresh_nav();
}

Das kann beispielsweise sinnvoll sein, wenn das BE Modul Änderungen an Seiten vorgenommen hat und man diese Änderungen nun anzeigen möchte. Oft macht es Sinn, den Reload des Seitenbaums nur durchzuführen, nachdem der Benutzer eine bestimmte Aktion durchgeführt hat, z.B. ein Formular im BE Modul abgeschickt hat, hier ein Beispiel mit Extbase/Fluid:

View

<f:if condition="{submitted}">
  <script type="text/javascript">
  if(top.content && top.content.nav_frame && top.content.nav_frame.refresh_nav) {
    top.content.nav_frame.refresh_nav();
  }
  </script>
</f:if>
<f:form.submit name="submit" value="Submit" />

Controller

$this->view->assign('submitted', $this->request->hasArgument('submit'));

 

Thema: TYPO3 Extension-Programmierung | Keine Kommentare

TYPO3: Extbase/Fluid im BE Modul

Geändert: Montag, 3. September 2018 | Erstellt: Dienstag, 18. Februar 2014

Backend Modul, erstellt mit Extbase und Fluid Templates – ohne viel Bla-Bla:

ext_tables.php

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule(
    'TYPO3.' . $_EXTKEY,
    'tools',
    'tx_myext_m1',
    '',
    array(
        'Backend' => 'migrate',
    ),
    array(
        'access' => 'user, group',
        'icon' => 'EXT:my_ext/ext_icon.gif',
        'labels' => 'LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf',
    )
);

locallang.xlf

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
    <file source-language="en" datatype="plaintext" original="messages" product-name="loewen_be">
        <header/>
        <body>
            <trans-unit id="mlang_tabs_tab">
                <source>Löwen</source>
            </trans-unit>
            <trans-unit id="mlang_labels_tabdescr">
                <source>BE Modul für Löwen</source>
            </trans-unit>
        </body>
    </file>
</xliff>

ext_typoscript_setup.txt

module.tx_myext {
    view {
        templateRootPaths {
            0 = EXT:my_ext/Resources/Private/Templates/
        }
        partialRootPaths {
            0 = EXT:my_ext/Resources/Private/Partials/
        }
        layoutRootPaths {
            0 = EXT:my_ext/Resources/Private/Layouts/
        }
    }
    settings {
        // your TypoScript setup for backend module
    }
}

Resources/Private/Templates/Backend/Migrate.html

<f:layout name="Backend"/>
 
<f:section name="main">
    <h1>Migrate Service Centers</h1>
    <f:flashMessages renderMode="div" />
 
    <f:form action="migrate" name="migrate">
        <f:form.submit name="submit" value="Migrate!" />
    </f:form>
</f:section>

Resources/Private/Layouts/Backend.html

<f:be.container>
    <div class="typo3-fullDoc">
        <div id="typo3-docheader">
            <div class="typo3-docheader-functions">
                <div class="left">
                    <f:be.buttons.csh />
                    <f:be.menus.actionMenu>
                        <f:be.menus.actionMenuItem label="{f:translate(key: 'LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:action.action1')}" controller="Backend" action="action1" />
                        <f:be.menus.actionMenuItem label="{f:translate(key: 'LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:action.action2')}" controller="Backend" action="action2" />
                    </f:be.menus.actionMenu>
                </div>
                <div class="right">
                    <f:be.buttons.shortcut />
                    <f:be.pagePath />
                    <f:be.pageInfo />
                </div>
            </div>
        </div>
        <div id="typo3-docbody">
            <div id="typo3-inner-docbody">
                <f:render section="main" />
            </div>
        </div>
    </div>
</f:be.container>

 Classes/Controller/BackendController.php

namespace TYPO3\MyExt\Controller;
class BackendController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
    // TypoScript settings
    protected $settings = array();
    // id of selected page
    protected $id;
    // info of selected page
    protected $pageinfo;
 
    protected function initializeAction() {
        $this->id = (int)\TYPO3\CMS\Core\Utility\GeneralUtility::_GP('id');
        $this->pageinfo = \TYPO3\CMS\Backend\Utility\BackendUtility::readPageAccess($this->id, $GLOBALS['BE_USER']->getPagePermsClause(1));
 
        $configurationManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager::class);
 
        $this->settings = $configurationManager->getConfiguration(
            $this->request->getControllerExtensionName(),
            $this->request->getPluginName()
        );
    }
 
    /**
     * action
     *
     * @return void
     */
    public function migrateAction() {
        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\ObjectManager::class);
        $migrateRepository = $objectManager->get(\Vendor\MyExt\Domain\Repository\MigrateRepository::class);
 
        // form submitted
        if($this->request->hasArgument('submit')) {...}
 
        // add value to view
        $this->view->assign('var', 'value');
 
        // display message
        $this->addFlashMessage(
            'Some text',
            'The title',
            \TYPO3\CMS\Core\Messaging\FlashMessage::WARNING
        );
    }
}

CSS/JS Datei einlesen

<f:be.container addCssFile="{f:uri.resource(path:'path/to/file.css')}" addJsFile="{f:uri.resource(path:'path/to/file.js')}">...</f:be.container>

Fragen?

Thema: TYPO3 Extension-Programmierung | Kommentare (1)

TYPO3: Datumsfeld für BE Modul

Geändert: Donnerstag, 21. Mai 2015 | Erstellt: Freitag, 14. Februar 2014

Datepicker für ein Input-Feld in einem BE-Modul (hier in einem BE Modul umgesetzt mit Extbase/Fluid, getestet unter TYPO3 6.2):

$doc = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Backend\\Template\\DocumentTemplate');
$pageRenderer = $doc->getPageRenderer();
// Load ExtJS
$pageRenderer->loadExtJS();
$pageRenderer->addJsFile($this->backPath . 'sysext/backend/Resources/Public/JavaScript/tceforms.js');
$pageRenderer->addJsFile($this->backPath . 'js/extjs/ux/Ext.ux.DateTimePicker.js');
// Define settings for date picker
$typo3Settings = array(
    'datePickerUSmode' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['USdateFormat'] ? 1 : 0,
    'dateFormat' => array('j-n-Y', 'G:i j-n-Y'),
    'dateFormatUS' => array('n-j-Y', 'G:i n-j-Y')
);
$pageRenderer->addInlineSettingArray('', $typo3Settings);
 
$icon = \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('actions-edit-pick-date', array(
    'style' => 'cursor:pointer;',
    'id' => 'picker-tceforms-datefield-start'
));
$this->view->assign('icon', $icon);

Und das Template:

<f:form.textfield name="start" id="tceforms-datefield-start" value="" /> <f:format.raw>{icon}</f:format.raw>

Die Benennung der ID ist wichtig, diese muss in der Form tceforms-datefield-[fieldname] sein. Statt „datefield“ kann man auch „datetimefield“ verwenden, dann enthält der Datepicker noch die Uhrzeit.datepickerDie System-Extension scheduler setzt einen solchen Datepicker in dem Backend-Modul für die Task-Planung ein (siehe Abbildung), ebenso die Extension formhandler und weitere.

Thema: TYPO3 Extension-Programmierung | Kommentare (2)

Übermittlung von tt_news über das Frontend

Geändert: Freitag, 19. Januar 2018 | Erstellt: Dienstag, 28. Januar 2014

Die News-Erweiterung tt_news kann man oft flexibel für viele Anwendungsfälle einsetzen, z.B. als Glossar, als Veranstaltungskalender oder als Shop und es gibt etliche Erweiterungen für tt_news. Daher war ich mir sicher, für das Einreichen von neuen News-Datensätzen über das Frontend gibt es im TER eine Erweiterung, die zumindest ein paar der üblichen Anforderungen abdeckt:

  1. Upload von Bildern ist möglich
  2. Einteilung in Kategorien ist möglich
  3. Spam-Schutz
  4. Der Benutzer kann die eingereichten News nachträglich bearbeiten
  5. Der Administrator kann die eingereichten News direkt über Links in der E-Mail freischalten oder abweisen

Gefunden habe ich im TER diese Erweiterungen, von der leider keine einzige brauchbar ist:

  1. elemente_fenews Frontend Editing für News-Datensätze, mit RTE, Kategorie-Auswahl und Bild-Upload.
    Schlecht: Funktioniert ab TYPO3 Version 4.7 und tt_news Version 3.0.0 nicht mehr
  2. newsfrontendfeeder Übermittlung von News über das Frontend, mit Spam-Schutz (Captcha) und Benachrichtigung für Admin mit Freischaltung der neuen News über Link in E-Mail.
    Schlecht: Captcha funktioniert nicht; Plugin wird gecached eingebunden, dadurch werden Benutzereingaben nicht verarbeitet; keine Nur-Text-Version der E-Mails; bei Links in E-Mail fehlt die Domain; keine serverseitige Validierung, nur per JavaScript; deutscher Text in JavaScript-Validierung; kein Bild-Upload; Feld „Untertitel“ ist input statt textarea
  3. mt_fenews Übermittlung und Bearbeitung von News über das Frontend
    Schlecht: Kein Manual; schlampige Programmierung; unnötiges Plugin („FE future stuff„); erfordert Ext. mt_prize, die im TER nicht zu finden ist.

Die vorerst beste Möglichkeit scheint der Einsatz einer normalen Kontaktformular-Erweiterung (powermail oder formhandler) zu sein. Mit diesen Erweiterungen ist es möglich, die eingereichte News in der Datenbank zu speichern und per E-Mail an den Admin zu schicken. Damit ist der Upload von Bildern und die Einteilung in Kategorien möglich, einen Spam-Schutz hat jede Kontaktformular-Erweiterung sowieso. Schwieriger wird es, dem Benutzer die nachträgliche Bearbeitung seiner eingereichten News zu erlauben und dass der Administrator die News über Links in der E-Mail komfortabel freischalten kann, dafür muss man die Kontaktformular-Erweiterung mit einer eigenen Erweiterung erweitern.

Thema: TYPO3 Extensions | Kommentare (3)

Exit Disclaimer mit jQuery

Geändert: Montag, 1. August 2016 | Erstellt: Dienstag, 7. Januar 2014

Anzeigen eines Hinweises, dass der Benutzer die Webseite verlässt, nach dem Klick auf eine externe URL. Erst nach Bestätigung des Benutzers wird die externe Seite geöffnet. Es können Domains angegeben werden, bei denen die Hinweisbox nicht erscheint (z.B. bei Domains, die zur Unternehmensgruppe oder dem gleichen Inhaber gehören), außerdem wird das „target“ des Links (öffnen in neuer bzw. gleicher Seite) beachtet.

HTML

<div id="hint_external">
    <h2>Externer Link</h2>
    <p>
        Sie haben einen externen Link gewählt. Wenn Sie auf "Ja" klicken, verlassen Sie unsere Homepage.<br />
        Bitte beachten Sie, dass wir für den Inhalt der verlinkten Seite nicht verantwortlich sind.
    </p>
    <p>
        Wollen Sie die externe Seite <b id="hint_external_url">URL</b> betreten?
    </p>
    <p>
        <a id="hint_external_yes" href="#">Ja</a> <a id="hint_external_close" href="#">Nein</a>
    </p>
</div>

CSS

#hint_external {
    display: none;
    position: fixed;
    top: 30%;
    left: 50%;
    width: 300px;
    margin-left: -150px;
    background: #fff;
    border: 2px solid #000;
    padding: 10px;
}

JavaScript

// Hint for opening external url
var whiteList = new Array('www.domain.de', 'www.domain.com', '.allow-all-subdomains.de');
$('a').not('#hint_external a').on('click', function(e){
    var href = $(this).attr('href');
    var target = $(this).attr('target');
    if(href.match(/((http:\/\/)|(https:\/\/))/i)) {
        var whitelisted = false;
        // Check for external url
        var a = document.createElement('a');
        a.href = href;
        var hostname = a.hostname;
        $.each(whiteList, function(index, name) {
            name = name.replace(/\./g, String.fromCharCode(92) + '.');
            var re = new RegExp(name, 'i');
            if(re.test(hostname)) {
                whitelisted = true;
            }
        });
        if(!whitelisted) {
            e.preventDefault();
            $('#hint_external_url').text(hostname);
            $('#hint_external').show();
            $('#hint_external_close').one('click', function(e2){
                e2.preventDefault();
                $('#hint_external').hide();
            });
            $('#hint_external_yes').one('click', function(){
                $(this).attr('href', href);
                if(target){
                    $(this).attr('target', target);
                } else{
                    $(this).removeAttr('target');
                }
                $('#hint_external').hide();
            });
        }
    }
});

 

Thema: jQuery | Keine Kommentare