Wielowitryność i dodatkowe ustawienia wtyczek od dewelopera Chikurov-seo

Niestety, framework Web Systems Pro nie oferuje gotowego rozwiązania do dynamicznej zmiany ustawień wtyczek. Jednakże, ponieważ wielu właścicieli projektów internetowych ma kilka projektów na jednej instalacji, które często wymagają różnych ustawień, deweloperzy gotowych rozwiązań muszą sobie z tym radzić. Większość z nich ogranicza się do dodania w ustawieniach swojego produktu opcji select, w której można wybrać z listy witrynę i ręcznie ustawić dla niej oddzielne ustawienia, nazywając to multi witryną. My jednak poszliśmy o krok dalej i wdrożyliśmy pełną możliwość dostosowania ustawień we wszystkich naszych produktach.


Jak to działa?

Każda wtyczka ma swoje własne ustawienia, których wybrane wartości wpływają na funkcjonalność wtyczek. Najprostsze ustawienie to $settings.enabled — „Status wtyczki”. Może ono być albo WŁ., albo WYŁ. (albo „1”, albo „0”). Załóżmy, że przykładowa wtyczka o identyfikatorze „showsomething” coś implementuje na stronie produktu na części użytkownika witryny. Gdy tylko wywołana zostaje jej funkcja (przez pomocnika lub przez hak), najpierw sprawdza wartość ustawienia $settings.enabled i jeśli „widzi” wartość == „1”, to kontynuuje wykonywanie swojego kodu, a jeśli „widzi” wartość == „0”, to zatrzymuje się i nic nie implementuje na stronie produktu.

Ale przed wami stoi zadanie modyfikacji tej logiki. Załóżmy, że macie dwie witryny na jednej instalacji, pierwsza witryna ma adres: mysite.pl, a druga: mysite.com. Co zrobić, jeśli chcecie, aby wtyczka „showsomething” na witrynie mysite.pl implementowała swój kod, a na witrynie mysite.com — nie implementowała?

Odpowiedź: trzeba ustawić wartość ustawienia „Status wtyczki” --> „WŁ.” na stronie ustawień wtyczki, ale dla witryny mysite.com nadpisać to ustawienie, aby działało tak, jakby na stronie ustawień wtyczki opcja „Status wtyczki” była równa „WYŁ.”. Czyli trzeba zrobić tak, aby wtyczka przy odwoływaniu się do niej na stronie produktu otrzymywała $settings.enabled = 1 na stronie produktu na witrynie mysite.ru, ale otrzymywała $settings.enabled = 0 na stronie produktu na witrynie mysite.com.

We wtyczkach od dewelopera Chikurov-seo takie dynamiczne nadpisywanie ustawień wtyczek realizuje się przez bloki witryny.


Jak dynamicznie nadpisać ustawienie $settings.enabled?

Kolejność działań jest następująca:

  1. Wejść do sekcji „Witryna” --> „Bloki” w panelu administracyjnym witryny.
  2. Stworzyć nowy blok z ID w formacie pluginid.settings, gdzie pluginid to ID wtyczki. W przypadku wtyczki „showsomething”, ID bloku powinno być: showsomething.settings.
  3. Opis bloku można zostawić pusty, nie ma on wpływu na działanie.
  4. W samym bloku, używając Smarty, trzeba zmienić tablicę $plugin_settings (to właśnie do niej przekazywane są ustawienia wtyczki — $settings). Odpowiednio, jeśli zadaniem jest dynamiczne nadpisanie opcji $settings.enabled z jedynki na zero dla witryny mysite.com, należy wpisać w bloku taki kod:
    {if $wa->domainUrl() == 'https://mysite.com'} 
        {$plugin_settings.enabled = "0"}
    {/if}
  5. Na końcu bloku dodać taką linijkę kodu (ponownie, „showsomething” to ID wtyczki):
    {$wa->globals('showsomething.settings', $plugin_settings)}
  6. W rezultacie powinno to wyglądać tak:
    {if $wa->domainUrl() == 'https://mysite.com'} 
        {$plugin_settings.enabled = "0"}
    {/if}
    {$wa->globals('showsomething.settings', $plugin_settings)}
  7. Zapisz blok.

Gotowe! Przy każdym odwołaniu się do funkcji wtyczki „showsomething” wtyczka nie otrzymuje od razu standardowej tablicy z ustawieniami $settings i nie wykonuje swojego kodu, lecz najpierw sprawdza obecność bloku showsomething.settings na witrynie, a po jego znalezieniu pobiera ustawienia z globalnej zmiennej „showsomething.settings”, gdzie ustawiliście przekazywanie zmodyfikowanej tablicy $settings. Dla stron witryny mysite.pl ustawienia według kodu bloku „showsomething.settings” nie zmieniły się, natomiast dla stron witryny mysite.com — zmieniły się. Właśnie dynamicznie nadpisaliście wartość ustawienia $settings.enabled.


Oto kilka dodatkowych przykładów dynamicznego nadpisywania ustawienia $settings.enabled dla przykładowej wtyczki „showsomething”:

  • Nadpisanie ustawienia „Status wtyczki” dla administratorów witryny:
    {if $wa->user()->isAdmin($wa->app())} 
        {$plugin_settings.enabled = "0"}
    {/if}
    {$wa->globals('showsomething.settings', $plugin_settings)}
  • Nadpisanie ustawienia „Status wtyczki” dla mobilnej wersji witryny:
    {if $wa->isMobile()} 
        {$plugin_settings.enabled = "0"}
    {/if}
    {$wa->globals('showsomething.settings', $plugin_settings)}
  • Nadpisanie ustawienia „Status wtyczki” dla stron zawierających w URL fragment/category/”:
    {if strpos($wa->currentUrl(false), '/category/') !== false} 
        {$plugin_settings.enabled = "0"}
    {/if}
    {$wa->globals('showsomething.settings', $plugin_settings)}


Jak znaleźć ID potrzebnych ustawień w tablicy $settings i nadpisać je?

Jeśli trzeba nadpisać inne ustawienia wtyczki, wystarczy wykonać „dump” tablicy $plugin_settings na początku bloku i sprawdzić jej zawartość na dowolnej stronie witryny, gdzie wywoływana jest metoda interesującej wtyczki.

Na przykładzie rzeczywistej wtyczki. Załóżmy, że skonfigurowaliście wtyczkę „Dodatki do zamówienia w koszyku”. Macie dwie witryny z różnymi adresami URL stron informacyjnych i chcecie dynamicznie zmieniać wartość ustawienia HTML-kod linku: na jednej z witryn poprawić adres linku w tekście „Składając zamówienie, zgadzasz się na przetwarzanie danych osobowych zgodnie z <a href="/polityka/" target="_blank">warunkami</a>”.


Kolejność działań:

  1. Wejść do sekcji „Witryna” --> „Bloki” w panelu administracyjnym witryny.
  2. Stworzyć nowy blok z ID w formacie fixorder.settings.
  3. Na początku bloku wpisać kod, który na testowej stronie witryny wyświetli dump ustawień:
    {if $wa->get('test') == 1} 
        {$plugin_settings|wa_dump}
    {/if}
  4. Zapisać blok, otworzyć koszyk na stronie, dodać na końcu URL fragment ?test=1, odświeżyć stronę (czyli trzeba otworzyć stronę w formacie site.pl/order/?test=1).
  5. Przeanalizować dump ustawień i znaleźć, które ustawienie odpowiada za wyświetlanie interesującego tekstu: z dumpu widać, że to privacy_policy_text. Skopiować ten fragment.
  6. Wrócić do edycji bloku witryny, usunąć lub zakomentować kod wyświetlający dump ustawień wtyczki, i analogicznie do poprzedniego przykładu skonfigurować zmianę $settings.privacy_policy_text dla witryny mysite.com, podając odpowiednią wartość, a na końcu skonfigurować przekazanie tablicy do zmiennej globalnej:
    {* {if $wa->get('test') == 1} 
        {$plugin_settings|wa_dump}
    {/if} *}
    {if $wa->domainUrl() == 'https://mysite.com'} {$plugin_settings.privacy_policy_text = "Składając zamówienie, zgadzasz się na przetwarzanie danych osobowych zgodnie z <a href="/page/terms/" target="_blank">warunkami</a>"}
    {/if}
    {$wa->globals('fixorder.settings', $plugin_settings)}
  7. Gotowe! Teraz na witrynie mysite.com będzie wyświetlany link do strony /page/terms/, jak zadano w bloku fixorder.settings; a na wszystkich innych witrynach — do strony /polityka/, jak zadano w ustawieniach wtyczki.



Błąd w tekście? Zaznacz ją myszką i kliknij Ctrl + F1 lub kliknij na ten blok!