Aplikacja nie ma być żadnym cms-em który instalujemy na swoim serwerze tylko zwykłą aplikacją webową i tu pojawia się problem jak umożliwić użytkownikom rozszerzanie funkcjonalność bo wiadomo że nikt nie jest w stanie napisać programu który zaspokoi oczekiwania wszystkich dlatego system pluginów byłby mile widziany.
Takie rozwiązania niestety wymagają dodania do własnej aplikacji kodu osób trzecich a to do najbezpieczniejszych rzeczy nie należy.
Rozwiązanie znane np. z Facebooka jest genialne w swej prostocie ale sprawia (tak mi się wydaje) sporo problemów z przesyłaniem danych z serwera do tych aplikacji. Z resztą rozwiązanie z iframe nie podoba mi się do końca bo nie dość że zabija ograniczenia co do wyglądu to jeszcze cholera wie co się dzieje z danymi wyciągniętymi do aplikacji głównej na serwerach dodatku.
W moim przypadku pluginy nie mają być aż tak potężne by zmieniać całą aplikacje. Gdyby porównywać to do rozszerzeń w przeglądarkach to bliżej temu systemowi ma być do Chrome lub nawet widżetów w Operze niż mocnych, potrafiących zmienić całą przeglądarkę pluginów Firefoxa. Takie zwykłe małe programiki dodające np jedną ikonkę do paska narzędzi i pozwalające wyświetlić jakieś informacje lub obrobić istniejące, wypluć dane do innego formatu niż domyślne itp.
W teorii jest bardzo fajnie ale gdy doszedłem do momentu myślenia o implementacji zaczęły się problemy. Generalnie widzę dwie opcje jak to można zrobić:
Tworzenie:
Opcja 1 - Online:
Rozwiązanie dajce twórcom pluginów jakieś ładne IDE w serwisie gdzie mogą zrobić podstawowe GUI korzystając z danych im elementów (takie Visual Studio

Wiadomo że udostępnienie pisania w czystym PHP lub JS jest niedopuszczalne i trzeba znaleźć alternatywę. Tutaj mocno zainspirowały mnie Smarty, pomyślałem że można by stworzyć taki własny pseudo język w obrębie PHP (więcej w części o języku;]). Takie rozwiązanie ma ten plus że kontroluje co twórca mi wysyła i mogę łatwo stworzyć bazę pluginów gdzie będą dodawane rozszerzenia po akceptacji. Dla użytkownika końcowego to też wygodne bo wchodzi sobie do tego mojego AppStore-a i wybiera co chce.
Takie rozwiązanie wydaje się też bezpieczniejsze bo żadnego dziwnego pliku nikt nie wrzuci na serwer. Jest ono jednak kłopotliwe dla twórców.
Opcja 2 - Offline:
W tym wariancie zakładam wysyłanie na serwer paczki np zip w której jest kilka plików. Definicja i opis pluginu w XML, schemat interfejsu też w XML i sam kod jeszcze nie wiem w czym

Pseudo opcja dla chętnych i posiadających za wiele czasu oraz mało znajomych 3 - Hybryda
Połączyć obydwa rozwiązania.
Język:
Tutaj zaczęły się moje największe problemy, jak pozwolić komuś na odpalenia własnego kodu na moim serwerze, w obrębie mojej aplikacji i byłoby to na tyle bezpieczne bym nie został nazwany szaleńcem. Tak jak pisałem zainspirowały mnie Smarty i ich własny języczek używany w szablonach, jakby nie było komenda w stylu {loop &data}{/loop} nie może zbytniej szkody wyrządzić. Wiadomo że do napisania prostych pluginów nie potrzeba obiektów, super wyrafinowanych typów zmiennych, połączeń z bazą danych i innych bajerów. Implementacja najprostszych poleceń nie powinna być trudna, to jak tan język będzie wyglądać jest jeszcze do przemyślana. Miałem małą styczność z vb.net i pomyślałem że można by tutaj przeszczepić bardzo okrojoną wersję obsługi zdarzeń. Chodzi o to że jeśli mamy w interfejsie pole tekstowe o nazwie "text1" i obok przycisk "napisz Hello World" o nazwie "button1" to nasz kod mógłby wyglądać tak:
Kod
[GUI button1 "button1" [clickLive]]
text1.text = "Hello World";
[/GUI button1]
text1.text = "Hello World";
[/GUI button1]
Takie coś generowałoby np taki JS:
Kod
$('#plugin_name_button1').click(function(){$('#plugin_name_text1').val('Hello World')});
Jest to szalenie prosty przykład, wiadomo że trzeba będzie wyjść też poza przeglądarkę i czasem stworzyć kod PHP i umożliwiać jakieś bardziej skomplikowane operacje ale myślę że mając podstawy nie będzie trudno to zrobić.
Kolejny problem to filtrowanie, zabezpieczenie się przed wgraniem <php die(); ?> nie jest trudne ale jeśli udostępnię funkcję do obsługi ciągów to 'bbb<bbb?bbbpbbbhbbbpbbb-bbbdbbbibbbebbb(bbb)bbb;bbb-bbb?bbb>' może być niebezpieczne przy {replace $string | 'bbb' -> '' | '-' -> ' '}.
Pytania:
Co o tym sądzicie? Czy nie jest to rzucanie się z motyką na słońce? Może jest lepszy sposób na stworzenie tego systemu? O czym jeszcze nie pomyślałem?