Pracuję nad systemem, w którym polegamy na wielu „administratorach / menedżerach” wysyłających e-maile do użytkowników z bazy danych. Jedną z kluczowych funkcji jest możliwość wysyłania wiadomości e-mail do kilku osób jednocześnie, podając szczegółowe informacje dotyczące każdej z nich. Inną kluczową cechą jest możliwość ręcznego tworzenia wiadomości e-mail, ponieważ zwykle konieczne jest ich nieznaczne modyfikowanie za każdym razem, ale posiadanie podstawowego szablonu oszczędza dużo czasu.
W tym celu mamy typowe rozwiązanie „szablonów”, w którym mamy szablon wyglądający mniej więcej tak:
Hello {{recipient.full_name}},
Your application to {{activity.title}} has been accepted.
You have requested to participate on dates {{application.dates}}, in role {{application.role}}
Blah blah blah
Problem, który mamy, jest oczywiście taki, jak oczekiwaliśmy, że menedżerowie nie rozumieją całej idei „zmiennych” i robią takie rzeczy, jak nadpisywanie ich, co nie pozwala im wysyłać wiadomości e-mail do więcej niż jednej osoby na raz, zakładając, że nie zostaną one zastąpione i że system jest uszkodzony, a nawet niewytłumaczalne rzeczy, takie jak „Hello {{John}}”.
Dużym problemem jest to, że jak zwykle nie jest to przenoszone do sekcji „admin”, w której tylko kilku zaawansowanych użytkowników ma dostęp do edycji szablonów, które są automatycznie wysyłane i oczekuje się, że będą wiedzieć, co robią. Każdy użytkownik systemu zostaje narażony na ten problem.
Oczywistym rozwiązaniem byłoby zastąpienie zmiennych przed wyświetleniem tego szablonu do edycji przez użytkownika, ale nie działa to w przypadku wysyłania wiadomości e-mail do kilku osób.
Wydaje się, że jest to dość powszechny problem i mamy nadzieję, że ktoś już go rozwiązał.
Czy widziałeś / stworzyłeś / potrafisz wymyślić dobre rozwiązania tego problemu?
Aktualizacja
Ostatecznie zrobiłem na podstawie odpowiedzi Daniela B. Wykrywanie, na podstawie pozycji kursora i pozycji {{}} w kodzie, czy użytkownik jest obecnie „wewnątrz zmiennej”, czy „na zewnątrz”. W środku pokazuję mały fragment tekstu pod dużym obszarem tekstowym, wyjaśniając, że zostanie on zastąpiony i że mogą go całkowicie usunąć, jeśli chcą, ale nie mogą go edytować.
Robię to onClick, onChange, onKeyDown, onKeyUp. W przypadku zdarzeń „kluczowych”, jeśli znajdujemy się w zmiennej, zwracam PRAWDA tylko wtedy, gdy keyCode jest jednym z kilku kluczy „nawigacyjnych”. W przeciwnym razie zwracam FAŁSZ, co skutecznie zapobiega edycji tej zmiennej.
Nie jest idealny, ale był bardzo tani i wydaje się skuteczny.
Odpowiedzi:
Na prośbę z komentarzy w odpowiedzi ChrisF, oto jedno rozwiązanie, z którego korzystałem w przeszłości:
Moja implementacja wyglądała mniej więcej tak:
Opcjonalnie wyróżnia zmienną, aby odróżnić ją od tekstu standardowego.
W rzeczywistości istnieją ograniczniki zmiennych, po prostu mają te same kolory pierwszego planu i tła.
Oczywiście różni się to od implementacji opartej na HTML. Prawdopodobnie przyjrzałbym się, jak zaimplementowano edytor Gmaila; wydaje się być podobny do obszaru tekstowego, ale może mieć wbudowane obrazy (emotikony itp.), które są podobne do zachowania, którego szukasz.
źródło
Rozważę zmianę sposobu prezentacji szablonu użytkownikowi, aby można było uniemożliwić edytowanie części, które zostaną zmienione przez kod. Coś takiego:
Bity, których użytkownik nie chce zmieniać, nie są teraz edytowalne. Możesz dołączyć przycisk zamykania, aby mogli usunąć elementy, jeśli ich nie potrzebują. Możesz także dołączyć tekst objaśniający i / lub podpowiedzi, aby wyjaśnić, co
{{...}}
oznaczają bity i dlaczego należy je zostawić w spokoju.Użycie czegoś takiego jak Silverlight / WPF
WrapPanel
dla każdego akapitu może dać ci coś, co pozwala na przepływ każdej części (edytowalnej i nieedytowalnej), gdy tekst kontrolowany przez użytkownika rośnie i kurczy się.źródło
WrapPanel
dla każdego akapitu może dać ci coś takiego, jak chcesz.