Ergebnis 1 bis 9 von 9

Thema: Eigene Widget Klasse

  1. #1
    Contao-Nutzer Avatar von mekroth
    Registriert seit
    12.04.2010.
    Ort
    Bexbach / Saarland
    Beiträge
    15

    Standard Eigene Widget Klasse

    Hallo Community,

    ich möchte die Widget-Klasse um eigene Funktionen erweitern. Sie soll von allen im DCA angelegten inputTypen/Feldern genutzt werden.

    Wenn ich z.B. im DCA ein Textfeld habe, dieses ein weiteres Property zuweise wie z.B.
    Code:
    'translation' => true
    auch verarbeitet wird ohne das ich für jedes Feld ein Callback hizufügen muss. Was ich also brauche ist... Ich müsste die Methode

    Code:
    abstract class Widget extends Controller
    {
       ...
       ...
    
    	/**
    	 * Set a parameter
    	 * @param string
    	 * @param mixed
    	 * @throws Exception
    	 */
    	public function __set($strKey, $varValue)
    	{
    in der /system/libraries/Widget.php durch meine eigene ersetzen. Ist das möglich ohne das ich in der orginalen Widget Klasse was ändern muss?
    oder gibt es noch eine andere Möglichkeit?

    Hoffe ihr versteht was ich machen möchte...


    Vielen Dank...

    Mario

  2. #2
    Contao-Fan Avatar von Bandyt
    Registriert seit
    22.04.2010.
    Ort
    Bremen
    Beiträge
    808

    Standard

    Dein Widget erweitert doch die Klasse Widget. Dort kannst du auch die Funktion __set überschreiben.
    Meine Erweiterungen: League Manager | Forum

  3. #3
    Contao-Nutzer Avatar von mekroth
    Registriert seit
    12.04.2010.
    Ort
    Bexbach / Saarland
    Beiträge
    15

    Standard

    Hallo Bandyt,

    ja... das ist mir schon klar... Aber ich möchte ja nicht das nur mein Widget die Klasse erweitert... Sondern das alle Widgets (text, dropdown usw.) denen ich
    ein Property... Sagen wir mal 'extraField' => true meine eigene Widget-Klasse nutzt.

    Beim Yii-Framework geht das ganz einfach... Da kann man alle Core-Klassen durch eigene ersetzen bzw. erweitern... Das ganze geht über
    ein Configurations-Array indem man einfach der Core-Componente (Klasse) die eigene zuweisen kann.

    Gibt es nicht etwas in der Art:

    Code:
    $GLOBALS['BE']['CORECLASS']['Widget'] = 'MyWidget' ?
    
    Yii:
    
    array(
       'components' => array(
           'widget'       => array(
              'class'        => 'myWidgetClass'
           )
       )
    )


    Sonnige Grüße,

    Mario

  4. #4
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Nein, das geht leider in Contao nicht.

    Bzw. nicht schön Es gibt eine updatesichere initconfig.php

    Da könntest Du deine eigene Widget-Klasse includen und allenfalls die Originalklasse löschen lassen.
    Die initconfig.php greift vor der eigentlichen Initialisierung des Systems.

    Wirklich ugly, aber mir fällt sonst nix ein
    Hoffe es hilft dir trotzdem
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  5. #5
    Contao-Nutzer Avatar von mekroth
    Registriert seit
    12.04.2010.
    Ort
    Bexbach / Saarland
    Beiträge
    15

    Computer

    Hallo Toflar...

    ja... das mit der "initconfig" hat funktioniert . Hintergrund war das ich ein bestehendes Projekt auf Contao umsetzen möchte http://deal4you.es
    Das Projekt habe ich mit dem Yii-Framework erstellt darum würde es mir auch sehr gefallen wenn
    Contao 3 das Yii-Framework nutzen würde.

    Wie gesagt ging es mir darum mit wenig aufwand im Backend Gutscheine usw. Mehrsprachig zu erfassen ohne für die jeweilige Sprache einen neuen Datensatz anlegen zu müssen.

    Die Widget-Klasse von Contao habe ich durch meine eigene ersetzt... Die Mehrsprachigen Inhalte werden als serialisiertes Array in einem Feld (name=translation, type = text)
    der Tabelle gespeichert.

    DCA:

    Code:
            'title' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_deal_coupons']['title'],
                'exclude'                 => true,
                'inputType'               => 'text',
                'eval'                    => array(
                    'mandatory'=>true,
                    'maxlength'=>10,
                    'tl_class'=>'w50',
                    'translation' => true,
                ),
            ),
            'sub_title' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_deal_coupons']['sub_title'],
                'exclude'                 => true,
                'inputType'               => 'text',
                'eval'                    => array('mandatory'=>true, 'maxlength'=>255, 'tl_class'=>'w50', 
                     'translation' => true
                ),
            ),
            'short_description' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_deal_coupons']['short_description'],
                'exclude'                 => true,
                'inputType'               => 'text',
                'eval'                    => array('mandatory'=>true, 'maxlength'=>255, 'tl_class'=>'long clr', 
                     'translation' => true
                ),
            ),
            'long_description' => array
            (
                'label'                   => &$GLOBALS['TL_LANG']['tl_deal_coupons']['long_description'],
                'exclude'                 => true,
                'inputType'               => 'textarea',
                'eval'                    => array('tl_class'=>'long clr', 
                    'translation' => true
                ),
            ),
            'options'           => array(
                'label'                   => &$GLOBALS['TL_LANG']['tl_deal_clients']['street2'],
                'exclude'                 => true,
                'inputType'               => 'optionWizard',
                'eval'                    => array('mandatory'=>true, 'maxlength'=>255, 'tl_class'=>'long clr', 
                    'translation' => true
                ),
            )
    Man muss sich um nichts mehr kümmern... Ein klick auf die Flagge (grau = Übersetzung fehlt, farbig = Übersetzung vorhanden) und das übersetzende
    Textfeld/Options/usw (Alle Widgets werden unterstüzt) öffnet sich.

    Sollte Interesse bestehen könnte die Widget-Klasse in den Core übernommen werden.
    Angehängte Grafiken Angehängte Grafiken

  6. #6
    AG Core-Entwicklung
    Registriert seit
    16.10.2009.
    Ort
    Bad Lausick
    Beiträge
    437

    Standard

    Die Art wie die mehrsprachigen Inhalte gespeichert werden, wird das wahrscheinlich nicht zulassen, das deine Klasse in den Core übernommen wird.
    Sauberer wäre es mMn. wenn du mit dem Hook "loadDataContainer", sowie den DCA Callbacks "onload_callback", "onsubmit_callback", "save_callback" und/oder "load_callback" arbeitest. (ACHTUNG "save_callback" sollte KEINE veränderungen in der DB vornehmen, das sollte erst in der "onsubmit_callback" geschehen). Dann kannst du die Ganze als Extension einstellen und bist updatesicher.
    Ihr Partner für Contao und Webentwicklung: http://www.hofff.com.

  7. #7
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Eine weitere Art wie Du das lösen könntest wäre mit einem eigenen DC Driver. Siehe Isotope.

    Allerdings wäre es da mal an der Zeit, dass wir Entwickler zusammen an einer gemeinsamen DC Driver Lösung arbeiten würden, die Mehrsprachigkeit unterstützt
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  8. #8
    Contao-Nutzer Avatar von mekroth
    Registriert seit
    12.04.2010.
    Ort
    Bexbach / Saarland
    Beiträge
    15

    Standard

    Hallo backbone und Toflar,

    die Widget-Klasse macht nichts anderes sie schaut nur welche Sprachen vorhanden sind und generiert die
    Flagen im Label sowie die Platzhalter für die Felder die dann per Ajax bei Klick auf die Flagge gefüllt werden.

    Beim on-submit wird die Validierung ausgeführt, sind keine Fehler vorhanden und alle Pflichtfelder ausgefüllt
    dann wird gespeichert.

    Die Art wie die Daten gespeichert werden ist so ganz ok für mich im Moment, In Yii habe ich dafür eine
    extra Tabelle und ne ActiveRecord Classe geschrieben die das automatisch übernimmt, aber für Contao und
    die Art wie die Daten der Wizards gespeichert werden (Als serialisiertes Array fand ich es als die einfachste
    und schnellste Lösung)

    Mit den Callbacks die Du mir beschreibst kann man das nicht so einfach lösen...

    DC-Driver habe ich mir auch schon angeschaut und auch einen Angefangen zu programmieren damit man bei
    der Auflistung der Datensätze mit $dc->translationComplete() den Status der Übersetzungen anzeigen
    lassen kann.

    Ja... Vielleicht sollte man sich wirklich mal ran setzen um eine saubere Lösung für die Mehrsprachigkeit zu
    bekommen...


    Grüße,

    Mario


    PS: Ich schau mir mal Isotope an

  9. #9
    AG Core-Entwicklung
    Registriert seit
    16.10.2009.
    Ort
    Bad Lausick
    Beiträge
    437

    Standard

    Imho, lohnt sich nicht vor Contao3 die DC_Table in einer umfassenderen Überarbeitung anzugehen und in Contao3 wird es die DC_Table an sich *wahrscheinlich* nicht mehr geben. Also sollte man sich auf die Weiterentwicklung/Konsolidierung der vorhandenen Alternativen (DC_Memory, backboneit_dctableextended und die Anwendungsspezifischen Treiber von isotope, catalog & Co.) konzentrieren.
    Ihr Partner für Contao und Webentwicklung: http://www.hofff.com.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •