Ergebnis 1 bis 16 von 16

Thema: Ein besseres "Anzeigen in" für Artikel

  1. #1
    Contao-Fan Avatar von deerwood
    Registriert seit
    24.11.2009.
    Ort
    Hamburg
    Beiträge
    344

    Standard Ein besseres "Anzeigen in" für Artikel

    Hallo liebe Entwickler,

    ich möchte gern Redakteuren beim Anlegen/Bearbeiten von Artikeln nur die Bereiche zur Auswahl anbieten, die auch im Layout der Seite für Artikel vorgesehen sind. Für die Historie bzw. weitere Argumente seht bitte diesen Forum-Thread und dies Ticket.

    Also habe ich mich auf den Hosenboden gesetzt und eine Erweiterung zz_betterdisplayin geschrieben (siehe auch unten), die das tut. Für mich recht aufwändig/zeitintensiv, weil ich als Neuling ja ziemlich viel forschen musste. Aber das Ergebnis ist dann doch recht simpel/überschaubar und tut es für mich (TL 2.7.5 mit wenigen anderen Erweiterungen).

    Für Artikel mit korrekter Platzierung sieht das dann etwa so aus:



    Falls der Artikel bereits falsch platziert ist, dann sieht das so aus:



    Eine falsche Platzierung kann mehrere Gründe haben:
    • die Erweiterung war noch nicht installiert
    • ein Artikel wurde aus einer Seite mit Layout X in eine Seite mit Layout Y verschoben
    • das Layout selbst wurde verändert


    Was mir Sorgen macht ist Leos Antwort
    You are not the first one to request this and it is still not possible I'm afraid.
    sprich, ich befürchte, dass ich etwas Entscheidendes übersehen habe.

    Ich fände es toll, wenn Ihr einmal den Code besichtigt und mir Rückkopplung gebt, was ich wohl übersehen haben mag. Einige Schwächen kenne ich schon jetzt:
    • die spezielle Markierung von falsch platzierten Artikeln wird erst sichtbar, wenn man den Artikel selbst bearbeitet. In allen Listenanzeigen usw. wird nicht darauf hingewiesen.
    • es wird Erweiterungen geben, die selbst auch an der Platzierung drehen (etwa 'boxes').

    Falls Ihr den Code eines Tests würdig befindet, würde ich mich natürlich sehr freuen, wenn Ihr ihn erprobt und mir Hinweise gebt, wo er nicht funktioniert bzw. mit welchen Erweiterungen er nicht zusammen spielt.

    Die Erweiterung ändert NICHTS an der Datenbank, sondern nur die Anzeige im Backend-Artikel-Formular ... falls sie also nicht funktioniert, kann man sie entweder einfach abschalten (Einstellungen) oder schlicht vom System löschen und alles sollte unverändert sein.

    Hier der wesentliche Code:
    PHP-Code:
    /* ..../dca/tl_article.php */
    // Replace 'options' with 'options_callback'.
    unset($GLOBALS['TL_DCA']['tl_article']['fields']['inColumn']['options']);
    $GLOBALS['TL_DCA']['tl_article']['fields']['inColumn']['options_callback'] =
        array(
    'BetterDisplayIn''getAvailablePageSections'); 
    PHP-Code:
    /**
     * ....
     * The code here is, intentionally, very verbose, spread out over several
     * lines and has intermediate variables one normally wouldn't need. This is so,
     * ....
     */
    class BetterDisplayIn extends Backend {

        
    /**
         * Constructor (is it needed as public method?)
         */
        
    public function __construct() {
            
    parent::__construct();
        }

        
    /**
         * Returns the page sections available for a page as of it's assigned layout.
         *
         * @return array
         */
        
    public function getAvailablePageSections() {
            
    // Get all page sections the same way TYPOlight normally does.
            
    $resultSections $this->getPageSections();

            
    // Get the article id worked on.
            
    $this->import('Input');
            
    $articleId $this->Input->get('id');

            
    // Get the page object for the article at hand,
            // so that we later can know the page layout.
            
    $this->import('Database');
            
    $query '
                SELECT  pid, inColumn
                FROM    tl_article
                WHERE   id = ?
            '
    ;
            
    $objResult $this->Database
                
    ->prepare($query)
                ->
    limit(1)
                ->
    execute($articleId);
            if (
    $objResult->numRows 1) {
                return 
    $resultSections;
            }

            
    // Remember the current column, in case it is not in layout of the page.
            // This can e.g. happen, when the article was moved from a page with one
            // layout to a page with a different layout.
            
    $inColumn $objResult->inColumn;

            
    // Get the page object by calling a TL method.
            // This is essential, because not every page has it's own layout,
            // but inherits it from a parent page.
            
    $objPage $this->getPageDetails($objResult->pid);

            
    // Get the modules array from the pages layout.
            
    $query '
                SELECT  modules
                FROM    tl_layout
                WHERE   id = ?
            '
    ;
            
    $objLayout $this->Database
                
    ->prepare($query)
                ->
    limit(1)
                ->
    execute($objPage->layout);
            
    $modules deserialize($objLayout->modules);

            
    // Get the allowed sections for articles from the modules array.
            
    $allowedSections = array();
            foreach (
    $modules as $v) {
                if (
    $v['mod'] == 0) {
                    
    // Article module has id 0 (not in DB)
                    
    $allowedSections[] = $v['col'];
                }
            }
            
    $resultSections $allowedSections;

            
    // Handle the case, that the article is not in the allowed sections.
            // Then add a note to the label of the select box.
            
    if (! in_array($inColumn$allowedSections)) {
                
    $allowedSections[] = $inColumn;
                
    // Must change the result array from numeric to assoc to add the note.
                
    $resultSections = array();
                foreach (
    $allowedSections as $section) {
                    
    $resultSections[$section] = (
                        isset(
    $GLOBALS['TL_LANG']['tl_article'][$section])
                        ? 
    $GLOBALS['TL_LANG']['tl_article'][$section]
                        : 
    $section
                    
    );
                    if (
    $section == $inColumn) {
                        
    // Add the note.
                        
    $resultSections[$section] .= $GLOBALS['TL_LANG']['MSC']['section_not_in_layout'];
                    }
                }
            }

            return 
    $resultSections;
        }

    Zum Testen siehe Link unten, gepackt wie für das Repository erforderlich, aber noch ohne 'package.xml'.

    Danke für Eure Zeit,
    Liebe Grüße, Georg
    Angehängte Grafiken Angehängte Grafiken
    Angehängte Dateien Angehängte Dateien

  2. #2
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.622
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hallo Georg,

    Sieht sehr gut aus. Ich behaupte nun einfach mal die Aussage von Leo war nicht richtig, sondern nur eine ausrede... Dass das möglich ist ist klar, allerdings fraglich ob das im Core sinn macht, da es doch einige DB-Abfragen erzwingt (schätze mal 10 im Durchschnitt).

    Was du noch beachten solltest, ich bin nicht sicher ob $objPage->layout immer einen Wert hat, ggf. nicht und dann müsstest du das Default-Layout nehmen.

    Drei kleine Dinge würde ich noch ändern:
    • Input und Database musst du nicht importieren, das wird in der __construct()-Funktion der Backend-Klasse bereits gemacht.
    • Für die "nicht vorhandene" Spalte würde ich ein sprintf() nehmen, das ist flexibler für andere Sprachen.
    • Anstelle von $this->Input->get('id') für den Artikel solltest du das erste Argument $dc für die Funktion setzen und dann $dc->id verwenden.


    Teste unbedingt auch noch wie es bei Mehrfach-Bearbeitung funktioniert!
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  3. #3
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    894

    Standard

    Vielen Dank für die Mühe! Sieht wirklich gut aus und werde ich - wenn ich es schaffe - heute noch testen. Ich melde mich dann noch mal.

    @andreas: Ein paar mehr Datenbankabfragen im Backend sind wohl nicht so tragisch. Ich denke also schon, dass das auf jeden Fall ein Kandidat für den Core ist.

    Gruß
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

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

    Standard

    Tolle Idee, werd ich evtl. gerade bei einem aktuellen Projekt ganz gut gebrauchen können.

    Schöne und wie man an Andy's wenigen Korrekturtipps erkennen kann, sehr saubere Arbeit!
    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-Fan Avatar von okapi
    Registriert seit
    03.09.2009.
    Ort
    Wien
    Beiträge
    251

    Standard

    Hallo Georg,
    toll, dass du dich der Sache angenommen hast! Für mich funktioniert deine Erweiterung genau wie sie soll, auch mit eigenen Layoutbereichen, und selbst wenn man das TYPOlight Framework gar nicht nutzt und im Template ausschließlich CustomSections definiert hat. Vielen Dank!
    Vielleicht findet diese Funktion ja doch Eingang in den Core. Ich finde, dass die in den Artikeleinstellungen angebotenen Layoutbereiche exakt die Einstellungen des Seitenlayouts widerspiegeln müssen. Das ist eigentlich kein extra Feature, sondern eine Notwendigkeit für die Redakteure.

    Für die, die wie ich zunächst nicht wissen, wie man Erweiterungen, die nicht im Repository sind, "manuell" installiert: https://contao.org/board/topic/9532.html (Bei dieser Erweiterung ist der Aufruf des Install-Tools übrigens nicht notwendig, da keine Datenbankänderungen notwendig sind).

    Gruß
    Michael

  6. #6
    Contao-Hauptentwickler
    AG Core-Entwicklung
    Avatar von leo
    Registriert seit
    05.06.2009.
    Ort
    Wuppertal
    Beiträge
    816

    Standard

    Zitat Zitat von andreas.schempp Beitrag anzeigen
    die Aussage von Leo war nicht richtig, sondern nur eine ausrede...
    Ich wüsste nicht, wieso ich generell Ausreden bräuchte. Natürlich ist es technisch möglich, aber angesichts des immensen Aufwands nur wenig sinnvoll. Der Code ist schon jetzt ziemlich umfangreich und beinhaltet etliche DB-Abfragen, wobei die Mehrfach-Bearbeitung und eigene Layoutbereiche noch gar nicht vollständig berücksichtigt sind. Zudem unterstützt diese Lösung keine dynamischen Layoutbereiche (z.B. zeige die rechte Spalte nur, wenn es einen Artikel gibt).

    Insofern hätte ich vielleicht sagen sollen "es ist nicht mit vertretbarem technischen Aufwand möglich". Aber jetzt gibt es ja eh eine Erweiterung, also ist das Thema erledigt

  7. #7
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.622
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hallo Leo,

    Das meinte ich. Für Laien ist die einfachere Erklärung "es geht nicht" als "es ist aufwändig und darum machen wir es nicht". Das Ergebnis ist dasselbe, aber die zweite Variante verlangt immer Erklärungen. Kenn ich selber, mach ich manchmal auch so
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  8. #8
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    894

    Standard

    Ich verstehe jetzt leider nicht, warum der Aufwand „nur wenig sinnvoll“ sein soll. Es hat sich doch deutlich gezeigt, dass dieses „Feature“ ziemlich wichtig ist, damit Redakteure keine unnötigen und nicht verfügbare Layoutbereiche auswählen können. Wenn das nicht sinnvoll ist, was denn dann?

    Aufgrund der von Georg schon angesprochenen Probleme mit anderen Erweiterungen denke ich auch, dass diese Funktionalität auch möglichst in den Core implementiert werden sollte und nicht nur als Erweiterung vorliegen solle. Zusätzliche Datenbankanfragen sind im Backend auch eher zu verkraften, als im Frontend. Wenn die Artikelansicht im BE dadurch eine Millisekunde (das ist schon sehr hoch gegriffen) langsamer erscheint, geht die Welt nicht unter.

    Gruß
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

  9. #9
    Contao Core-Team
    Association Vorstand
    Avatar von andreas.schempp
    Registriert seit
    15.06.2009.
    Ort
    Lyss
    Beiträge
    5.622
    Partner-ID
    8667
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Die Entscheidung liegt allerdings bei Leo, und die hast du ja schon gehört
    Eine Erweiterung ist also der richtige Weg.
    terminal42 gmbh
    Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
    Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle

  10. #10
    Administrator Avatar von Nina
    Registriert seit
    04.06.2009.
    Ort
    Hamburg
    Beiträge
    4.755
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Mir ist es wichtig dass der Backend-Core so umfangreich wie nötig und gleichzeitig so schlank wie möglich bleibt. In diesem Fall unterstütze ich daher ganz klar Leos Sicht.

    Im Grunde verlangen wir hier von Redakteuren doch nichts anderes als normalen Hausverstand. Wenn sie etwas neu anlegen, sollten sie auch im Frontend schauen, was daraus geworden ist. Wenn da etwas nicht passt, sollten sie in der Lage sein im Backend mit wenigen Blicken zu sehen, wo der Irrtum liegt.

    Ich gebe deshalb Redakteuren auch immer eine ausführliche Schulung wie sie etwaige Handhabungsfehler leicht identifizieren und beheben können. In der Listenübersicht steht doch klar, wo ein Artikel abgelegt wurde. Entsprechend einfach können sie schon per "TL-Default" in der Artikelübersicht erkennen, dass sie etwas falsch abgelegt haben. Der Schlüssel liegt hier in der klaren Kommunikation zwischen Admin und Redakteuren: Er muss den Redakteuren mitteilen welche Spalten für sie offen sind. Bei komplexen Webseiten mit vielen Layout-Varianten empfehle ich dafür das Anlegen eines kleinen Mini-Styleguides. Darin kann der Admin auch z. B. gleich noch vermerken, welche CSS-Klassen er den Redakteuren für ihre Arbeit im WYSIWYG zur Verfügung stellt und wie man diese optimal einsetzt.

    Versteht mich nicht falsch, diese Extension hilft einigen Redakteuren sicher, aber für die Masse ist das imho nicht relevant. Die wirklich breite Masse der Nutzer braucht wahrscheinlich nichtmal groß weitere Artikelbereiche neben der Hauptspalte. Sie kommen also sowieso nicht in die Verlegenheit einen Artikel mal falsch verschoben zu haben.

    Ich sehe das auch als typische gute Extension die prima im Extension Repository aufgehoben ist. Jeder der meint, dass seine Redakteure sowas brauchen, kann sie darüber installieren.

  11. #11
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    894

    Standard

    Tja, da gehen die Meinungen und Erfahrungen wohl ziemlich auseinander. Nach meiner Erfahrung machen Nutzer grundsätzlich alles falsch, was irgendwie falsch zu machen geht. Da kann man es ihnen noch so oft vorpredigen und ihnen schriftliche Anweisungen geben.

    Wie man an der kleinen Erweiterung sieht, ist der Aufwand im Backend ja auch nicht wirklich so gewaltig und vielleicht schneller zu erledigen, als hier die Forenpost zu lesen.

    Aber egal, Leo entscheidet halt, was in den Core kommt und was nicht und das muss man dann akzeptieren.

    Gruß
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

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

    Standard

    @netspy: Wenn deine Kunden sich verklicken (jaja das wissen wir, das machen viele ) kannst du ja die Erweiterung installieren. Für das ist sie ja da

    Ich finde auch, dass es nicht zwingend in den Core gehört, obwohl sich hier sicher die Frage eher stellt als bei anderen Erweiterungen. Von daher kann ich beide Seiten verstehen
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  13. #13
    Contao-Fan Avatar von deerwood
    Registriert seit
    24.11.2009.
    Ort
    Hamburg
    Beiträge
    344

    Standard

    Moin alle,

    zunächst herzlichen Dank für das positive Feedback und vor allem für die Hinweise, was ich besser machen sollte bzw. was ich alles übersehen habe.

    Ich selbst neige auch zu einem schlanken Kern und Zusatzfunktionen ausgelagert in Erweiterungen. Es sei denn, die Funktionalität dieser Erweiterung könnte "on the fly" nebenher erledigt werden, wenn der TL Kern das Formular für einen Artikel erzeugt, also mit deutlich weniger SQL Statements, als jetzt mittels Erweiterung.

    Aber Nina hat schon recht, die meisten Sites benötigen dies Feature wohl nicht. Und wer es haben will, kann sich die Erweiterung installieren. 100 Millisekunden mehr bzw. 10 oder so SQL Statements im Backend, die ja nur fällig werden, wenn man den Artikel selbst bearbeitet (nicht seine Inhalte) halte ich dagegen für sehr vertretbar. Hier mal ein extremes Scenario/Usecase mit mehreren Layouts. Allein die Auswahl des Redakteurs zur Platzierung (vor allem bei "Neuer Artikel" nötig) wird mehr als 1 Sekunde dauern:

    • Klick für aufklappen
    • Nachdenken/Erinnern, welche Layoutbereiche eigentlich erlaubt sind
      • eventuell sogar die Hinweise für Redakteure nachlesen
      • dann eventuell unsicher sein "in welchem Zweig der Site bin ich denn gerade" (weil ja der Seitenbaum nicht mehr sichtbar ist), dann "Zurück" (mit Verlust aller bisher eingegebener Daten), bis man den Seitenbaum wieder sieht,
      • wieder vor bis zum Artikel
      • verlorene Daten erneut eingeben
      • Aufklappen der Platzierung
    • Maus bewegen bis zur richtigen Auswahl
    • Klicken
    • Kontrollieren, ob der Artikel an der richtigen Stelle ist ... aber, hmpff, die Seite existiert, der Artikel existiert, aber er hat ja noch keine Inhalte, also wird sowieso nichts angezeigt
    • Test-Inhalt anlegen ... usw.

    Das ist eben auch Useability ... und die Äußerungen eines Redakteurs, der das z.B. mit einem Screenreader und einer Braille-Tastatur durchmachen muss, möchte ich nicht hören.

    Aber, wie gesagt, man kann ja die Erweiterung installieren, falls erforderlich. BITTE keinen Streit hier in diesem Thread! Ich habe mehr als genug argumentiert und werde auf keinen Streit eingehen.

    Vielmehr würde ich gern diese Erweiterung so gut machen, dass sie mit zumindest allen bereits existierenden Erweiterungen zusammen einsetzbar ist. Das "zz_" im Verzeichnisnamen deutet ja schon an, dass sie möglichst nach allen anderen Erweiterungen geladen wird, die an der Platzierung "drehen", so dass sie, nach und nach, auch an solche Erweiterungen adaptiert werden kann.

    Als Neuling kenne ich bisher aber wirklich nur die wenigsten Erweiterungen, ich bitte also um Hinweise (möglichst mit Link auf die Erweiterung im Repository), die ich berücksichtigen sollte.

    Zu meinen "Hausaufgaben":

    besonderen Dank an Andreas, Du hast in allen Punkten recht und Deine Antwort motiviert mich sehr, etwas "Richtiges" zu machen (Deine Erweiterungen sind jedenfalls auch immer eine Inspiration und zeigen das ungeheure Potential, das in TL steckt). Den Parameter $dc z.B. hatte ich, vor lauter Code-Inspektion, völlig übersehen. Und, ja, getPageDetails() kann tatsächlich eine ungesetzte layout id liefern, dann muss ich direkt auf das Default Layout zugreifen. Gibt es das, auch im Multi-Domain-Betrieb, nur einmal? sprintf ist natürlich viel besser und unnötige Imports werde ich ausbauen. Und die Mehrfach-Bearbeitung habe ich tatsächlich bisher völlig ignoriert (wie auch Artikel/Teaser als Inhaltselemente, keine Ahnung, was mich da eventuell noch erwartet).

    Leos Hinweise auf eigene bzw. dynamische Layoutbereiche verstehe ich leider noch nicht, da kann ich sicher Hilfe gebrauchen.

    LG, Georg

  14. #14
    Contao-Fan Avatar von okapi
    Registriert seit
    03.09.2009.
    Ort
    Wien
    Beiträge
    251

    Standard

    Hallo Georg,

    ich fände es toll, wenn deine Erweiterung den Weg ins Repository fände!

    Gruß
    Michael

  15. #15
    Contao-Fan Avatar von deerwood
    Registriert seit
    24.11.2009.
    Ort
    Hamburg
    Beiträge
    344

    Standard

    Hi Michael,

    Zitat Zitat von okapi Beitrag anzeigen
    ich fände es toll, wenn deine Erweiterung den Weg ins Repository fände!
    Mache ich, sobald ich wieder etwas Zeit, meine Hausaufgaben gemacht und mehr getestet habe.

    LG, Georg

  16. #16
    Contao-Nutzer
    Registriert seit
    23.01.2011.
    Beiträge
    35

    Standard

    I could not find this extension in the ER. So I changed the things that Andreas suggests so this extension will work for all pages that use the default layout, translations are a bit more flexible and the code is cleaned up a bit. I also changed the style so it matches the coding standards for Contao better. Finally I've added a Dutch translation.

    I tested with 2.10.3 only. Hoping it will be useful to anyone.
    Angehängte Dateien Angehängte Dateien
    Geändert von Ruud (06.12.2011 um 10:24 Uhr)

Aktive Benutzer

Aktive Benutzer

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

Ähnliche Themen

  1. Artikel "Anzeigen in" Fusszeile / Kopfzeile wie?
    Von zorin1st im Forum Sonstiges zu Contao
    Antworten: 4
    Letzter Beitrag: 15.11.2010, 15:36
  2. Artikel "Anzeigen in" Auswahl anpassen
    Von stefanh im Forum Sonstiges zu Contao
    Antworten: 1
    Letzter Beitrag: 27.03.2010, 00:13
  3. Artikel erst mit "mehr" komplett anzeigen (Akkordeon Effekt)?
    Von Cranker im Forum Allgemeine Inhaltselemente
    Antworten: 6
    Letzter Beitrag: 11.03.2010, 14:49
  4. Typolight Backend: Ansicht "Inhalte - Artikel", "Neue Aufgaben"
    Von althoffc im Forum Sonstiges zu Contao
    Antworten: 3
    Letzter Beitrag: 26.11.2009, 22:00
  5. Antworten: 2
    Letzter Beitrag: 07.11.2009, 18:24

Lesezeichen

Lesezeichen

Berechtigungen

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