Всем Здрасте!
Я новый участник сего замечательного сообщества. И у меня сразу же возник вопрос.
Есть два чекбокса: 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();
}
Всем Здрасте! Я новый участник сего замечательного сообщества. И у меня сразу же возник вопрос. Есть два чекбокса: RichArea и TextArea. При нажатии на них значение передается в тестовое поле и задает аттрибут richText, в значение true или false. от чего зависит вид этого поля. [code]<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>[/code] Передо мной лежит следующая задача: Сделать так, чтобы значение {!TextArea} сохранялось и бралось из cookie. Мои мысли по этому поводу: с помощью javascript создавать cookie, а в контроллере принимать уже примерно как написано в руководстве. [code] public String getCount() { Cookie counter = ApexPages.currentPage().getCookies().get('counter'); if(counter == null) { return '0'; } return counter.getValue(); }[/code] В правильном ли направлении я мыслю, и очень бы хотелось узнать мнение опытных товарищей по реализации данной задачи.
Да, абсолютно верно ты мыслишь!
Устанавливаешь куки при выборе чекбокса - можно через Javascript, можно через action метод в контроллере если нужно еще что-то изменять на стороне salesforce. (здесь про это написано Cookie Class).
Выбрать можешь любой способ, но тут надо определиться как ты будешь перерисовывать страницу (скрывать/показывать RichText/PlainArea) - с помощью javascript или с помощью rerender.
На счет принимать, то все правильно. В контроллере принят куку, проинициализировал переменную и в Visualforce показал либо richText либо plainText.
Да, абсолютно верно ты мыслишь! :) Устанавливаешь куки при выборе чекбокса - можно через Javascript, можно через action метод в контроллере если нужно еще что-то изменять на стороне salesforce. (здесь про это написано [url=http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_sites_cookie.htm]Cookie Class[/url]). Выбрать можешь любой способ, но тут надо определиться как ты будешь перерисовывать страницу (скрывать/показывать RichText/PlainArea) - с помощью javascript или с помощью rerender. На счет принимать, то все правильно. В контроллере принят куку, проинициализировал переменную и в Visualforce показал либо richText либо plainText.
добавлю:
с помощью контроллера - это больше salesforce style, поэтому проще и надежнее.
с помощью javascript - быстрее работает (нет лишнего ajax запроса к контроллеру), но и делать сложнее :)
добавлю: с помощью контроллера - это больше 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}"/>
Все работает. Дмитрий, а вам большое спасибо. Буду рад замечаниям и пожеланиям по коду.
Я пошел по пути наименьшего сопротивления и выполнил задачу средствами Salesforce. В контроллере я прописал следующее: [code] 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}); }[/code] На странице добавил лишь: [code]<apex:actionSupport event="onchange" action="{!returnTrueFalseRichText}"/>[/code] Все работает. Дмитрий, а вам большое спасибо. Буду рад замечаниям и пожеланиям по коду.
<apex:actionSupport event="onchange" action="{!returnTrueFalseRichText}"/>
Я бы добавил сюда еще rerender, чтобы не всю страницу перегружать, а только ее часть с textarea.
[code]<apex:actionSupport event="onchange" action="{!returnTrueFalseRichText}"/>[/code] Я бы добавил сюда еще rerender, чтобы не всю страницу перегружать, а только ее часть с textarea.
Тут такая особенность,при использовании rerender с Rich Area на Plain Area переключается без проблем, а вот обратно не как, ошибка и все тут. Я по разному пробовал и аяксом. И два разных поля создавал и css один скрывал, другой открывал та же история, ошибка .
А вот при полной перезагрузке страницы все нормально.
вот текст ошибки:
Rerender is not currently supported with rich text editing enabled
Тут такая особенность,при использовании rerender с Rich Area на Plain Area переключается без проблем, а вот обратно не как, ошибка и все тут. Я по разному пробовал и аяксом. И два разных поля создавал и css один скрывал, другой открывал та же история, ошибка . А вот при полной перезагрузке страницы все нормально. вот текст ошибки: [code]Rerender is not currently supported with rich text editing enabled [/code]
Млин, точно. По ходу есть такая проблема. Я не слышал про нее :).
Спасибо за информацию.
Вот что нагуглил на предмет твоей ошибки
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, получается твое решение с перезагрузкой страницы правильный рабочий вариант :). И кода получилось минимум :)
Млин, точно. По ходу есть такая проблема. Я не слышал про нее :). Спасибо за информацию. Вот что нагуглил на предмет твоей ошибки [url]http://andrewbcummings.wordpress.com/2013/07/19/salesforce-richtext-fail-rerender-is-not-currently-supported-with-rich-text-editing-enabled/[/url] По ходу после rerender надо запускать инициализацию для richText area, которую Salesforce делать не хочет и просто возвращает ошибку. Ну по ходу слухи о том, что RichText от Salesforce это зло и лучше сразу использовать сторонние решения на JS, правда :) Stanislav, получается твое решение с перезагрузкой страницы правильный рабочий вариант :). И кода получилось минимум :)
Спасибо Дмитрий за ваши советы. Начали с одной темы, заодно и решение другой проблемы обсудили. Если нужно будет сделать без перезагрузки всей страницы, значит буду использовать javascript.
Спасибо Дмитрий за ваши советы. Начали с одной темы, заодно и решение другой проблемы обсудили. Если нужно будет сделать без перезагрузки всей страницы, значит буду использовать javascript.