Регистрация  |  Вход

Получение данных Cookie

Всем Здрасте!
Я новый участник сего замечательного сообщества. И у меня сразу же возник вопрос.

Есть два чекбокса: 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.