Die Extbase Extension “news” um ein Feld erweitern

Wie erweitert man eine Extbase Extension um ein neues Datenbank-Feld? Und zwar ohne die Extension direkt anzufassen, ohne Quick’n’dirty Hacks und ohne Workarounds? Welche Schritte muss man befolgen, um ein neues Datenbankfeld am Datensatz anzuzeigen und es schlußendlich im Fluid Template auch benutzen zu können?

Das nachfolgende Beispiel setzt eine Extension „torr_news_ext“ voraus (ggf leer mit dem Extension Builder angelegt), in die das Resources-Verzeichnis der „news“-Extension kopiert wurde (die Templates) und in der die genannten Dateien aufgebaut werden.

ext_tables.sql


CREATE TABLE tx_news_domain_model_news (
	new_field varchar(250) DEFAULT '' NOT NULL
);

ext_tables.php


<?php
    $tempColumns = Array (
            "new_field" => Array (
                    "exclude" => 1,
                    "label" => "LLL:EXT:torr_news_ext/Resources/Private/Language/locallang_db.xml:tx_torrnewsext_domain_model_news.new_field",
                    "config" => Array (
                            "type" => "input",
                            "size" => "30",
                            "eval" => "trim",
                    )
            ),
    );

    t3lib_div::loadTCA("tx_news_domain_model_news");
    t3lib_extMgm::addTCAcolumns("tx_news_domain_model_news",$tempColumns,1);
    t3lib_extMgm::addToAllTCAtypes("tx_news_domain_model_news","new_field;;;;1-1-1");
?>

Resources/Private/Language/locallang_db.xml

Hinweis: Liegen parallel xlf-Dateien (neues Format) in dem Verzeichnis werden deren Inhalte bevorzugt. Ggf hat die der Extension Builder angelegt. Damit das Beispiel funktioniert: die xlf-Dateien entfernen.


<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3locallang>
	<data type="array">
		<languageKey index="default" type="array">
			<label index="tx_torrnewsext_domain_model_news.new_field">The New Field</label>
		</languageKey>
	</data>
</T3locallang>

Configuration/TypoScript/constants.txt


plugin.tx_news {
	view {
		templateRootPath = EXT:torr_news_ext/Resources/Private/Templates/
		partialRootPath = EXT:torr_news_ext/Resources/Private/Partials/
		layoutRootPath = EXT:torr_news_ext/Resources/Private/Layout/
	}
}

Configuration/TypoScript/setup.txt


plugin.tx_news {
	persistence {
		classes {
			Tx_News_Domain_Model_News {
				subclasses {
					# hier wichtig: index 0 überschreiben für die 
					# normale News-Ansicht
					# 0 == Typ-Auswahl an News-Datensatz
					0 = Tx_TorrNewsExt_Domain_Model_NewsDefault
				}
			}
			Tx_TorrNewsExt_Domain_Model_NewsDefault {
				mapping {
					recordType = 0
					tableName = tx_news_domain_model_news
				}
			}
		}
	}
}

Classes/Domain/Model/NewsDefault.php


<?php
class Tx_TorrNewsExt_Domain_Model_NewsDefault 
    extends Tx_News_Domain_Model_NewsDefault
{
	/**
	 * the new field
	 * @var string
	 */
	protected $newField;
	
	/**
	 * Returns an array of orderings created from a given demand object.
	 *
	 * @param string $newField
	 * @return void
	 */
	public function setNewField($newField) {
		$this->newField = $newField;
	}
	/**
	 * Get new field
	 *
	 * @return string
	 */
	public function getNewField() {
		return $this->newField;
	}
}
?>

ext_autoload.php


<?php
$extensionPath = t3lib_extMgm::extPath('torr_news_ext');
return array(
	'tx_torrnewsext_domain_model_newsdefault' => $extensionPath . 'Classes/Domain/Model/NewsDefault.php',
);

Resources/Private/Templates/News/Detail.html


<f:section name="content">
 ...
 <div class="new-field">
		<h3>{newsItem.newField}</h3>
 </div>
 ...
</f:section>

18 Gedanken zu „Die Extbase Extension “news” um ein Feld erweitern“

  1. Hallo Rüdiger,
    danke für den Code! Hat mir viel gebracht!
    Eine Sache; Ich glaube an folgender Stelle fehlt ein Semikolon:
    public function setNewField($newField) {
    $this->newField = $newField ;;;;
    }

    Und noch eine Frage: Wie würdest du denn weitere Felder im Backend erstellen? Damit habe ich gerade einige Schwierigkeiten…

    Liebe Grüße,
    Manuel

  2. Hallo und Danke für diese tolle Anleitung!
    Allerdings habe ich auch gleich ne Frage, vielleicht kannst Du ja helfen.
    Ich versuche nicht nur ein Feld einzufügen, sondern ganze Objekte. Dazu habe ich in meinem Modell:

    class \Enzephalon\Psoabilling\Domain\Model\News extends Tx_News_Domain_Model_NewsDefault{
    
      /**
       * @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface
       */
      protected $psoabilling;
    
      /**
    	 * The constructor.
    	 */
    	public function __construct() {
    		$this->psoabilling = $this->objectManager->get('EnzephaloN\\Psoabilling\\Domain\\Model\\Band');
    	}  
    
      /**
       * @param \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $bands
       * @return void
       */
      public function setPsoabilling($psoabilling){
        $this->psoabilling = $psoabilling;
      }
      /**
       * @ \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $bands
       */
      public function getPsoabilling(){
        return $this->psoabilling;
      }
    
    }
    

    Aber irgendwie funktioniert das so noch nicht. Hast Du eine Idee, wie ich das zum Laufen bekomme? Danke!

  3. Hi Johannes,

    ein “ganzes Objekt” wäre bspw ein IRRE-Feld (Typ “inline”) oder eine Verknüpfung zu einem Datensatz (Typ “select”). Dazu musst zu unter dem Stichwort TCA und Deinem Konfigurationswunsch googlen. Die TCA-Doku findest Du hier: http://docs.typo3.org/typo3cms/TCAReference/

    Wenn es sich um ein Set an Objekten handelt, musst Du es auch so kennzeichnen, in Deinem Fall

    \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\EnzephaloN\Psoabilling\Domain\Model\Band>

    Falls es als nur ein Objekt konfiguriert ist, zumindest das richtige Model verwenden:

    \EnzephaloN\Psoabilling\Domain\Model\Band
  4. Hi Johannes

    Danke für dein Beispiel. Funktioniert einwandfrei. Ich hätte einen Frage. Wie sieht das ganze aus wenn ich z.b. relatedFiles erweitern will? Irgendwie hänge ich da.

  5. Hi Rosario,
    wer ist Johannes? :)
    Also den IRRE-Datensatz “relatedFiles”, ja? Da das bei IRRE echte Datenbanktabellen sind … das gleiche Prozedere in den entsprechenden Konfigurationsdateien.
    Die Tabelle in diesem Fall wäre tx_news_domain_model_file.
    Grüße, Rüdiger

  6. Danke für die tolle Anleitung. Weiß auch zufällig jemand, wie es geht, dass ich eben die List-Ansicht nach einem der neu hinzugefügten Felder sortieren lassen kann?

    Ich habe es jetzt so versucht, dass ich in meiner ext_tables.php meiner Erweiterung folgendes eingetragen habe:
    $GLOBALS['TYPO3_CONF_VARS']['EXT']['news']['orderByNews'] = 'tstamp,datetime,datefrom,dateto,price,crdate,title';

    So steht es zumindest in der Dokumentation der Extension. So bekomm ich die Felder (datefrom, dateto, price) meiner Extension zwar im Dropdown in der Plugin-Konfiguration im Backend, aber die Sortierung im Frontend ändert sich nicht.

    Wäre über Hilfe sehr dankbar!

  7. Hallo Rüdiger,

    vielen Dank für deine Hilfreiche Anleitung.
    Wie wäre denn der gedankliche Ansatz, wenn ich statt eines neuen Feldes eine eine weitere Controller Action hinzufügen möchte? Konkreter Hintergrund: Ich möchte eine randomAction hinzufügen, die eine zufällige News in der Detailansicht ausgibt.

    Vielen Dank für Deine/Eure Hilfe
    Jan

  8. Hallo Rüdger,

    vielen dank für deine Anleitung. Leider funktionierts bei mir nicht. Das neue Feld wird im Backend angezeigt und man kann die eingetragen Werte werden auch in der Datenbank übernommen. Das neue Feld ist aber nicht im an das Fluid-Template übergeben Array {news} enthalten. Ich benutze Typo3 4.7 und news 2.1.0

    Was mache ich falsch?

    viele Grüße
    Harald

  9. Hallo,
    das Tutorial funktioniert grundsätzlich gut, allerdings bei mir nur genau in der oben beschriebenen Konfiguration. Will ich ein weiteres Feld hinzufügen “seminar_date” und gebe das so NewsDefault.php an
    protected $seminarPlace;

    public function setSeminarPlace($seminarPlace) {
    $this->seminarPlace = $seminarPlace;
    }

    public function getSeminarPlace() {
    return $this->seminarPlace;
    }

    bekomme ich eine Fehlermeldung, sobald ich etwas in das Feld hineinschreibe.

    Genauer:

    Uncaught TYPO3 Exception
    #1251315967: Could not determine the child object type. (More information)

    TYPO3\CMS\Extbase\Persistence\Generic\Exception\UnexpectedTypeException thrown in file
    …/typo3/sysext/extbase/Classes/Persistence/Generic/Mapper/DataMapper.php in line 587.

    Ws mache ich da verkehrt?

    Beste Grüße
    Niklas

  10. Hallo,

    vielen Dank für die Anleitung. Ich versuche in TYPO3 Version 6.1.7 neue Felder hinzufügen, aber ich bekomme Fehlermeldung, sobald es sich um mehr als ein Feld handelt. Wenn ich nur ein Feld hinzufüge, funktioniert alles ohne Problem. Was mache ich falsch? Muss ich auf irgendetwas achten, wenn ich mehrere Felder hinzufüge?

    Beste Grüße,

  11. Das Problem beim Hinzufügen eines Feldes mit Fehlermeldung “#1251315967: Could not determine the child object type. (More information)” ist vermutlich zurückzuführen auf:

    http://forge.typo3.org/issues/56603

    Ein Leeren von cf_extbase_reflection hat mir hier ebenfalls geholfen.

    Was zumindest mir nicht klar war ist, dass die Klasse ebenfalls in NewsDefault.php gespeichert werden muss, da sonst die Generierung der Dateien in typo3temp/Cache/Code/cache_phpcode nicht funktioniert.

  12. Ertsmal Danke Rüdiger,

    ich habedie gleichen Probleme wie die anderen auch.
    Ein Feld klappt super, mehr als ein Feld führt zu der Fehlermeldung
    “Exception while property mapping at property path “”:Could not determine the child object type.”
    Alle Anleitungen die ich bis jetzt gefunden haben erweitern immer nur um ein Feld.

    Gibt es irgendwo eine Anleitung die mehr ale ein Feld hinzufügt?

    Viele Grüße,

    Bernd

  13. Hallo Rüdiger,

    ich habe gerade meinen Fehler gefunden, jede Variable muss Kommentiert werden.
    /**
    * @var string
    */
    protected $fbDachzeile;
    /**
    * @var string
    */
    protected $fbAusgabe;

    Vielleicht hifts ja jemanden.

    Viele Grüße,

    Bernd

  14. Herzlichen Dank für das Tutorial. Leider kann ich über das Template item.html (Partials) nicht das neuangelegte Feld ausgeben lassen. Es wird im Frontend nicht angezeigt. Im Backend ist das Feld sichtbar und kann beschrieben und gespeichert werden. Muss ich die neuen Felder für das Frontend noch bekanntgeben? Wo liegt mein Fehler?
    Herzlichen Dank, Anne

  15. Hallo Rüdiger,

    der Eintrag hier ist zwar schon etwas älter, dennoch hat er mir sehr geholfen. Danke dafür!

    Allerdings habe ich nun noch ein weiteres Problem.
    Und zwar kennt die news Extension ja verschiedene Typen (News, Internal Page, External Page). Wenn ich den Typ “External Page” auswähle wird der Editor für den Bodytext ausgeblendet. In meinem RSS Feed möchte ich aber auch zu externen Seiten einen kleinen (über den Teasertext hinausgehenden) Text erstellen. Dafür müsste ich in meiner erweiterten News Extension die Werte im “types” Feld des Arrays ändern. (Das Original liegt in der Original News Extension news/Configuration/Tca/news.php ca. Zeile 518ff)

    Hab ich die Möglichkeit diesen Wert nur für den Type 2 (external page) über ext_tables.php in meiner News Extension zu überschreiben?
    Ich steh hier grad echt auf dem Schlauch und habe keinen Schimmer wie ich das anstellen könnte.

    Viele Grüße,
    Michael

  16. Hallo Rüdiger,

    vielen Dank für das lehrreiche Tutorial. Ich habe vor, unter TYPO3 6.2 die tx_news zu erweitern. Daher die Frage, ob es sich am Vorgehen, das Du beschrieben hast, etwas ändert?

    Viele Grüße
    Igor

Hinterlasse eine Antwort

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

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>