Beiträge von bembelimen

    Gibt es hierzu einen Link um sich das vorher Mal anzuschauen?

    Haben mir also nicht weitergeholfen bei meiner Suche, was es damit auf sich hat:

    Beim Freischalten eines Users + Direktlogin gibt es bei einem "onUserAfterSave" ein Problem: man weiß nicht, wie der vorherige Status ist, bevor der User gespeichert wurde.


    Explizit beim Freischalten des Users muss folgendes Kriterium erfüllt sein:


    PHP: plugin.php
    public function onUserBeforeSave($user, $isNew, $data)
    {
    if (Factory::getUser()->guest && $this->app->isClient('site') && !$isNew && $user['block'] && strlen($user['activation']) && !$data['block'] && !strlen($data['activation']))
    {
    $this->loggin = (int) $user['id'];
    }
    }

    Der User darf nicht neu sein, er muss vorher geblockt mit Activation-Token sein und hinterher muss er freigeschalten ohne Token sein (natürlich nur im Frontend).

    Ansonsten könnte es ein anderer Vorgang als Freischalten sein (Profil speichern, PW zurücksetzen, etc.). Diese Statusänderung erkennt man nur wenn man before/after vergleicht.


    Im After dann Permissions-Check (darf der User sich überhaupt einloggen), ist er in der loggin-Variable, ist er nun wirklich freigeschalten, etc. Dann wird er eingeloggt.


    Natürlich könnte man auch auf Views und Tasks checken, aber davon bin ich kein wirklicher Freund, da ich teilweise auch meine eigene Komponente drüber stülpe, die mehr "Intelligenz" hat und ich bin mir dann nicht sicher, ob die Konvertierung von Token + Block zu kein Token, kein Block wirklich stattgefunden hat.


    Für eine Registrierung ohne Freischaltung ist das ganze natürlich eine andere Sache, da brauchts diese ganzen Checks nicht. (und auch das $isNew wird anders genutzt)

    Wie bekomme ich das hin?

    Mit einem Plugin sollte das kein Problem sein, zumindest habe ich es so umgesetzt, dass ein User, der sich freischaltet direkt eingeloggt ist.


    onUserBeforeSave wird gecheckt, ob die Begebenheiten die gewünschten sind (Registrierung, Frontend, Freischaltung etc.) und in onUserAfterSave wird für den User die Session gesetzt und er somit eingeloggt.

    geht sogar kürzer:


    Code
    $menu->getActive()->home // 1 = Startseite, 0 = alles andere

    Weil nicht immer ist der Default, der Default den man erwartet (Mehrsprachigkeit)


    Aber der elegante Weg wäre eher über Module zu gehen. Du packst an die Stelle eine Modulposition und kannst dann darauf Module anhand den Menüpunkten ein und ausblenden.

    Es gibt nun hier mehrere Möglichkeiten:
    - eine ziemlich billige

    - die richtige


    Die Billige

    Formular A sieht so aus:

    Code
    <form action="link-zu-form-2" method="GET">
        <select name="layout" id="xxx">
            <option value="option1">Option 1</option>
        </select>
    </form>

    Nun entweder für Formular 2 je Option ein layout anlegen (die dateien in dem tmpl Order) und per JS den Link zusammenbasteln und als IFrame im Modal öffnen: index.php?option=com_xxx&view=yyy&layout=zzz


    Oder das Formular schon auf der Seite haben und dann per JS Event den Wert setzen:

    Code
    jQuery('#myselect').on('change', function()
    {
        jQuery('#target).val(jQuery(this).val());
    });


    Die Richtige

    Du solltest den Joomla!-Standard mit XML-generierten Formulare verwenden. Dort gibt es dann im Model eine getForm und loadFormData-Methode. Letztere kannst du dann verwenden um Werte für das Formular vorzubelegen.

    Der Nutzer wählt die Sprache nicht selbst aus, die kannst du per URL-Parameter selbst mitgeben (basierend auf die Backendsprache). Der Nutzer sollte nie direkt auf einen Artikel gehen, der bleibt immer in der Kategorieansicht, denn dort werden nur die Artikel der übergebenen Sprache angezeigt.

    Ich würde ja für jede Hilfsseite eine Kategorie (Typ: Blog, Sprache: all) anlegen und darin dann alle Übersetzungen der Hilfe reinwerfen. Dann hast du keine Hard-Coded IDs auf Artikel und kannst ohne Probleme weitere Artikel und Sprachen dazu packen. In der Hilfe verlinkst du einfach auf die Kategorie (und kannst eventuell noch den Language-Tag direkt mitgeben).


    Die Korrekte Sprache bekommst du so: https://github.com/joomla/joom…joomla/joomla.php#L82-L83

    Hallo Petris,


    ich würde dir an dieser Stelle zu einem kleinen Plugin empfehlen. Es gibt unmengen an SMS-Anbieter, über die du kostengünstig per Schnittstelle eine SMS versenden kannst. Den Code kannst du dann per (z.B.) Custom Field verwalten.


    In einem ähnlichen Szenario (aber anderen Seitenkontext) haben wir es zumindest so gelöst. Kunde bekommt SMS mit Link (und Code), kann auf den Link klicken und ist dann freigegeben.

    Ich kenne das Addon nicht und weiß nicht welche Schnittstellen es bietet (ich habe mir für AD eine eigene Erweiterung gebaut), aber einen Nutzer in eine Benutzergruppe zu schieben ist relativ einfach:

    PHP
    Joomla\CMS\User\UserHelper::addUserToGroup($userId, $groupId)

    Ganz dynamische Berechtigungen wirst du aber schwer umsetzen können, die Gruppen müssen vorher schon vorhanden sein*. Dann ist es ein Klacks hier hin und her zu schieben.


    Der Gegenweg ist folgender:

    PHP
    Joomla\CMS\User\UserHelper::removeUserFromGroup($userId, $groupId)


    Um die Berechtigungen immer frisch zu setzen, nimmst du:

    PHP
    Joomla\CMS\User\UserHelper::setUserGroups($userId, $groups)


    zu * : Das stimmt so natürlich nicht...theoretisch kannst du auch dynamisch eigene Gruppen "berechnen" und anlegen. Ich bin aber eher ein Fan davon Benutzergruppen hierachisch nach Funktion anzulegen und dann einfach entsprechend zuzuweisen:


    Und dann einfach die Kombination zuweisen.

    Ich gehe mal davon aus, dass du auch an komplexere Lösungen interessiert bist und diese umsetzen kannst, deshalb einfach mal ein paar Gedanken. Vielleicht kannst du damit was anfangen.

    1. Ein Artikel muss mehreren Kategorien zugeordnet werden können. Ich dachte, ich löse das über tags, momentan bekomme ich aber noch keine Ansicht gestatltet, die quasi Kategorien abbildet, die sich auf Basis mehrerer tags zusammensetzen.

    Ja das tagging ist die generelle Lösung dafür. Hier kommt es nun drauf an, wie umfangreich der Shop ist und insbesonders was für SEO-URLs du haben willst. Also ob die z.b. /shop/article-alias ausreicht oder ob du ganze Pfade haben willst: /shop/tag/subtag/article-alias.


    Bei Szenario 1 ist es relativ einfach:

    1. du erstellst eine Artikelkategorie "Shop"

    2. Alle Artikel wirfst du in diese Kategorie

    3. Artikel selbst taggst du nun wie es dir beliebt

    4. im Menu erstellst du verschiedene Menüpunkte, die alle ein Kategorieblog auf die "Shop"-Kategorie zeigen aber im Tag Filter dann entsprechend je nachdem, welche Artikel du angezeigt haben willst, die entsprechenden Tags aus.

    5. Du erstellst ein kleines Plugin, was den Router um eine Regel erweitert, sodass immer dein Hauptmenüpunkt als der aktive Menüpunkt in der Artikelansicht erscheint.


    Szenario 2 wird schon komplexer:

    Schritt 1-4. ist identisch, außer dass du bei 4. nun dein Menü so gestalten musst, dass du eine entsprechende URL-Struktur zusammen bekommst.

    Als letzten Schritt brauchst du wieder ein Plugin, was den Router erweitert, aber diesesmal musst du dem einiges an Pseudointelligenz mitgeben. Hier kann ich dir wenig helfen, aber du musst einfach entsprechend den verschiedenen URL-Parameter, je nachdem auf welchem Menüpunkt du bist die URL-Parameter des generierten Links basteln. (falls der Satz zu kompliziert war, musst du tief in das Routing eintauchen...)


    Hier bisschen Pseudocode für dein Plugin:



    2. Ein Artikel muss eine eindeutige Artikelnummer automatisch zugewiesen bekommen. Ich weiß nicht, wie ich die ins System/Datenbank bekomme.

    Ich könnte einfach die ID des Artikels verwenden, das wird nur problematisch, wenn der Shop langfristig zweisprachig ausgerichtet werden soll, da dann jeder Artikel eine eigene ID erhalten würde. Außerdem klingt es nach einer sehr unprofessionellen Lösung. Besser wäre natürlich, dafür ein eigenes Feld anzulegen

    Ja, einfaches custom Field, mit automatischer Generierung der Artikelnummer. (Kann dann beim Übersetzen übernommen werden).


    3. Die ID = Artikelnummer soll über die Suche gefunden werden. Dafür weiß ich noch gar keine Lösung. Selbst wenn ich die ID explizit in der URL mit anzeigen lassen, wird sie ja nicht indexiert/gesucht.

    Weiß gerade nicht, ob Joomla! die Custom Fields schon durchsucht, ansonsten kleines Suchplugin bauen, dürfte kein Rocket Science sein.


    4. Zudem wäre es schön, die Artikelnr. nach dem Erzeugen, in der Beitrags-Editor-Ansicht, z.B. in einem nicht editierbaren Feld mit auszugeben

    Das kannst du in den Permissions entsprechend einstellen.

    Außer den Raum zu organisieren (was du getan hast) und anwesend zu sein (was du scheinbar auch machen wirst), gibt es ja nicht viel was man als minimum machen muss.


    Worin siehst du das Problem, sodass du die Aufgabe nicht übernehmen kannst?