За последние 24 часа нас посетили 51720 программистов и 1767 роботов. Сейчас ищут 839 программистов ...

Правильно разбить.

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 21 авг 2019.

  1. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    upload_2019-8-25_12-18-8.png

    Ну есть контакт, теперь ты знаешь что 31 февраля нету и в сентябре нету 31 числа?
     
    _ne_scaju_ нравится это.
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я просто вспомнил что нет у этого дня столько дней, так как раз в 4 года у него 29 дней.
    А сам думал а почему не 30 дней а
    --- Добавлено ---
    Теперь меня в заблуждения ввел маус зверь.
    у меня было так:
    PHP:
    1. public function formatBirtday( $user_birthday ): array
    2. {
    3.   if ( !empty( $user_birthday ) && !is_null( $user_birthday ) )
    4.   {
    5.      return explode( "-", $user_birthday );
    6.   }
    7.   return [];
    8. }
    маус показал сделать так.
    PHP:
    1. public function formatBirtday( string $string = null ): \DateTime
    2. {
    3.     return new \DateTime( $string, new \DateTimeZone( 'Europe/Moscow' ) );
    4. }
    В даном случае использую второй вариант мауса, где
    1. $string - это дата из бд
    2. DateTimeZone( 'Europe/Moscow' ) - указываем представления временную зону.
    и вообще можно обозвать этот метод:
    PHP:
    1. public function dateUserBirtday( string $string = null ): \DateTime
    получается мне первый вариант уже не нужен?
     
  3. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    мде
    это уже 3-я страница. Тебе нужен объект на выхлопе?
     
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    да хоть 18 - я, я люблю точность и сразу правильность, нужно сразу правильно делать чтобы потом не переделывать
    нет на выхлопе мне нужна дата рождения в нужном формате которая подставляется в три поля для даты рождения это при редактировании данных
    upload_2019-8-25_14-18-34.png
    в эти поля подставляется дата из бд, при этом учитывается то, если в бд даты нет она по умолчанию == null чтобы изначально было заполнена форма так
    upload_2019-8-25_14-21-15.png

    Сейчас сделано так
    PHP:
    1. public function getUserBirtday( string $string = null ): \DateTime
    2. {
    3.     return new \DateTime( $string, new \DateTimeZone( 'Europe/Moscow' ) );
    4. }    
    5. public function getUserDays($string)
    6. {
    7.      return cal_days_in_month( CAL_GREGORIAN, $string -> format( 'm' ), $string -> format( 'Y' ) );
    8. }
    PHP:
    1.     public function editProfileAction()
    2.     {
    3.         $user = new UserAuth;
    4.         $userEdit = new UserAccount;
    5.  
    6.         $uid = $user -> checkLogged();# проверяем существования uid пользователя в сессии
    7.  
    8.         # Получаем информацию о пользователе (login, email, имя, фамилию, год рождения город и т.д.)
    9.        $user_info = $user -> getUserById( $uid );
    10.        
    11.         $country_city = $userEdit -> getUserCountryCity( $uid );# получаем информацию о стране и городе пользователя
    12.        $countries = $userEdit -> getCountry(); # получаем все страны
    13.        $cities = $userEdit -> getCity( $country_city['u_country_id'] ); # подгружаем id города в ajax()
    14.      
    15.         $birthday = $userEdit -> getUserBirtday( $user_info['birthday'] ); # устанавливает временную зону
    16.        $col_days = $userEdit -> getUserDays( $birthday ); # получаем количество дней заданного месяца и года
    17.  
    18.         if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
    19.         {
    20.             $args = [
    21.                 'user_name' => FILTER_DEFAULT,
    22.                 'user_lastname' => FILTER_DEFAULT,
    23.                 'user_gender' => FILTER_SANITIZE_NUMBER_INT,
    24.                 'user_day' => FILTER_SANITIZE_NUMBER_INT,
    25.                 'user_month' => FILTER_SANITIZE_NUMBER_INT,
    26.                 'user_year' => FILTER_SANITIZE_NUMBER_INT,
    27.                 'user_country' => FILTER_SANITIZE_NUMBER_INT,
    28.                 'user_city' => FILTER_SANITIZE_NUMBER_INT
    29.             ];
    30.  
    31.             $filter = filter_input_array( INPUT_POST, $args );
    32.  
    33.             # проверяем поля ввода на ошибки
    34.            if ( $userEdit -> checkUserInfoError( $filter ) )
    35.             {
    36.                 # обновляем данные пользователя
    37.                $userEdit -> updateUserInfo( $uid, $filter );
    38.  
    39.                 $msg = ['elements',
    40.                            [
    41.                             'text' => 'Данные отредактированы',
    42.                             'location' => '/account'
    43.                            ]
    44.                        ];
    45.             }
    46.             else
    47.             {
    48.                 $msg = [ 'errors', $userEdit -> getError() ];
    49.             }
    50.             $this -> view -> message(...$msg);
    51.         }
    52.         # Подключаем вид
    53.        require_once(ROOT . '/app/views/account/editProfile.php');
    54.         return true;
    55.     }
    PHP:
    1. <div class="birthday">
    2.    <select name="user_day">
    3.       <option>День</option>
    4.       <?php
    5.       foreach( range( 1, $col_days ) as $day )
    6.          printf( "<option%s>$day</option>", $day == $birthday->format('d') ? ' selected' : '');
    7.       ?>
    8.    </select>
    9.  
    10.    <select name="user_month">
    11.       <option>Месяц</option>
    12.       <?php
    13.       $months = [
    14.            1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля',
    15.            5 => 'Мая', 6 => 'Июня',  7 => 'Июля', 8 => 'Августа',
    16.            9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря'
    17.        ];
    18.  
    19.       foreach($months as $key => $month)
    20.          printf( "<option value='".$key."' %s>$month</option>", $key == $birthday -> format( 'm' ) ? ' selected' : '');
    21.       ?>
    22.    </select>
    23.  
    24.    <select name="user_year">
    25.       <option>Год</option>
    26.       <?php
    27.       foreach( range( date('Y'), 1950 ) as $year )
    28.          printf( "<option%s>$year</option>", $year == $birthday -> format( 'Y' ) ? ' selected' : '');
    29.       ?>
    30.    </select>
    31. </div>
    Тестирования
    PHP:
    1. var_dump($birthday);
    День рождения в бд есть
    upload_2019-8-25_14-50-52.png
    День рождения в бд нет
    upload_2019-8-25_14-45-24.png
    Теперь заметил особенность, если изначально выбрать месяц февраль потом выбрать день то он будет до 31
    чтобы добиться нужного значения при выборе даты с правильным кол дней, что потребуется ajax или все же можно обработать как-то на php в зависимости от месяца и года выбор дней был правильным?
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Может кто есть добрый просто совет дайте.
    Как автоматически подставить нужное количество дней при выборе месяца и года, а то я так полагаю что если буду выбирать с дня не получится для февраля сделать 28-29 дней.
    У кого какие мысли?
     
    #55 _ne_scaju_, 27 авг 2019
    Последнее редактирование: 27 авг 2019
  6. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Тебе кучу советов дали, ты их проигнорировал. Но, так уж и быть, я бы поступил примерно так:
    PHP:
    1. // Model
    2. class User {
    3.  
    4.  public function checkBirthday() : bool {
    5.   return is_null($this->birthDay) ? false : true;
    6.  }
    7.  
    8.  public function getBirthday() : array {
    9.    $date = ['year' => 1970, 'month' => 1, 'day' => 1 ];
    10.  
    11.    if($this->checkBirthday()) {
    12.      $date = array_combie($date, explode('-', $this->birthDay));
    13.    }
    14.  
    15.    return $date;
    16.  }
    17. }
    18.  
    19. // Controller
    20. class ProfileController {
    21.  
    22.  public function update() {
    23.    $user = User::findOne($id);
    24.    return $this->view->render('edit', ['birtday' => $user->getBirthday() ])
    25.  }
    26.  
    27.  public function monthDays() {
    28.   return cal_days_in_month(CAL_GREGORIAN, $year, $month);
    29.  }
    30. }
    31.  
    32. // View
    33.   echo "<select name="birthday-years">";
    34.   foreach(range(1970, date('Y')) as $key => $val) {
    35.     $selected = null;
    36.     if($val == $birtday['year']) {
    37.       $selected = 'selected';
    38.     }
    39.     echo '<option value="' . $val . '"' . $selected   .'>'. $val . '</option>';
    40.   }
    41.   echo "</select>";
    42.  // Рисуем месяцы
    43.  ....
    44.  // После выбора месяца рисуем дни, через ajax
    45. .....
     
    _ne_scaju_ нравится это.
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    за это я и спрашивал, может сперва нужно выбрать нужный год, потом месяц а потом ajax подгрузить дни?
     
  8. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    По факту это "сделайте за меня"
    блет, а в примере не так!?
     
    _ne_scaju_ нравится это.
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    ай блин только стоило вставить 5коп своих так сразу ууу без обид, а в примере чуть не так: // Рисуем месяцы а потом дни.
    а я имел введу может нужно рисовать год месяц а потом через ajax подгружать дни?

    За такой пример огромезное спасибо, буду его разбирать.
     
    #59 _ne_scaju_, 27 авг 2019
    Последнее редактирование: 27 авг 2019
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    извиняюсь только увидел как формируется дата

    от куда берется:
    PHP:
    1. $this->birthDay
    просмотрел весь код и только в view она попадается и то в шаблоне подключаемом.
    PHP:
    1. 'birtday' => $user->getBirthday()
     
  11. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Ты издеваешься? Из модели this’же! Или я тебе должен ещё всю реализацию по работе с моделями написать?
     
    _ne_scaju_ нравится это.
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    не я не издеваюсь, но она просто у тебя появилась из не откуда, возможно тебе нужно было добавить
    PHP:
    1. class User{
    2. public $birthDay= '1970-1-1';
    ну и после ты уже обращаешься к ней.
    PHP:
    1.  is_null( $this->birthDay ) ? false : true;
    где $this->birthDay идет обращение к этому свойству, вот по этому я и не понял от куда.

    а вообще предполагаю что в метод checkBirthday() передается дата из бд checkBirthday( $data )
    я и пишу темы для новичков так как многое не умею и тем более не знаю .
     
    #62 _ne_scaju_, 27 авг 2019
    Последнее редактирование: 27 авг 2019
  13. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Она не из не откуда. Я не описывал полностью не Модель, не Контроллер, не Вьюху! А это значит, что некоторые (большинство) деталей опушены. Следовательно, this->birthDay появилась не из воздуха, а на пример __construct в базовой модели (супер-класс, родительский класс) дергает sql `show column...` и через __set создаёт свойства для дочернего this класса.

    Предположение хреновое настолько на сколько это возможно! Нет метод не принимает ни черта! А вот если твоя формулировка звучала как "Если метод Х будет ещё и принимать дату, то будет неплохо.", было бы уместно. А так, маразм крепчал, деревья гнулись.

    Систематизируй значения, начни с ооп и лучше с книг (Мэнт Зандраста), хотяяяя... ты тут мимо глаз и ушей читаешь.
     
    _ne_scaju_ нравится это.
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    развернутый ответ это прям для меня, спасибо друг
    от того что ты пишешь допустим:
    лучше тебе и мне не станет поверь.
    ясно тут я с великими понимающими людьми в ООП слаб, я основы ООП знаю, но не настолько гладко как нужно было бы.
    логика у меня слаба, если бы я эти года на форуме учил php я возможно был бы хорошим специалистом в этой области, так как я не успеваю это делать приходится по чуть чуть учить.
     
  15. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Пздц улучшеная версия бота убунта
     
    _ne_scaju_ нравится это.
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    боты не умеют многое, что им запрограммируют то они и умеют, ты еще бы сказал Алиса из яндекс браузера :D
     
  17. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Закройте этот топик, к хренам!
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    че ты обижаешься я же не опытный программист( с твоей помощью и помощью других желающих я смогу понять суть что мне нужно, и куда копать. Ты большой молодец что помогаешь, все мы люди и мозги у всех разные.
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    С горем пополам, доделал, этот кусок, с днем рождения, работает вроде все правильно, детально буду тестить позже, код остался прежним, @villiwalla твой но на приеме я получаю сразу дату, плюс добавил обработчик js при изменении даты чтобы февраль был месяц с правильным кол дней.
    Рабочий пример привожу, кому нужен забирайте:
    PHP:
    1.    private function checkBirthday( $birthday = null ) : bool
    2.    {
    3.       return is_null( $birthday ) ? false : true;
    4.    }
    5.  
    6.    public function getBirthday( $birthday = null ) : array
    7.    {
    8.       # по умолчанию значение для полей ввода
    9.      $default = [ 'year' => 1970, 'month' => 1, 'day' => 1 ];
    10.  
    11.       if( $this -> checkBirthday( $birthday ) )
    12.       {
    13.          return array_combine( [ 'year', 'month', 'day' ], explode( '-', $birthday ) );
    14.       }
    15.       return $default;
    16.    }
    17.  
    18.    public function monthDays( int $year, int $month )
    19.    {
    20.       return cal_days_in_month( CAL_GREGORIAN, $month, $year );
    21.    }
    PHP:
    1. public function editAction()
    2. {
    3.   ...
    4.   $user_info = $user -> getUserById( $uid );
    5.   $birthday = $userEdit -> getBirthday( $user_info['user_birthday'] ); # получаем день рождения в нужном формате
    6.   $col_days = $userEdit -> monthDays( $birthday['year'], $birthday['month'] ); # получаем количество дней заданного месяца и года
    7.   ...
    8. }
    9.  
    10.    public function getMonthDaysAction( int $y, int $m ): bool
    11.    {
    12.       if ( isset( $y ) && isset( $m ) )
    13.       {
    14.          print_r( json_encode ( ( new UserProfile() ) -> monthDays( $y, $m ) ) );
    15.       }
    16.       return true;
    17.    }
    PHP:
    1.    <label>День рождения</label>
    2.    <select name="user_year" id="year">
    3.      <option>Год</option>
    4.       <?php
    5.       foreach( range( date('Y'), 1970 ) as $year )
    6.          printf( "<option%s>$year</option>", $year == $birthday['year'] ? ' selected' : '');
    7.       ?>
    8.    </select>
    9.  
    10.    <select name="user_month" id="month">
    11.       <option>Месяц</option>
    12.       <?php
    13.       $months = [
    14.            1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля',
    15.            5 => 'Мая', 6 => 'Июня',  7 => 'Июля', 8 => 'Августа',
    16.            9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря'
    17.        ];
    18.  
    19.       foreach($months as $key => $month)
    20.          printf( "<option value='".$key."' %s>$month</option>", $key == $birthday['month'] ? ' selected' : '');
    21.       ?>
    22.    </select>
    23.  
    24.    <select name="user_day" id="day">
    25.       <option>День</option>
    26.       <?php
    27.       foreach( range( 1, $col_days ) as $day )
    28.          printf( "<option%s class='day_remove'>$day</option>", $day == $birthday['day'] ? ' selected' : '');
    29.       ?>
    30.    </select>
    Код (Javascript):
    1. $(document).ready(function(){
    2.    $("#country").change(function(e){
    3.    e.preventDefault();
    4.    $(".city_remove").remove();
    5.    let country = $("#country").val();
    6.       $.ajax({
    7.          url: "http://site/ваш_путь/cities/" + country,
    8.          type: "POST",
    9.          processData: false,
    10.          contentType: false,
    11.          dataType: "json",
    12.          success:function(data){
    13.             for (let city of data) {
    14.                 $("#city").append('<option value="' + city['id'] + '" class="city_remove">' + city['city_name'] + '</option>');
    15.             }
    16.          }
    17.       });
    18.     });
    19. });
    Пользуйтесь, удачи.
    Всем спасибо за обсуждения,
    вопрос решен!
     
    #69 _ne_scaju_, 3 сен 2019
    Последнее редактирование: 3 сен 2019
    artoodetoo нравится это.