• Yii2: как работает unique в валидации на сервере?

    bagiroff777
    @bagiroff777
    Веб-разработчик
    Каждый валидатор - это отдельный класс. Например, "unique" лежит по адресу @vendor/yiisoft/yii2/validators/UniqueValidator.php. Там достаточно комментариев в коде, чтобы понять, что и как происходит.
    Ответ написан
    Комментировать
  • От куда вк берет список всех стран и городов?

    alsopub
    @alsopub
    С таким количеством пользователей можно и актуальный список улиц поддерживать на основе пользовательского фидбека.
    Ответ написан
    Комментировать
  • Как реализовать оплату как на aliexpress?

    @dmitryKovalskiy
    программист средней руки
    Для сферического коня в вакууме? Реализовать прием денег клиент-сайт и протокол общения сайт-продавец с уведомлениями о заказах, факте оплаты и прочее. Затем реализовать систему взаиморасчетов сайт-продавец.
    Ответ написан
    Комментировать
  • Как реализовать оплату как на aliexpress?

    kompi
    @kompi
    nullstack devoops
    Холд денежных средств у посредника, т.е. у сайта/сервиса. А далее, если клиент и продавец не имеет друг к другу претензий, то окончательный перевод продавцу.
    Ответ написан
    Комментировать
  • Как вернуть мотивацию к обучению?

    При повторной потере мотивации алгоритм следующий:
    1) Идем высыпаемся. По-нормальному так, без будильников. Чтоб глаза вообще больше не закрывались.
    2) Если мотивация не вернулась (возвращается в 70% случаев) - берем велик (хотя можно и пешком) - и на улицу. Если есть приличный парк в городе - находим пару нестандартных физ. упражнений (можно боевых), пытаемся выполнить. Работа с телом и физические нагрузки - это совершенно другая часть вашего сознания, про нее нужно не забывать.
    3) Если мотивация не вернулась (уже где-то 85% случаев) - берем случайную книгу (не техническую), в идеале - из жанра который вам нравится. Читаем. Спокойно, страницы не считаем.
    4) Если не вернулась, повторить с п. 1 до пяти раз, не думая о времени и выполняя только самые важные дела (срочные задачи по учебе, работа, если есть), можно даже попросить родных/знакомых помочь по дому и бытовым делам, чтобы себя разгрузить.
    5) Если не помогло после 5 раз, задаем новый вопрос на тостере, подробно описываем что делали).

    Хотя бы один из п. 1-3 выполняем для профилактики каждый выходной.
    P.S. в принципе плохо сравнивать себя с кем-то - для "сравнения" на свете есть всякие соревнования и состязания, где есть правила и контекст. В жизни правил нет, один учится в MIT, другой учится в колледже в России - какие могут быть сравнения? Вы думаете тут большинство людей за один год все узнало и всего добилось? Вы глубоко заблуждаетесь) PHP-шники-выскочки не в счет, у них искаженное представление о реальности.
    Ответ написан
    11 комментариев
  • Как узнать координаты мыши относительно Canvas (C# WPF)?

    Nipheris
    @Nipheris Куратор тега C#
    Espleth Касательно WinForms - можно обойтись без магических констант (которые неизбежно будут разные на разных операционках, с разными темами и с разыми DPI, т.е. одно и то же значение использовать в принципе невозможно), для этого есть ClientSize
    lucky_e3 Касательно WPF - совершенно не понятно, почему вы в GetPosition передали null вместо вашей канвы: черным по белому написано https://msdn.microsoft.com/en-us/library/ms591423%... - возвращает позицию относительно указанного элемента. Canvas является FrameworkElement, поэтому и IInputElement тоже. Поэтому запросите позицию относительно канвы и не надо констант.
    Ответ написан
    2 комментария
  • Почему не работает foreach?

    @EvilBeaver
    упоротый гик
    Блин, что за адово нагромождение if/else, сделайте уже таблицу переходов. И где там у вас foreach, который не работает? Вы предлагаете нам самим его искать и угадывать тот ли это foreach? Если хотите получить ответ на вопрос, потрудитесь облегчить работу тем, кто будет отвечать.

    if (che.GetType().ToString().IndexOf("CheckBox") > -1)


    ААААА!!!!! Срочно напишите заявление об увольнении, ну нельзя же так, господи!!!
    Ответ написан
    3 комментария
  • Существуют ли НЕ видеоуроки по различным ЯП?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть такие штуки, книги называются, раньше говорят было модно.
    Ответ написан
    9 комментариев
  • Как и в каких случаях использовать DI в Yii2?

    SamDark
    @SamDark
    Yii2 core team
    DI именно в вашем случае не при чём. Это способ реализации, а не сама идея. Идея состоит в том, что вам нужно реализовать принцип инверсии зависимостей. То есть начать работать с интерфейсами, а не с конкретными реализациями.

    Чтобы быть универсальным и переносимым, модуль не должен знать о моделях извне себя. Вместо этого он должен выражать свои требования в виде интерфейса, а внешние модели этот интерфейс должны реализовывать.

    Для вашего примера делаем в модуле Article делаем интерфейсы:

    interface ArticleInterface
    {
        public function getTitle();
        public function getAuthor();
    }
    
    interface ArticleAuthorInterface
    {
        public function getName();
        public function getID();
    }


    Далее в пределах модуля используем только интерфейсы, а не сами модели:

    public function renderArticle(ArticleInterface $article)
    {
        return $this->renderPartial('_article', [
             'author' => $article->getAuthor(), 
             'title' => $article->getTitle()
        ]);
    }


    Вне модуля нам придётся реализовать интерфейсы в моделях:

    class Article extends ActiveRecord implements ArticleInterface
    {
       // ...
    }
    Ответ написан
    34 комментария
  • Как найти строки, в которых отсутствует строка?

    @wncm
    Во первых, ".*" - жадный поиск, то есть в него попадет и "onclick" и ">". Но даже если заменить ".*" на ".*?", то условие "(?!onclick)" всё равно будет "съедаться" точкой (иначе было бы, если вместо условия было выражение ".*?onclick").
    Я тоже не слишком разбираюсь в регулярных выражениях, но вот, вроде, рабочий вариант:
    <a ((?!onclick).)*?>
    Хотя выглядит криво как-то. Наверняка можно сделать изящнее.

    Вообще лучше убрать отрицание из регуляторки и переложить в код. В зависимости от языка, могут быть разные способы сделать это, но самый очевидный и рабочий везде - сначала найти все якоря, а после исключить якоря с "onclick". Что-то вроде:
    data.findall("<a .*?>").replace("<a .*?onclick.*?>", "")
    Ответ написан
    1 комментарий
  • Каковы основные принципы регистрации и авторизации через социальные сети OAuth2?

    hbuser
    @hbuser Автор вопроса
    Отвечу сам себе.
    Здесь есть полезная конкретная информация о технической реализации.

    А если вкратце, то...

    Для авторизации, регистрации используется все та же таблица 'users'. Вместе с обычной регистрацией и авторизацией, когда при регистрации (в самом простом виде) в таблицу 'users' добавляются email, password и login пользователя, а при авторизации проверяется соответствие введенных login'а и password'а существующим в базе данных, аналогичным образом используется и регистрация/авторизация через социальные сети. Только в данном случае источником данных о пользователе для его регистрации является не непосредственный пользователь, который вводит данные в форму, а соц. сеть. Регистрация в данном случае достаточно прозрачная, т.е. не видна пользователю. Схема примерно следующая (без особенностей работы Oauth-протокола):


    1) Пользователь выбирает вход через соц. сеть.
    2) Происходит обращение к странице авторизации в этой соц. сети, если человек еще не авторизовывался там. После ввода данных, а если он ранее авторизовывался, происходит запрос на разрешение использования его данных.
    3) Если человек отказывается, то на этом конец. Если дает согласие, то выполняется перенаправление на указанную в настройках Oauth страницу сайта.
    4) У каждого пользователя в соц. сетях есть свой уникальный идентификатор, который можно запрашивать. Для своей таблицы 'users' нужно добавить пару дополнительных полей (например, вот такие): auth_via (enum('native, 'vk', 'mailru', '...')) - для обозначения типа регистрации пользователя, и social_id - здесь будет храниться уникальный идентификатор в соц. сети. Если нужно хранить какие-то специфические данные этого пользователя из соц. сетей, то можно создать доп. поля для этих данных.
    5) После того, как пользователь дал разрешение на использование его данных, необходимо запросить нужные данные от соц. сети, в т.ч. и идентификатор пользователя в соц. сети. Вот здесь и начинается невидимый процесс регистрации. Нужно проверить есть ли в БД пользователь с таким social_id, если нет, то вставляем social_id, данные пользователя из соц. сети, по необходимости, в БД. Все, пользователь зарегистрирован.
    Если же данные о пользователе есть, то необходимо запросить актуальные данные из соц. сети, сравнить их с теми, что в базе и если они изменились, то обновить их и в своей базе данных, если нет, то просто переходим к следующему шагу.
    6) Создается сессия с данными пользователя.

    Таким образом, к существующей таблице "родной" регистрации пользователей сайта присоединяется, условно говоря, таблица, поля, необходимые для регистрации/авторизации через соц. сети., и друг-другу они не мешают.

    ca4a4b263fd1424085988c9deaeb6d5b.png

    Для пользователя, зарегистрированного из соц. сети пароля и логина, естественно, нет. Они нужны для авторизации. А т.к. пользователь авторизуется с помощью своих логина и пароля в соц. сети, то и указывать здесь нечего. И еще, можно при авторизации, к запросу проверки логина и пароля, добавить условие

    'AND WHERE `auth_via`="native"'

    , чтобы исключить пользователей, зарегистрированных из соц. сетей.

    Как видно, для каждого пользователя в таблице создается внутренний (внутрисайтовый, если так можно выразиться) первичный, автоинкрементный ключ. Соответственно, нет разницы для логики сайта между пользователем, зарегистрированным через соц. сеть и через сайт. Если говорить об интернет-магазине, то, для привязки заказов к пользователю, можно использовать единый, внутренний идентификатор ID.
    Ответ написан
    3 комментария