Всем Здрасте!
Я новый участник сего замечательного сообщества. И у меня сразу же возник вопрос.
Есть два чекбокса: RichArea и TextArea.
При нажатии на них значение передается в тестовое поле и задает аттрибут richText, в значение true или false. от чего зависит вид этого поля.
<apex:pageBlockSection columns="1">
<apex:pageBlockSectionItem >
<apex:outputLabel value="Label"/>
<apex:outputPanel >
<apex:selectRadio value="{!TextArea}">
<apex:selectOption itemValue="true" itemLabel="RichArea"/>
<apex:selectOption itemValue="false" itemLabel="PlainArea"/>
<apex:actionSupport event="onchange"/>
</apex:selectRadio>
<apex:inputTextarea value="{Поле с текстом}" richText="{!TextArea}""/>
</apex:outputPanel>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
Передо мной лежит следующая задача:
Сделать так, чтобы значение {!TextArea} сохранялось и бралось из cookie.
Мои мысли по этому поводу:
с помощью javascript создавать cookie, а в контроллере принимать уже примерно как написано в руководстве.
public String getCount() {
Cookie counter = ApexPages.currentPage().getCookies().get('counter');
if(counter == null) {
return '0';
}
return counter.getValue();
}Да, абсолютно верно ты мыслишь!
Устанавливаешь куки при выборе чекбокса - можно через Javascript, можно через action метод в контроллере если нужно еще что-то изменять на стороне salesforce. (здесь про это написано Cookie Class).
Выбрать можешь любой способ, но тут надо определиться как ты будешь перерисовывать страницу (скрывать/показывать RichText/PlainArea) - с помощью javascript или с помощью rerender.
На счет принимать, то все правильно. В контроллере принят куку, проинициализировал переменную и в Visualforce показал либо richText либо plainText.
добавлю:
с помощью контроллера - это больше salesforce style, поэтому проще и надежнее.
с помощью javascript - быстрее работает (нет лишнего ajax запроса к контроллеру), но и делать сложнее :)
Я пошел по пути наименьшего сопротивления и выполнил задачу средствами Salesforce.
В контроллере я прописал следующее:
public string TextArea{get{
if(TextArea==NULL){
Cookie richText = ApexPages.currentPage().getCookies().get('richText');
if(richText==NULL){TextArea='true';}
else if(richText!=NULL){TextArea=richText.getValue();}
}
return TextArea;}set;}
public Void returnTrueFalseRichText() {
Cookie richText;
if (TextArea == 'true') {
richText = new Cookie('richText','true',null,-1,false);
}
if (TextArea == 'false') {
richText = new Cookie('richText','false',null,-1,false);
}
ApexPages.currentPage().setCookies(new Cookie[]{richText});
}На странице добавил лишь:
<apex:actionSupport event="onchange" action="{!returnTrueFalseRichText}"/>Все работает. Дмитрий, а вам большое спасибо. Буду рад замечаниям и пожеланиям по коду.
<apex:actionSupport event="onchange" action="{!returnTrueFalseRichText}"/>Я бы добавил сюда еще rerender, чтобы не всю страницу перегружать, а только ее часть с textarea.
Тут такая особенность,при использовании rerender с Rich Area на Plain Area переключается без проблем, а вот обратно не как, ошибка и все тут. Я по разному пробовал и аяксом. И два разных поля создавал и css один скрывал, другой открывал та же история, ошибка .
А вот при полной перезагрузке страницы все нормально.
вот текст ошибки:
Rerender is not currently supported with rich text editing enabled
Млин, точно. По ходу есть такая проблема. Я не слышал про нее :).
Спасибо за информацию.
Вот что нагуглил на предмет твоей ошибки
http://andrewbcummings.wordpress.com/2013/07/19/salesforce-richtext-fail-rerender-is-not-currently-supported-with-rich-text-editing-enabled/
По ходу после rerender надо запускать инициализацию для richText area, которую Salesforce делать не хочет и просто возвращает ошибку.
Ну по ходу слухи о том, что RichText от Salesforce это зло и лучше сразу использовать сторонние решения на JS, правда
Stanislav, получается твое решение с перезагрузкой страницы правильный рабочий вариант :). И кода получилось минимум :)
Спасибо Дмитрий за ваши советы. Начали с одной темы, заодно и решение другой проблемы обсудили. Если нужно будет сделать без перезагрузки всей страницы, значит буду использовать javascript.