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

Как на фронте понять что страница вернулась по причине проблем в форме

Вот задачка которая вам понравилась.

на клиенте выводятся пик-листы и див с дисплей: нан.

джаваскрипт смотрит на выбранные значения в пик-листах (селектах) и открывает див (дисплей: блок) когда нужно.

в этом диве лежит форма создающая запись.

там есть обязательные поля.

так вот, я не заполняю поля, жму Сохранить, и страница возвращается с котнроллера с напоминанием что не заполнены поля.

но возвращается то она с оригинальным значением - див с дисплей: нан!!! то есть форма не видима.

и я не могу понять как словить на клиенте (или в контрллере) эту ситуацию - отброс с контроллера по причине проблем с заполнением формы. Не могу словить ситуацию - не могу повторно открыть Див!

у меня уже была похожая ситуация - там был отброс с контроллера по вал рулам - там я ловил apex:message джаваскриптом, но здесь его не будет!

и, да, контроллерный код с акшин вызываемой кнопкой Сохранить не запускается в такой ситуации, т.е. я немогу сделать булен-флаг переменную в контроллере...

Ну как вам ребус?

Вот задачка которая вам понравилась.

на клиенте выводятся пик-листы и див с дисплей: нан.

джаваскрипт смотрит на выбранные значения в пик-листах (селектах) и открывает див (дисплей: блок) когда нужно.

в этом диве лежит форма создающая запись.

там есть обязательные поля.

так вот, я не заполняю поля, жму Сохранить, и страница возвращается с котнроллера с напоминанием что не заполнены поля.

но возвращается то она с оригинальным значением - див с дисплей: нан!!! то есть форма не видима.

и я не могу понять [b]как словить на клиенте (или в контрллере) эту ситуацию[/b] - отброс с контроллера по причине проблем с заполнением формы. Не могу словить ситуацию - не могу повторно открыть Див!

у меня уже была похожая ситуация - там был отброс с контроллера по вал рулам - там я ловил apex:message джаваскриптом, но здесь его не будет!

и, да, контроллерный код с акшин вызываемой кнопкой Сохранить  не запускается в такой ситуации, т.е. я немогу сделать булен-флаг переменную в контроллере... 

Ну как вам ребус?

Один из методов - убрать стандартные валидаторы (required)
и проверять вручную в контроллере в action методе.

Дело в том, ты правильно заметил, что стандартные валидаторы срабатывают раньше контроллера и вообще не дают запуститься методу. Т.е. факт ошибки ты не словишь явно. Хотя можно отловить по наличию CSS класса ошибки в форме (но это костыль)

Если будешь сам проверять в контроллере нужные поля на заполненность (или еще лучше на шаблоны с помощью regex) то сможешь использовать public Boolean переменную, которая по умолчанию будет скаже false и от нее будет зависеть показывать ли форму. Вот если произошла ошибка и тебе надо показать форму с ошибкой, ставишь эту переменную в true и перегружаешь страницу - форма должна показаться. Profit.

Один из методов - убрать стандартные валидаторы (required)
и проверять вручную в контроллере в action методе.

Дело в том, ты правильно заметил, что стандартные валидаторы срабатывают раньше контроллера и вообще не дают запуститься методу. Т.е. факт ошибки ты не словишь явно. Хотя можно отловить по наличию CSS класса ошибки в форме (но это костыль)

Если будешь сам проверять в контроллере нужные поля на заполненность (или еще лучше на шаблоны с помощью regex) то сможешь использовать public Boolean переменную, которая по умолчанию будет скаже false и от нее будет зависеть показывать ли форму. Вот если произошла ошибка и тебе надо показать форму с ошибкой, ставишь эту переменную в true и перегружаешь страницу - форма должна показаться. Profit. :D  

Эх боюсь я костылить с валидацией полей. Как пить дать, они поставят туда еще и вал рулы и нужно будет думать и об этом.

ночью пришла такая идея.
а мы можем сделать флаг в контроллере:

в тот момент когда скриптик открывает видимость Дива он также вызывает apex:actionFunction
которая Аджаксом переключает флаг в контролере. Вопрос только дойдет ли дело до контроллера в момент возврата формы, и будет ли прочитано это флаговое значение - которое в свою очередь условно рендерит фронт...

или вообще отказаться от этой формы на одной страинце с селекторанми - вывести ее на др страницу, можно даже попробовать сделать страницы на одном контроллере, чтобы не передавать данные между страницами...

Эх боюсь я костылить с валидацией полей. Как пить дать, они поставят туда еще и вал рулы и нужно будет думать и об этом.

ночью пришла такая идея.
а мы можем сделать флаг в контроллере:

в тот момент когда скриптик открывает видимость Дива он также вызывает apex:actionFunction
которая Аджаксом переключает флаг в контролере. Вопрос только дойдет ли дело до контроллера в момент возврата формы, и будет ли прочитано это флаговое значение - которое в свою очередь условно рендерит фронт...

или вообще отказаться от этой формы на одной страинце с селекторанми - вывести ее на др страницу, можно даже попробовать сделать страницы на одном контроллере, чтобы не передавать данные между страницами...

Можно использовать атрибут immediate (boolean) тегов link/button в VF для определения того, когда запускать валидацию.

Можно использовать атрибут immediate (boolean) тегов link/button в VF для определения того, когда запускать валидацию.

shootter
Можно использовать атрибут immediate (boolean) тегов link/button в VF для определения того, когда запускать валидацию.


вот это интересно. прочитаем

"A Boolean value that specifies whether the action associated with this component should happen immediately, without processing any validation rules associated with the fields on the page. If set to true, the action happens immediately and validation rules are skipped. If not specified, this value defaults to false".

попробовал. отключился атрибут required="true" на полях. но зачем их оключать? можно вообще и не ставить. Но если ставить а потом отключать - то на лейауте будет стандартная красная метка показывающая что нужно заполнить. И потом в контролле сделать собственную валидацию как говорил Дмитрий.

[quote="shootter"]Можно использовать атрибут immediate (boolean) тегов link/button в VF для определения того, когда запускать валидацию.[/quote]


вот это интересно. прочитаем

"A Boolean value that specifies whether the action associated with this component should happen immediately, without processing any validation rules associated with the fields on the page. If set to true, the action happens immediately and validation rules are skipped. If not specified, this value defaults to false".

попробовал. отключился атрибут required="true" на полях. но зачем их оключать? можно вообще и не ставить. Но если ставить а потом отключать - то на лейауте будет стандартная красная метка показывающая что нужно заполнить. И потом в контролле сделать собственную валидацию как говорил Дмитрий. 

Да immediate=true отменяет стандартную валидацию вообще.

Но советую запомнить этот атрибут. Он крайне полезен и в некоторых ситуациях без него не обойтись!!!

Да [b]immediate=true[/b] отменяет стандартную валидацию вообще.

Но советую запомнить этот атрибут. Он крайне полезен и в некоторых ситуациях без него не обойтись!!!

А что происходит после save, если он пройдет?

А что происходит после save, если он пройдет?

Дмитрий Черник
А что происходит после save, если он пройдет?

Это ты про что?
Если про immediate=true, то независимо от того есть ли у тебя поле required или нет данные формы попадут в action метод. (без атрибута страница показала бы ошибку)
Но этот атрибут НЕ отменяет Validation Rules и проверки в полях объекта. Тут все останется как обычно.

[quote="Дмитрий Черник"]А что происходит после save, если он пройдет?[/quote]
Это ты про что?
Если про immediate=true, то независимо от того есть ли у тебя поле required или нет данные формы попадут в action метод. (без атрибута страница показала бы ошибку)
Но этот атрибут НЕ отменяет Validation Rules и проверки в полях объекта. Тут все останется как обычно.


Я не про immediate=true (как он работает понятно), я спрашивал про то что происходит после нажатия save если все было правильно заполненено (что конкретно возвращает save метод или он вообще void??)

Я не про immediate=true (как он работает понятно), я спрашивал про то что происходит после нажатия save если все было правильно заполненено (что конкретно возвращает save метод или он вообще void??)

Если это метод save из StandardController, то он возвращает PageReference - выполняет редирект на новую созданную запись.
Если это кастомный метод с DML операцией по insert то, он может возвращать что угодно, но обычно или void или тоже PageReference.

Если это метод save из StandardController, то он возвращает PageReference - выполняет редирект на новую созданную запись.
Если это кастомный метод с DML операцией по insert то, он может возвращать что угодно, но обычно или void или тоже PageReference.

Ошибки как-то отображаются во view state?
Можно на клиенте проверить валидацию.

Ошибки как-то отображаются во view state?
Можно на клиенте проверить валидацию.

Gres
Ошибки как-то отображаются во view state?

Никогда не заглядывал еще во view state. не знаю как использовать при отладке.

Gres
Можно на клиенте проверить валидацию.

Можно это сделать, но страница из тех, что будут постоянно апдатировать и дополнять (добавлять новые опции и поля) после размещения в Проде. И там полно JS читающего опции в пик-листах.

Так что решение по текущей проблеме должно быть предельно простым и ясным.
хочу на выходных попробовать apex:actionFunction держающий флаг.
если не поможет - то вывожу форму в отдельную страницу - и проблеме: "Давай-Досвиданья!"

[quote="Gres"]Ошибки как-то отображаются во view state?[/quote]

Никогда не заглядывал еще во view state. не знаю как использовать при отладке.

[quote="Gres"]Можно на клиенте проверить валидацию.[/quote]

Можно это сделать, но страница из тех, что будут постоянно апдатировать и дополнять (добавлять новые опции и поля) после размещения в Проде. И там полно JS читающего опции в пик-листах. 

Так что решение по текущей проблеме должно быть предельно простым и ясным.
хочу на выходных попробовать apex:actionFunction держающий флаг.
если не поможет - то вывожу форму в отдельную страницу - и проблеме: "Давай-Досвиданья!"

Dmitry Shnyrev
Если это метод save из StandardController, то он возвращает PageReference - выполняет редирект на новую созданную запись.
Если это кастомный метод с DML операцией по insert то, он может возвращать что угодно, но обычно или void или тоже PageReference.

я извиняюсь, но полезность сообщения равна нулю: так как вы, как и я, не знаете ответа на вопрос, потому как знает его только человек который писал конкретно эту страничку и save. Конкретный метод не может возвращать что угодно - это лично мое мнение.

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

[quote="Dmitry Shnyrev"]Если это метод save из StandardController, то он возвращает PageReference - выполняет редирект на новую созданную запись.
Если это кастомный метод с DML операцией по insert то, он может возвращать что угодно, но обычно или void или тоже PageReference.[/quote]

я извиняюсь, но полезность сообщения равна нулю: так как вы, как и я, не знаете ответа на вопрос, потому как знает его только человек который писал конкретно эту страничку и save. Конкретный метод не может возвращать что угодно - это лично мое мнение.

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

Дмитрий Черник
В зависимости от того что возвращает метод человеку можно предложить тот или иной путь решения проблемы которая была описана в первом сообщении.

у меня там PageReference Action возвращающая нуль.

поэтому могу без проблем сделать ее Void Action.

[quote="Дмитрий Черник"]В зависимости от того что возвращает метод человеку можно предложить тот или иной путь решения проблемы которая была описана в первом сообщении.[/quote]

у меня там PageReference Action возвращающая нуль.

поэтому могу без проблем сделать ее Void Action.

все исправил с помощью apex:actionFunction который передергивает флаг в контроллере в тот момент когда на фронте JS окрывает див.
всего 4 строки на фронте и 4 в контрллере.

хотя по-существу глупая история: actionFunction аджаксом отправляет вью стэйт на сервер в контрллер чтобы там изменить одно значение и снова вернуть этот вью стэйт на клиент

PS: вот так не получает условно рендерить див:

<apex:outputPanel rendered="{!flag}">
<div style="display: block">
</apex:outputPanel>

<apex:outputPanel rendered="{!!flag}">
<div style="display: none">
</apex:outputPane>
content
</div>

пришлось полность копировать див в двух панелях.

но думаю можно как-то "врезать" условно рендерящийся апектКомпонент прям в значение свойства display атрибута style у дива.

все исправил с помощью apex:actionFunction который передергивает флаг в контроллере в тот момент когда на фронте JS окрывает див.
всего 4 строки на фронте и 4 в контрллере.

хотя по-существу глупая история: actionFunction аджаксом отправляет вью стэйт на сервер в контрллер чтобы там изменить одно значение и снова вернуть этот вью стэйт на клиент :)

PS: вот так не получает условно рендерить див:

<apex:outputPanel rendered="{!flag}"> 
               <div style="display: block">
</apex:outputPanel> 

<apex:outputPanel rendered="{!!flag}"> 
               <div style="display: none">
</apex:outputPane>
content
</div>

пришлось полность копировать див в двух панелях.

но думаю можно как-то "врезать" условно рендерящийся апектКомпонент прям в значение свойства display атрибута style у дива.

Dmitry Shnyrev
Если про immediate=true, то независимо от того есть ли у тебя поле required или нет данные формы попадут в action метод. (без атрибута страница показала бы ошибку)
Дмитрий Черник
Я не про immediate=true (как он работает понятно)

Может я чего то путаю, но мне кажется что immediate=true он работает не так как здесь думают :).

Задачка с 501

Что будет в <apex:outputText value="{!input}" /> если что нибудь ввести в <apex:inputText value="{!input}" required="true" /> и нажать кнопку 'Go'

<apex:page controller="theController">
<apex:messages />
<apex:form >
<apex:inputText value="{!input}" required="true" />
<apex:commandButton value="go" action="{!go}" immediate="true" />
</apex:form>
<apex:outputText value="{!input}" />

</apex:page>

public class theController {


public String input {
get{

if(input == null)input = 'default';
return input;
}
set;


}
public void go() {}

}

[quote="Dmitry Shnyrev"]
Если про immediate=true, то независимо от того есть ли у тебя поле required или нет данные формы попадут в action метод. (без атрибута страница показала бы ошибку)
[/quote][quote="Дмитрий Черник"]Я не про immediate=true (как он работает понятно)[/quote]

Может я чего то путаю, но мне кажется что immediate=true он работает не так как здесь думают :).

Задачка с 501

Что будет в <apex:outputText value="{!input}" /> если что нибудь ввести в  <apex:inputText value="{!input}" required="true" /> и нажать кнопку 'Go'  

<apex:page controller="theController">
<apex:messages />
 <apex:form >
     <apex:inputText value="{!input}" required="true" />
     <apex:commandButton value="go" action="{!go}" immediate="true" />
 </apex:form> 
 <apex:outputText value="{!input}" />
 
</apex:page>

public class theController {

    
    public String input {
        get{
            
            if(input == null)input = 'default';
            return input;
           }
        set;
           
        
    }
    public void go() {}
    
}





Хм.

Воспроизвел. Очень странно.

Если на кнопке стоит immediate="true" то

данные из формы на странице в контроллер вообще не попадают! Переменные как были до нажатия на кнопку так и остаются!!! Просто сразу отрабатывает метод.

Это все меняет. Мой способ поставить immediate="true" и потом в action методе валидировать значения ВООБЩЕ не будет работать т.к. валидировать будет нечего, ничего не придет со страницы.

Хм.

Воспроизвел. Очень странно.

Если на кнопке стоит immediate="true" то

данные из формы на странице в контроллер вообще не попадают! Переменные как были до нажатия на кнопку так и остаются!!! Просто сразу отрабатывает метод.

Это все меняет. Мой способ поставить immediate="true" и потом в action методе валидировать значения ВООБЩЕ не будет работать т.к. валидировать будет нечего, ничего не придет со страницы.




Вот тут нашел подтверждение этого феномена:

immediate="true" does bypass validation but it also bypasses the set-value phase in the life cycle so the values are not updated. immeditate is useful for things like cancel and where you just want to execute an action directly that is not dependent on data changes, i.e. remove me from a collection, etc.

Вот [url=https://developer.salesforce.com/forums?id=906F000000094WBIAY]тут[/url] нашел подтверждение этого феномена:

[quote]immediate="true" does bypass validation but it also bypasses the set-value phase in the life cycle so the values are not updated.  immeditate is useful for things like cancel and where you just want to execute an action directly that is not dependent on data changes, i.e. remove me from a collection, etc.[/quote]

Dmitry Shnyrev
but it also bypasses the set-value phase

небольшая фраза, которая все меняет...

Sergey Prichepo
Задачка с 501

еще раз напомните старику, где искать\изучать материал для сертификации, задачки вроде этой. И без сертификации будет полезно почитать такое.

[quote="Dmitry Shnyrev"] but it also bypasses the set-value phase[/quote]

небольшая фраза, которая все меняет...

[quote="Sergey Prichepo"]Задачка с 501[/quote]

еще раз напомните старику, где искать\изучать материал для сертификации, задачки вроде этой. И без сертификации будет полезно почитать такое.

Брал с разных сайтов точно счас не вспомню.Кстати это типовая ошибка кому не показывал immediate="true" все примерно думали одинаково.Посмотри блоги о подготовки к 501 как некоторые,кто уже получил архитектора рассказывали как они получали сертификаты :)

Брал с разных сайтов точно счас не вспомню.Кстати это типовая ошибка кому не показывал immediate="true" все примерно думали одинаково.Посмотри блоги о подготовки к 501 как некоторые,кто уже получил архитектора рассказывали как они получали сертификаты :)

Dmitry Shnyrev
Если на кнопке стоит immediate="true" то

данные из формы на странице в контроллер вообще не попадают! Переменные как были до нажатия на кнопку так и остаются!!! Просто сразу отрабатывает метод.

мне сегодня пригодилось!

есть ВФ страница со списком записей.
есть кнопка и экшен который создает новую запись: но это просто новая запись в списке, она не вставлена в БД на этом этапе.

А также рядом с каждой записью есть кнопка "удалить запись": если это уже существующая в БД запись - то удаляется оттуда, а если это "только что созданная" новая запись - она просто выпиливается из списка записей в контроллерной переменной.

Но если какое-то поле у записей сделанно Обязательным, и мы только что создали запись - мы не можем ее сразу же удалить - сервер валидарует требуемое пустое поле и возвращает страницу. А вот если поставить на этот Экшен immediate="true" то сервер позволяет логике "провалиться" в контроллер, в метод, где эта запись просто удаляется из списка...

хорошо, что запомнил обсуждение

[quote="Dmitry Shnyrev"]Если на кнопке стоит immediate="true" то

данные из формы на странице в контроллер вообще не попадают! Переменные как были до нажатия на кнопку так и остаются!!! Просто сразу отрабатывает метод.[/quote]

мне сегодня пригодилось!

есть ВФ страница со списком записей.
есть кнопка и экшен который создает новую запись: но это просто новая запись в списке, она не вставлена в БД на этом этапе.

А также рядом с каждой записью есть кнопка "удалить запись": если это уже существующая в БД запись - то удаляется оттуда, а если это "только что созданная" новая запись - она просто выпиливается из списка записей в контроллерной переменной.

Но если какое-то поле у записей сделанно Обязательным, и мы только что создали запись - мы не можем ее сразу же удалить - сервер валидарует требуемое пустое поле и возвращает страницу. А вот если поставить на этот Экшен immediate="true" то сервер позволяет логике "провалиться" в контроллер, в метод, где эта запись просто удаляется из списка...

хорошо, что запомнил обсуждение

Dmitry Shnyrev
данные из формы на странице в контроллер вообще не попадают! Переменные как были до нажатия на кнопку так и остаются!!! Просто сразу отрабатывает метод.

внезапно обнаружил, что это не совсем так.
у меня, как описано выше, есть список записей на странице и все их поля открыты на редактирование.

я создаю новую пустую несохраненную запись и что-то меняю в старых записях и затем удаляю новую пустую запись через тот самый Экшен у которого immediate="true" (так чтобы провалиться до контроллера несмотря на то что у новой записи есть незаполнные обязательные поля).

так вот, после удаления записи, старые записи возвращается с контроллера с отредактированными значениями в полях, а не со старыми.

а если бы при immediate="true" новые значение не передавались бы в переменные контроллера - то этого бы не произошло, более того я в этом Экшен, у которого immediate="true", могу передать значение из поля записи в какую-то переменную контроллера. Но это не работает с той записью у которой было "невалидное" поле, из ее поля значение не передается в переменную.

[quote="Dmitry Shnyrev"]данные из формы на странице в контроллер вообще не попадают! Переменные как были до нажатия на кнопку так и остаются!!! Просто сразу отрабатывает метод.[/quote]

внезапно обнаружил, что это не совсем так.
у меня, как описано выше, есть список записей на странице и все их поля открыты на редактирование.

я создаю новую пустую несохраненную запись и  что-то меняю в старых записях и затем удаляю новую пустую запись через тот самый Экшен у которого immediate="true" (так чтобы провалиться до контроллера несмотря на то что у новой записи есть незаполнные обязательные поля).

так вот, после удаления записи, старые записи возвращается с контроллера с отредактированными значениями в полях, а не со старыми.

а если бы при immediate="true" новые значение не передавались бы в переменные контроллера - то этого бы не произошло, более того я в этом Экшен, у которого immediate="true",  могу передать значение из поля записи в какую-то переменную контроллера. Но это не работает с той записью у которой было "невалидное" поле, из ее поля значение не передается в переменную.