• Возможно ли уйти в айти?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Непередаваемое ощущение .... и ты понимаешь, что сделал это своими руками.

    Вы сходите на стройку. У вас возникнет такое же ощущение...) Там тоже можно что-то сделать своими руками и таких профессий много...)

    Если по делу - начать вам вообще ни разу не поздно. Если в сознании и можете тыкать пальцем по мышке, то поздравляю - Вы уже можете встать на этот путь! Главное, чтобы вам это нравилось. Я в своё время сделал не плохой проект не зная ничего за пол года. Первое время будет сложно и много чего не понятно. Тут вам нужно уметь правильно задавать вопросы в поисковике. Если вы умеете находить ответы через поисковик - это большой плюс. Так как не все могут сразу описать проблему или что вы хотите сделать.

    В программировании есть много уклонов. Можно заниматься вертской, дизайном, можно быть юристом в программировании, можно писать код на php. Я так понимаю вам это интересно.

    Если это так, то тогда вам нужно просмотреть неделю ООП по PHP . Все его уроки

    Как поймете основы - выбирайте фреймворк из списка:
    1. Symfony - для бородатых дяденек и больших проектов
    2. Laravel - для небольших проектов
    3. Yii2 - для прототипа и для старта новичков

    Я бы начинал с Yii2. Почему? Потому что там вы с легкостью создадите в кратчайшие сроки не плохой сайт и функционал за короткое время и почти без знаний. Поразбираетесь в нем и пойдете дальше. Но сразу вам скажу что этот фреймворк ругают сильно. Он старый для текущего времени. Но достаточно популярный у новичков. Там много проблем с SOLID и другими вещами. Но главное - это то, что у вас будет получатся. Это будет вас мотивировать.

    У этого же автора по ООП есть уроки по этому фреймворку. Они длительностью большие, но стоит того. Скорость повыше и поехали.

    Сразу скажу - что это моё видение фреймворков
    Ответ написан
    1 комментарий
  • Как правильно добавить операцию переноса средств между счетами пользователя (финансовый калькулятор на Yii2)?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Пользователь вообще не должен редактировать такие операции. Если это просто учет каких-то финансов - то проблем тут критичных нет. Но если это работа с реальными средствами, то сразу же большая проблема. Представьте себя при взаимодействии с банкоматом. Приходите и редактируете себе баланс с 1 рубля на 1000 рублей)) Ну это будет странно.

    Решение:
    1. Убрать возможность редактирования вообще. Только + (пополнение) и - (снятие) ну и максимум удалить операцию, но тут надо только админам))
    2. То же самое что и первое + добавить новый тип "перевод" и новую колонку transfer_id
    При переводе мы вписываем в тип "перевод", а в колонку transfer_id добавляем id платежного средства пользователя (банковская карта, кошелек с наличными и т.д.), внешний ключ на таблицу 'sources', где есть описание всех средств
    Ответ написан
  • Проблемы с PDO в ООП, что делать?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Решение:
    class Database {
      private $mysqli;
    
      public function __construct(){
        $dsn = "mysql:host=localhost;dbname=banan165_database";
        $this->mysqli = new PDO($dsn, "root", "");
      }
      public function query($sql){
       return $this->mysqli->query($sql);
      }
    }
    
    $db = new Database();
    $db->query("INSERT INTO categories(name) VALUES('PDO')");


    Но если правильно - так не делается.
    Ответ написан
    7 комментариев
  • Возможно ли на локальном сайте сделать выход в интернет?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Можно, если есть интернет.
    Ответ написан
    Комментировать
  • Как настроить логин на сайт через контакт HWIOAuthBundle + Symfony4.3?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Настройки симфони тут не причем)) Естественно не будет работать, вместо localhost укажите свой домен. Настройте виртуальные хосты. Скорее всего будет проблема решена. Надо посылать на указанный домен в настройках ВК и запрос уже посылать на этот домен
    Ответ написан
  • Как заменить число в TH при нажатии на картинку?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    $('.like').click(function () {
     $('.score'). innerHTML += 1
    });
    Ответ написан
    2 комментария
  • Как выбрать из БД дату но вывести только месяц и день?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    С помощью date() date('d.m', strtotime('2019-09-11'))

    или DateTimeImmutable

    (new DateTimeImmutable('2019-09-11'))->format('d.m')
    Ответ написан
  • Написал класс но он выглядит как обычная функция, это нормально?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Отдельные классы это хорошая практика. Однако, саму проверку стоит размещать там, где она используется. В вашем случае это сделано не совсем а равильно. Проверку нужно поместить в класс, объявления, но при этом ссылаться на проверку класса промо.

    Будет примерно так:
    public function getPromotion(): ?Promotion
    {
         return new Promotion($this->promotion_id, $this->promotion_time);
    }


    Далее помещаем метод проверки:
    public function isPromoted(): bool
    {
         return $this—>getPromotion()->isPromoted()
    }


    Если у вас данные для метода могут быть пустыми, тогда условие может выглядеть так
    public function isPromoted(): bool
    {
         return $this->getPromotion() ? $this—>getPromotion()->isPromoted() : false
    }


    Не претендую ни на что) Я делаю так) Создавать дополнительные классы это хорошо. Можно даже создать отдельный класс для Id. В типизации будет удобно работать. И понятно всем. Да и в целом не будет все в одном классе.
    Ответ написан
  • Выборка данных с перебором. Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Настройте связи в моделях и сделайте по примеру как тут

    У вас получится вызов по связи: $model->serSpec

    Выборка из документации:

    class Customer extends ActiveRecord
    {
        public function getOrders()
        {
            return $this->hasMany(Order::className(), ['customer_id' => 'id']);
        }
    }
    
    class Order extends ActiveRecord
    {
        public function getCustomer()
        {
            return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
        }
    }


    // SELECT * FROM `customer` WHERE `id` = 123
    $customer = Customer::findOne(123);
    
    // SELECT * FROM `order` WHERE `customer_id` = 123
    // $orders - это массив объектов Order
    $orders = $customer->orders;
    Ответ написан
    7 комментариев
  • Yii2 Как добавить условие в запросе в связанных данных?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    $emails = Email::find()
        ->joinWith(['emailRecipients' => static function (ActiveQuery $query) {
            $query->andWhere(['email_recipient.status' => EmailRecipient::EMAIL_RECIPIENT_STATUS_NEW]);
        }])
        ->where(['email.status' => Email::EMAIL_STATUS_NEW])
        ->asArray()
        ->all();
    Ответ написан
    8 комментариев
  • Почему не отображается гугл карта?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    В Yii скрипты должны подключаться в верстке специальным способом:

    Добавляем во view:
    <div id="map"></div>

    <?php 
    $js = <<< JS
          function initMap() {
            var map = new google.maps.Map(document.getElementById('map'), {
              zoom: 8,
              center: {lat: -34.397, lng: 150.644}
            });
            var geocoder = new google.maps.Geocoder();
    
            document.getElementById('submit').addEventListener('click', function() {
              geocodeAddress(geocoder, map);
            });
          }
    
          function geocodeAddress(geocoder, resultsMap) {
            var address = document.getElementById('address').value;
            geocoder.geocode({'address': address}, function(results, status) {
              if (status === 'OK') {
                resultsMap.setCenter(results[0].geometry.location);
                var marker = new google.maps.Marker({
                  map: resultsMap,
                  position: results[0].geometry.location
                });
              } else {
                alert('Geocode was not successful for the following reason: ' + status);
              }
            });
          }
    JS;
    
    $this->registerJs( $js, $position = yii\web\View::POS_READY, $key = null );
    ?>​

    ВАШ ПРИМЕР


    <?php 
    $js = <<< JS
          var autocompletes, marker, infowindow, map;
        function initMap() {
             map = new google.maps.Map(document.getElementById('map'), {
              center: {lat: -33.8688, lng: 151.2195},
              zoom: 13
            });
            infowindow = new google.maps.InfoWindow();
    
            marker = new google.maps.Marker({
              map: map
            });
    
            // адрес откуда
            var inputs = document.querySelector('#place_departure');
            autocompletes = new google.maps.places.Autocomplete(inputs);
            
            google.maps.event.addListener(autocompletes, 'place_changed', function () {
                marker.setVisible(false);
                infowindow.close();
    
                var place = autocompletes.getPlace();
                if (!place.geometry) {
                    window.alert("No details available for input: '" + place.name + "'");
                    return;
                }
                
                  if (place.geometry.viewport) {
                    map.fitBounds(place.geometry.viewport);
                  } else {
                    map.setCenter(place.geometry.location);
                    map.setZoom(17);
                  }
                  
                  marker.setIcon(({
                    url: place.icon,
                    scaledSize: new google.maps.Size(35, 35)
                  }));
                  marker.setPosition(place.geometry.location);
                  marker.setVisible(true);
                  
                  var place_departure = '';
                  if (place.address_components) {
                    place_departure = [
                      (place.address_components[0] && place.address_components[0].short_name || ''),
                      (place.address_components[1] && place.address_components[1].short_name || ''),
                      (place.address_components[2] && place.address_components[2].short_name || '')
                    ].join(' ');
                  }
    
                  infowindow.setContent('<div><strong>' + place.name + '</strong><br>' + place_departure);
                  infowindow.open(map, marker);
            });
        }
    JS;
    
    $this->registerJs( $js, $position = yii\web\View::POS_READY, $key = null );
    ?>​



    Добавляем в шаблон (layout)

    <script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"></script>
    Ответ написан
    8 комментариев
  • Yii2 как в контроллере понять, что в форме нажата кнопка Save?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Кнопка Save тут ни причем.

    2. У модели есть 2 метода $model->save() и $model->validate()
    $model->save() - сохраняет и валидирует
    $model->validate() - только валидирует данные.

    У вас должно быть немного иначе:
    if ($model->validate()) {
            ///здесь ваш код
            $model->save()
            пишем данные, закрываем модалку
        } else {
            выводим результат валидации (рендерим аякс? или встроенная валидация?)
        }
    }


    С загрузкой данных из формы
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    ///code
       $model->save()
    }


    Валидацию вы выбираете сами. Я думаю, что простые правила валидации валидируются ajax. А сложные уже после нажатия кнопки и запроса на сервер. Например, длину текста валидируем на клиенте. А сложную логику после запроса

    Вопрос: как мне в контроллере проверить, что была нажата кнопка Save в форме?

    Зачем вам проверять нажата ли кнопка? Это вопрос JS. А в контроллере вы смотрите на переданные данные из формы. Если они есть, то вы их обрабатываете. Если их нет, то вы показываете форму.
    Ответ написан
    2 комментария
  • Yii2. Как записать запись в другую таблицу при транзакции?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Я конечно всё понимаю, но где у вас связь. Данные вы заполняете, а сама связь не создается у вас... Она же не появляется ни откуда...

    Создавайте связь напрямую:
    $customer = Customer::findOne(123);
    $order = new Order();
    $order->subtotal = 100;
    // ...
    
    // установка атрибута, которой задаёт связь "customer" в объекте Order
    $order->customer_id = $customer->id;
    $order->save();


    По вашему примеру
    if($model->load(Yii::$app->request->post()) && $address->load(Yii::$app->request->post())){
                  $transaction = Yii::$app->db->beginTransaction();
                  try  {
                      if ($model->save()) {
                          $address->user_id = $model->id
                          Yii::$app->session->setFlash('success', 'Model save');
                          $address->save();
    
                          $transaction->commit();
                          Yii::$app->session->setFlash('success', 'User added');
                          return $this->refresh();
                      } else {
                          $transaction->rollBack();
                          Yii::$app->session->setFlash('error', 'Data error');
                      }
                  } catch (Exception $e) {
                      $transaction->rollBack();
                      Yii::$app->session->setFlash('error', 'Data error2222');
                  }
              }


    Или используйте link():
    $customer = Customer::findOne(123);
    $order = new Order();
    $order->subtotal = 100;
    // ...
    
    $order->link('customer', $customer);

    По вашему примеру
    if($model->load(Yii::$app->request->post()) && $address->load(Yii::$app->request->post())){
                  $transaction = Yii::$app->db->beginTransaction();
                  try  {
                      if ($model->save()) {
                          $address->link('nameRelationModel', $model)
                          Yii::$app->session->setFlash('success', 'Model save');
                          $address->save();
    
                          $transaction->commit();
                          Yii::$app->session->setFlash('success', 'User added');
                          return $this->refresh();
                      } else {
                          $transaction->rollBack();
                          Yii::$app->session->setFlash('error', 'Data error');
                      }
                  } catch (Exception $e) {
                      $transaction->rollBack();
                      Yii::$app->session->setFlash('error', 'Data error2222');
                  }
              }


    Информация в документации
    Ответ написан
    Комментировать
  • Yii2. Как переносить записи на другую страницу при использовании пагинации?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вы не правильно поняли работу пиганатора. Посмотрите как написано в документации.

    https://www.yiiframework.com/doc/api/2.0/yii-data-...

    Выборка записей меняется с помощью
    $models = $query->offset($pages->offset)
            ->limit($pages->limit)
            ->all();
    Ответ написан
    Комментировать
  • Не работает backend при альтернативном размещении каталогов Yii2 advanced?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Если у вас htaccess настроен правильно, то переходите ко второму пункту. Если не настроен - настройте.
    2. Посмотрите есть ли префикс у BaseUrl.
    3. Проверьте Настройки у URL менеджера

    Вот инструкция: https://кодер.укр/записи/htaccess-для-yii-2-advanced
    Ответ написан
    1 комментарий
  • Как получить название города вместо id?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Читайте документацию klard.

    1. Получение названия можно осуществить через api.

    2. Так же можно хранить информацию о городах в своей таблице city где будет храниться ваш id и klard_id vk_id name

    3. Ещё один вариант это сохранять у записи имя города и id Кларла.

    Лучше всего использовать второй вариант.

    Смысл такой. Вы ищите через поле формы города по Ajax у Кларда. Далее пере сохранением записи смотрите есть ли такой город в вашей базе данных. Если есть, то просто вытаскиваем id если нет, то создаём новый город по данным кларда и получаем уже ваш id города.

    Но хранить ID кладра и получать по api название города крайне не советую. Так вы зависите от системы Кларда. Если у них что-то случиться вам восстановить это будет сложно. В лучшем случае у вас просто не подгрузится название города.
    Ответ написан
    Комментировать
  • Как называется этот вариант проверки данных?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Тернарный оператор
    Ответ написан
    Комментировать
  • Метод app\controllers\MainController::indexAction не найден?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    У вас регистр букв в namespace другой.
    app\controllers\MainController::indexAction
    Нужно
    App\Controllers\MainController::indexAction
    Ответ написан
    Комментировать
  • Как сделать верстку по макету?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Вот вам детально все расписано)

    https://m.habr.com/ru/post/202408/

    - Шрифты есть в макете PSD. Их можно загуглить, скачать и подключить. Ели уникальные, то дизайнер их должен даже выслать.
    - Цвета можно из маркета PSD пипеткой или выбрав нужный элемент.
    - Размеры шрифта указываются в пунктах. Нужно просто настроить фотошоп чтобы отображал в px.
    - Размеры других элементов могут указываться в мм, если это так, то нужно тоже просто перевести их в пиксели.

    Ну и так далее. Информации по этой теме в интернете много. Есть даже видео и куча уроков. Я вам скинул один пример. Для старта этого будет достаточно.
    Ответ написан
    1 комментарий
  • Как исправить ошибку "The file or directory to be published does not exist"?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Ошбику можно исправить таким путем прописав в конфиге:
    'aliases' => [
            '@bower' => '@vendor/bower-asset',
            '@npm' => '@vendor/npm-asset',
        ],
    Ответ написан
    Комментировать