Как упоминалось в @AliK, это можно сделать легко, посмотрев на значение кнопок отправки.
Когда вы отправляете форму, неустановленные переменные будут оценивать значение false. Если вы установили обе кнопки отправки в одну и ту же форму, вы можете просто проверить, какая кнопка была установлена.
HTML:
PHP
if($_POST["save"]) { //User hit the save button, handle accordingly } //You can do an else, but I prefer a separate statement if($_POST["approve"]) { //User hit the Submit for Approval button, handle accordingly }
РЕДАКТИРОВАТЬ Если вы не захотите изменить свою настройку PHP, попробуйте следующее: http://pastebin.com/j0GUF7MV Это метод JavaScript, на который ссылался @AliK.
Связано:
Это немного зависит от специфики вашего дела. Во многих случаях этапы на самом деле не жестко запрограммированы, как в enum, а настраиваются для различных систем. Кроме того, чем больше потенциальных этапов у вас есть, тем больше стоит иметь более подробные настройки, но избегать повторения.
В общем, я бы порекомендовал паттерн решателя Spring здесь. Код выглядит примерно так, где KeyType
обычно является перечислением или строкой. Общая идея заключается в том, что каждая реализация сообщает вам, с какими вещами (этапами, типами, параметрами и т. Д.) Она может справиться, и затем вы ищите соответствие. (Вариант, в котором нет прямого поиска по отображению, - это иметь boolean canHandle(something)
и повторяться до тех пор, пока вы его не найдете.)
interface StageProcessor {
OutputType process(Stage stage);
KeyType stageKey();
}
@Service
class StageProcessors {
Map<KeyType, StageProcessor> stageProcessors;
StageProcessors(Collection<StageProcessor> processors) {
stageProcessors = processors.stream().collect(groupingBy(StageProcessor::stageKey));
assert stageProcessors.size() == expectedNumberOfProcessors;
}
StageProcessor getProcessor(KeyType stage) {
// although usually your service would take care of dispatching directly
return stageProcessors.get(stage);
}
}
(И в качестве примечания: Избегать внедрения поля. )
Это полностью основано на идее @chrylis, просто процессорам не нужно менять свой API для этого, вы можете просто сделать это с аннотацией. Также есть случай, когда у вас есть несколько процессоров для одного типа.
interface StageProcessor {
OutputType process(Stage stage);
}
@Component
@Processes(StageType.A)
class StageProcessorA implements StageProcessor{
OutputType process(Stage stage){
//validate stage is StageType.A
}
}
@interface Processes{
StageType type;
StageType getType(){
return type;
}
}
@Component
@Processes(StageType.B)
class StageProcessorB implements StageProcessor{
}
@Service
class StageProcessors {
Map<StageType, List<StageProcessor>> stageProcessors;
StageProcessors(Collection<StageProcessor> processors) {
Map<StageType, List<StageProcessor>> map = new HashMap<>();
for (StageProcessor processor : processors) {
StageType stageType = processor.getClass().getAnnotation(Processes.class).getType();
map.computeIfAbsent(stageType, k -> new ArrayList<>()).add(processor);
}
stageProcessors = map;
assert stageProcessors.size() == expectedNumberOfProcessors;
}
List<StageProcessor> getProcessors(StageType stage) {
return stageProcessors.get(stage);
}
}