я просто вспомнил что нет у этого дня столько дней, так как раз в 4 года у него 29 дней. А сам думал а почему не 30 дней а --- Добавлено --- Теперь меня в заблуждения ввел маус зверь. у меня было так: PHP: public function formatBirtday( $user_birthday ): array { if ( !empty( $user_birthday ) && !is_null( $user_birthday ) ) { return explode( "-", $user_birthday ); } return []; } маус показал сделать так. PHP: public function formatBirtday( string $string = null ): \DateTime { return new \DateTime( $string, new \DateTimeZone( 'Europe/Moscow' ) ); } В даном случае использую второй вариант мауса, где 1. $string - это дата из бд 2. DateTimeZone( 'Europe/Moscow' ) - указываем представления временную зону. и вообще можно обозвать этот метод: PHP: public function dateUserBirtday( string $string = null ): \DateTime получается мне первый вариант уже не нужен?
да хоть 18 - я, я люблю точность и сразу правильность, нужно сразу правильно делать чтобы потом не переделывать нет на выхлопе мне нужна дата рождения в нужном формате которая подставляется в три поля для даты рождения это при редактировании данных в эти поля подставляется дата из бд, при этом учитывается то, если в бд даты нет она по умолчанию == null чтобы изначально было заполнена форма так Сейчас сделано так Спойлер: Методы в модели. PHP: public function getUserBirtday( string $string = null ): \DateTime { return new \DateTime( $string, new \DateTimeZone( 'Europe/Moscow' ) ); } public function getUserDays($string) { return cal_days_in_month( CAL_GREGORIAN, $string -> format( 'm' ), $string -> format( 'Y' ) ); } Спойлер: Вызов методов в контроллере PHP: public function editProfileAction() { $user = new UserAuth; $userEdit = new UserAccount; $uid = $user -> checkLogged();# проверяем существования uid пользователя в сессии # Получаем информацию о пользователе (login, email, имя, фамилию, год рождения город и т.д.) $user_info = $user -> getUserById( $uid ); $country_city = $userEdit -> getUserCountryCity( $uid );# получаем информацию о стране и городе пользователя $countries = $userEdit -> getCountry(); # получаем все страны $cities = $userEdit -> getCity( $country_city['u_country_id'] ); # подгружаем id города в ajax() $birthday = $userEdit -> getUserBirtday( $user_info['birthday'] ); # устанавливает временную зону $col_days = $userEdit -> getUserDays( $birthday ); # получаем количество дней заданного месяца и года if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { $args = [ 'user_name' => FILTER_DEFAULT, 'user_lastname' => FILTER_DEFAULT, 'user_gender' => FILTER_SANITIZE_NUMBER_INT, 'user_day' => FILTER_SANITIZE_NUMBER_INT, 'user_month' => FILTER_SANITIZE_NUMBER_INT, 'user_year' => FILTER_SANITIZE_NUMBER_INT, 'user_country' => FILTER_SANITIZE_NUMBER_INT, 'user_city' => FILTER_SANITIZE_NUMBER_INT ]; $filter = filter_input_array( INPUT_POST, $args ); # проверяем поля ввода на ошибки if ( $userEdit -> checkUserInfoError( $filter ) ) { # обновляем данные пользователя $userEdit -> updateUserInfo( $uid, $filter ); $msg = ['elements', [ 'text' => 'Данные отредактированы', 'location' => '/account' ] ]; } else { $msg = [ 'errors', $userEdit -> getError() ]; } $this -> view -> message(...$msg); } # Подключаем вид require_once(ROOT . '/app/views/account/editProfile.php'); return true; } Спойлер: в видах вывожу данные PHP: <div class="birthday"> <select name="user_day"> <option>День</option> <?php foreach( range( 1, $col_days ) as $day ) printf( "<option%s>$day</option>", $day == $birthday->format('d') ? ' selected' : ''); ?> </select> <select name="user_month"> <option>Месяц</option> <?php $months = [ 1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля', 5 => 'Мая', 6 => 'Июня', 7 => 'Июля', 8 => 'Августа', 9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря' ]; foreach($months as $key => $month) printf( "<option value='".$key."' %s>$month</option>", $key == $birthday -> format( 'm' ) ? ' selected' : ''); ?> </select> <select name="user_year"> <option>Год</option> <?php foreach( range( date('Y'), 1950 ) as $year ) printf( "<option%s>$year</option>", $year == $birthday -> format( 'Y' ) ? ' selected' : ''); ?> </select> </div> Тестирования PHP: var_dump($birthday); День рождения в бд есть День рождения в бд нет Теперь заметил особенность, если изначально выбрать месяц февраль потом выбрать день то он будет до 31 чтобы добиться нужного значения при выборе даты с правильным кол дней, что потребуется ajax или все же можно обработать как-то на php в зависимости от месяца и года выбор дней был правильным?
Может кто есть добрый просто совет дайте. Как автоматически подставить нужное количество дней при выборе месяца и года, а то я так полагаю что если буду выбирать с дня не получится для февраля сделать 28-29 дней. У кого какие мысли?
Тебе кучу советов дали, ты их проигнорировал. Но, так уж и быть, я бы поступил примерно так: PHP: // Model class User { public function checkBirthday() : bool { return is_null($this->birthDay) ? false : true; } public function getBirthday() : array { $date = ['year' => 1970, 'month' => 1, 'day' => 1 ]; if($this->checkBirthday()) { $date = array_combie($date, explode('-', $this->birthDay)); } return $date; } } // Controller class ProfileController { public function update() { $user = User::findOne($id); return $this->view->render('edit', ['birtday' => $user->getBirthday() ]) } public function monthDays() { return cal_days_in_month(CAL_GREGORIAN, $year, $month); } } // View echo "<select name="birthday-years">"; foreach(range(1970, date('Y')) as $key => $val) { $selected = null; if($val == $birtday['year']) { $selected = 'selected'; } echo '<option value="' . $val . '"' . $selected .'>'. $val . '</option>'; } echo "</select>"; // Рисуем месяцы .... // После выбора месяца рисуем дни, через ajax .....
за это я и спрашивал, может сперва нужно выбрать нужный год, потом месяц а потом ajax подгрузить дни?
ай блин только стоило вставить 5коп своих так сразу ууу без обид, а в примере чуть не так: // Рисуем месяцы а потом дни. а я имел введу может нужно рисовать год месяц а потом через ajax подгружать дни? За такой пример огромезное спасибо, буду его разбирать.
извиняюсь только увидел как формируется дата от куда берется: PHP: $this->birthDay просмотрел весь код и только в view она попадается и то в шаблоне подключаемом. PHP: 'birtday' => $user->getBirthday()
Ты издеваешься? Из модели this’же! Или я тебе должен ещё всю реализацию по работе с моделями написать?
не я не издеваюсь, но она просто у тебя появилась из не откуда, возможно тебе нужно было добавить PHP: class User{ public $birthDay= '1970-1-1'; ну и после ты уже обращаешься к ней. PHP: is_null( $this->birthDay ) ? false : true; где $this->birthDay идет обращение к этому свойству, вот по этому я и не понял от куда. а вообще предполагаю что в метод checkBirthday() передается дата из бд checkBirthday( $data ) я и пишу темы для новичков так как многое не умею и тем более не знаю .
Она не из не откуда. Я не описывал полностью не Модель, не Контроллер, не Вьюху! А это значит, что некоторые (большинство) деталей опушены. Следовательно, this->birthDay появилась не из воздуха, а на пример __construct в базовой модели (супер-класс, родительский класс) дергает sql `show column...` и через __set создаёт свойства для дочернего this класса. Предположение хреновое настолько на сколько это возможно! Нет метод не принимает ни черта! А вот если твоя формулировка звучала как "Если метод Х будет ещё и принимать дату, то будет неплохо.", было бы уместно. А так, маразм крепчал, деревья гнулись. Систематизируй значения, начни с ооп и лучше с книг (Мэнт Зандраста), хотяяяя... ты тут мимо глаз и ушей читаешь.
развернутый ответ это прям для меня, спасибо друг от того что ты пишешь допустим: лучше тебе и мне не станет поверь. ясно тут я с великими понимающими людьми в ООП слаб, я основы ООП знаю, но не настолько гладко как нужно было бы. логика у меня слаба, если бы я эти года на форуме учил php я возможно был бы хорошим специалистом в этой области, так как я не успеваю это делать приходится по чуть чуть учить.
боты не умеют многое, что им запрограммируют то они и умеют, ты еще бы сказал Алиса из яндекс браузера
че ты обижаешься я же не опытный программист( с твоей помощью и помощью других желающих я смогу понять суть что мне нужно, и куда копать. Ты большой молодец что помогаешь, все мы люди и мозги у всех разные.
С горем пополам, доделал, этот кусок, с днем рождения, работает вроде все правильно, детально буду тестить позже, код остался прежним, @villiwalla твой но на приеме я получаю сразу дату, плюс добавил обработчик js при изменении даты чтобы февраль был месяц с правильным кол дней. Рабочий пример привожу, кому нужен забирайте: Спойлер: Модель PHP: private function checkBirthday( $birthday = null ) : bool { return is_null( $birthday ) ? false : true; } public function getBirthday( $birthday = null ) : array { # по умолчанию значение для полей ввода $default = [ 'year' => 1970, 'month' => 1, 'day' => 1 ]; if( $this -> checkBirthday( $birthday ) ) { return array_combine( [ 'year', 'month', 'day' ], explode( '-', $birthday ) ); } return $default; } public function monthDays( int $year, int $month ) { return cal_days_in_month( CAL_GREGORIAN, $month, $year ); } Спойлер: Контроллер PHP: public function editAction() { ... $user_info = $user -> getUserById( $uid ); $birthday = $userEdit -> getBirthday( $user_info['user_birthday'] ); # получаем день рождения в нужном формате $col_days = $userEdit -> monthDays( $birthday['year'], $birthday['month'] ); # получаем количество дней заданного месяца и года ... } public function getMonthDaysAction( int $y, int $m ): bool { if ( isset( $y ) && isset( $m ) ) { print_r( json_encode ( ( new UserProfile() ) -> monthDays( $y, $m ) ) ); } return true; } Спойлер: Вид PHP: <label>День рождения</label> <select name="user_year" id="year"> <option>Год</option> <?php foreach( range( date('Y'), 1970 ) as $year ) printf( "<option%s>$year</option>", $year == $birthday['year'] ? ' selected' : ''); ?> </select> <select name="user_month" id="month"> <option>Месяц</option> <?php $months = [ 1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля', 5 => 'Мая', 6 => 'Июня', 7 => 'Июля', 8 => 'Августа', 9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря' ]; foreach($months as $key => $month) printf( "<option value='".$key."' %s>$month</option>", $key == $birthday['month'] ? ' selected' : ''); ?> </select> <select name="user_day" id="day"> <option>День</option> <?php foreach( range( 1, $col_days ) as $day ) printf( "<option%s class='day_remove'>$day</option>", $day == $birthday['day'] ? ' selected' : ''); ?> </select> Спойлер: js для метода getMonthDaysAction Код (Javascript): $(document).ready(function(){ $("#country").change(function(e){ e.preventDefault(); $(".city_remove").remove(); let country = $("#country").val(); $.ajax({ url: "http://site/ваш_путь/cities/" + country, type: "POST", processData: false, contentType: false, dataType: "json", success:function(data){ for (let city of data) { $("#city").append('<option value="' + city['id'] + '" class="city_remove">' + city['city_name'] + '</option>'); } } }); }); }); Пользуйтесь, удачи. Всем спасибо за обсуждения, вопрос решен!