1. PHP / Говнокод #16003

    +156

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    public function catalog_add() {
            
            if (Route::is_post()) {
                $this->L->view = false;
                $errors = array();
    
                $Company = new Model_Companies();
                $Company->fillFromArray($_POST['companies']);
    
                if (!$Company['cats_id']) {
                    $errors[] = 'Не выбрана категория';
                }
                if (!preg_match('/^\d{2}\.\d{2}\.\d{4}$/', $Company['startdate'])) {
                    $errors[] = 'Неверный формат начала периода размещения';
                }
                if (!preg_match('/^\d{2}\.\d{2}\.\d{4}$/', $Company['enddate'])) {
                    $errors[] = 'Неверный формат конца периода размещения';
                }
                if (!preg_match('/^\d{2}\.\d{2}\.\d{4}$/', $Company['position_start'])) {
                    $errors[] = 'Неверный формат начала действия приоритетной позиции';
                }
                if (!preg_match('/^\d{2}\.\d{2}\.\d{4}$/', $Company['position_end'])) {
                    $errors[] = 'Неверный формат конца действия приоритетной позиции';
                }
    
                //проверка на существования графика работы
                $noSchedule = true;
                foreach ($_POST['schedule'] as $key => $value) {
                    if (isset($value['work'])) {
                        $noSchedule = false;
                        break;
                    }
                }
    
                if ($noSchedule) {
                    $errors[] = 'Не указано ни одного рабочего дня';
                } else {
                    //проверка рабочего времени
                    foreach ($_POST['schedule'] as $key => $value) {
                        if (isset($value['work'])) {
                            if (!preg_match('/^(2[0-3]|[01][0-9]):[0-5][0-9]$/', $value['start']) || !preg_match('/^(2[0-3]|[01][0-9]):[0-5][0-9]$/', $value['end'])) {
                                $errors[] = 'Неверный формат времени работы в ' . strtolower(Model_Schedule::$days[$key]);
                            } else {
                                //проверка грамотности, конец больше начала
                                if (strtotime($value['start']) > strtotime($value['end'])) {
                                    $errors[] = 'Конец работы должен быть позже времени начала в ' . strtolower(Model_Schedule::$days[$key]);
                                } else {
                                    //провека обеда
                                    if (isset($value['lunch'])) {
                                        if (!preg_match('/^(2[0-3]|[01][0-9]):[0-5][0-9]$/', $value['lunch_start']) || !preg_match('/^(2[0-3]|[01][0-9]):[0-5][0-9]$/', $value['lunch_end'])) {
                                            $errors[] = 'Неверный формат времени обеда в ' . strtolower(Model_Schedule::$days[$key]);
                                        } else {
                                            //проверка грамотности границ обеда
                                            if (strtotime($value['lunch_start']) > strtotime($value['lunch_end'])) {
                                                $errors[] = 'Конец обеденного перерыва должен быть позже времени начала в ' . strtolower(Model_Schedule::$days[$key]);
                                            } else {
                                                //проверка что обед вмещается в рабочее время
                                                if ($value['lunch_start'] < $value['start'] || $value['lunch_end'] > $value['end']) {
                                                    $errors[] = 'Обед выходит за рамки указанного рабочего времени в ' . strtolower(Model_Schedule::$days[$key]);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
    
                //todo: сделать проверку на занятость приоритетной позиции в выбраной категории в указанный период
    
                if (!count($errors)) {
                    //если нет ошибок то пишем
                    $Company->save();
    
                    foreach ($_POST['schedule'] as $key => $value) {
                        if (isset($value['work'])) {
                            $Schedule = new Model_Schedule();
                            $Schedule->fillFromArray($value);
                            $Schedule['day'] = $key;
                            $Schedule['companies_id'] = $Company['id'];
                            $Schedule->save();
                        }
                    }
                }
    
                echo json_encode($errors);
            }
        }

    проверки, такие проверки

    Запостил: Serious_Andy, 17 Мая 2014

    Комментарии (32) RSS

    • > preg_match('/^\d{2}\.\d{2}\.\d{4}$/', $Company['startdate']
      49.15.2014

      P.S. Регулярку для проверки диапазонов чисел я когда-то писал... А вот для дат что-то страшновато браться.
      Ответить
      • http://stackoverflow.com/questions/51224/regular-expression-to-match-valid-dates/8768241#8768241
        Ответить
        • This is not an appropriate use of regular expressions. You'd be better off using

          [0-9]{2}/[0-9]{2}/[0-9]{4}
          and then checking ranges in a higher-level language.
          Ответить
          • Да тогда уж лучше взять готовую функцию для парсинга дат и не ебать моск. Один фиг с датами потом удобней работать если они будут в виде дат.
            Ответить
      • (01|02|03|04| ..
        Ответить
        • > (01|02|03|04| ..
          (0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[12])\.20[0-9]{2}

          Но это не учитывает длину месяцев ;)

          P.S. Генератор для проверки диапазонов чисел был где-то у меня в кабинке.
          Ответить
          • Осталось придумать, как проверять високосные годы, и всё будет норм.
            Ответить
            • > Осталось придумать, как проверять високосные годы, и всё будет норм.
              Зачем придумывать? Я же выше кинул ссылку на stackoverflow. Там эту проблему уже решили ;)
              Ответить
              • Да, я как-то не посмотрел там.
                Ответить
              • > Там эту проблему уже решили ;)
                Эмоции переполняют, хочется ответить комментарием в стиле тов. Пи, заканчивающимся большими буквами и СТРАШНЫМ ПРОКЛЯТИЕМ.
                Ответить
                • > хочется ответить комментарием в стиле тов. Пи, заканчивающимся большими буквами и СТРАШНЫМ ПРОКЛЯТИЕМ.
                  Заинтриговал :) Можно услышать комментарий, которым хотелось бы ответить?
                  Ответить
                  • Не, ну сам я такое не смогу сказать. Подразумевал что-то подобное:
                    http://govnokod.ru/13938#comment200369
                    http://govnokod.ru/12109#comment160442

                    После изучения комментариев оказалось, что подобное завершение не очень распространено, а просто мне запомнился единственный комментарий в таком стиле, который я видел.
                    Вероятно, комментарии в стиле "у меня %капсболд%" или "да у тебя же %капсболд%" (таких примерно пара-тройка десятков) усиливают впечатление.
                    http://govnokod.ru/8146#comment113244
                    http://govnokod.ru/11754#comment153643
                    http://govnokod.ru/15602#comment223104
                    http://govnokod.ru/15923#comment230979
                    Ответить
                    • Это кровь кишки распидорасило.

                      Алсо только первая ссылка подсвечивается.
                      Ответить
                      • > Алсо только первая ссылка подсвечивается.
                        Уже все подсвечиваются
                        http://govnokod.ru/15952#comment232502
                        Ответить
                        • Нет.
                          Ответить
                          • Странно. У меня скрипт 0.0.16, подсвечивает всё в хроме. И даже в лисоскриптише, только что проверил.
                            Ответить
                            • 0.0.16, скриптиш, зуй. Обновил - заработало. Борманд забыл увеличить версию?
                              Ответить
                              • > Борманд забыл увеличить версию?
                                Ага.
                                Ответить
                                • А автоматом проставлять как-то можно?
                                  Ответить
                                  • > А автоматом проставлять как-то можно?
                                    В pre-commit хуке можно написать простановку версии. Просто лениво.
                                    Ответить
                                    • А как оно там проставляется?
                                      Ответить
                                      • > А как оно там проставляется?
                                        Перед коммитом гит запускает скрипт (на любом языке), прописанный как pre-commit хук. А там уже вписываешь что хочешь и куда хочешь...
                                        Ответить
                                        • Где запускается? На клиенте? Если на серве - можно его запустить на гитхабе?
                                          Ответить
                                          • Сам отвечу - гитхаб поддерживает вебхуки https://help.github.com/articles/creating-webhooks . Может, есть стандарнтый вебхук, проставляющий версию? А можно как-то именно на клиенте это поменять?
                                            Ответить
                                            • В tortoisesvn по крайней мере локальные скрипты есть. Если бы они еще и из svn импортировались...
                                              Ответить
                                              • Как хотя бы в tsvn сделать простановку ревизии на клиенте перед коммитом? И не будет ли с этим проблем из-за того, что одинаковые файлы разных ревизий будут разными?
                                                Ответить
                                                • > tsvn
                                                  Я тортойз не юзал ни разу. Так что х.з.

                                                  > одинаковые файлы разных ревизий будут разными
                                                  Походу будут, если ты в них версию вписываешь. Поэтому на компилируемых языках ревизию часто сохраняют во временный файлик, который не хранится в системе контроля версий, но участвует в сборке проекта...
                                                  Ответить
                                                  • Ну тогда в том прыщегавне, которое ты юзал.
                                                    Ответить
                                                    • > в том прыщегавне, которое ты юзал
                                                      Как-то так: http://www.visualsvn.com/support/svnbook/advanced/props/special/keywords/
                                                      Ответить
                                                      • Они заменяются при апдейте, а не при коммите. Посмотри http файл - увидишь.
                                                        Ответить
                                                • Есть всякие %revision% %autor% и тд.
                                                  Ответить
                                        • > Где запускается?
                                          Зависит от хука. pre-commit локально, на клиенте, т.к. запускается перед тем, как показать окошко коммита. А на серваке другие есть (после отправки пачки на сервер например).
                                          Ответить

    Добавить комментарий