Задать вопрос
  • Трудно ли будет перенести сайт с yii2 на yii3?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Yii 3 есть в демо версии, однако там много чего не сделано, код постоянно изменяется со структурой. Разрабатывать на нём точно не стоит. В конце концов демо версия может сильно отличаться от релиза. Ждать релиза yii3 не стоит. Точной даты нет. Известен лишь год - 2019.

    Если выберите фреймворк yii2, то реализуйте проект обдуманно. Перенести проект на yii3 будет не сложно, используя паттерны проектирования и отделя бизнес логику от остальной части, за которую отвечает Фреймворк. Подробно написано здесь: Архитектура приложения. Как сделать независимые модули (сервисы)?

    Вы так же можете увидеть прогресс в репозиториях GitHub. Что нового в UPGRADE, и посмотреть структуру пакетов. Да, именно пакетов, а не модулей. Сам больше не будет монолитом он будет собираться по запчастям.

    Изменений в проектировании много, но команда постарается сохранить некоторые привычные вещи. Например, если раньше использовали Yii::t(), то в yii3 нужно будет использовать $this->app->t()
    Заменить через IDE по проекту не сложно! Однако есть и координальные решения связанные с Active Record. С большей вероятностью этот паттерн исчезнет в версии 3.0. Это обсуждается тут. Поэтому стоит обратить внимание на использование сторонних пакетов. В своём проекте вы сможете что-то изменить под Yii3, а вот сторонние расширения могут вообще никогда не переписаться по трети версию.

    Информацию про yii3 можно отслеживать тут. Так же создан новый раздел русскоязычного ФОРУМА. Попробуйте познакомиться с Yii3 Demo
    Ответ написан
    9 комментариев
  • Как вытащить из БД данные за последние 3 часа в yii2 с помощью методов active record?

    $postdb = Posts::find(['login_id' => $id, 'type'=>'update'])
        ->where(['>=', 'some_date_column', new \yii\db\Expression('NOW() - INTERVAL 3 HOUR')])
        ->all();
    Ответ написан
    1 комментарий
  • Почему Windows-юзеры обычно держат окна приложений развёрнутыми на весь экран, а пользователи macOS — нет?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    Потому что на макоси по другому работает рабочий стол и разворачивание на весь экран.
    И навигация по экранам идёт, а не переключение между активными окнами как на винде.
    Если на макоси развернуть на весь экран(по зеленой кнопке "разворачивания" окна), то работать с двумя окнами уже не получится например, развернутый софт всегда будет на своём экране без всего остального. Никаких окон поверх него нельзя разместить, только если рядом на половину экрана растянуть что-то другое.
    При этом есть второй режим это двойной клик в любом месте по шапке окна, тогда окно как раз развернется как в винде. Но я так и не смог осилить этот вариант т.к. навигация удобнее при использовании нескольких рабочих столов. И получается что режим как в винде вроде бы есть, а вроде бы он вообще здесь не к месту. Хотя иногда он помогает когда всё-таки надо использовать несколько связанных окон(например Chrome + Developer Tools отдельным окном при разработке расширения для хрома это вообще единственный возможный вариант работы).

    Так что просто по разному работает. Причем в винде это местами удобнее чем на маке, но на маке свои плюсы есть.
    Ответ написан
    5 комментариев
  • Как задать value для prompt dropdownlist в Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Вы уже задали options и если хотите задать атрибут data-*, то это делается так
    [
       'prompt' => 'Select',
       'data' => [
          'text' => 'Text',
          'image' => 'Image'
       ]
    ]

    или чуть проще
    [
      'prompt' => 'Select',
      'data-text' => 'Text',
      'data-image' => 'Image'
    ]

    Ну а для prompt можно использовать массив
    'prompt' => [
        'text' => 'Select',
        'options' => [
            'value' => 'prompt',
            'class' => 'prompt-class',
            'selected' => 'selected'
        ]
    ]


    В документации всё расписано
    Ответ написан
    1 комментарий
  • Как настроить Rules() для модели в Yii2

    Для автора, скорее всего, вопрос уже не актуален, но может кому-нибудь это пригодится.
    Столкнулся с такой же проблемой. Решил следующим образом, причём средствами дефолтного валидатора:
    1. копируем поле $model->username в $model->oldUsername.
    2. в rules пишем следующее:
    public function rules() {
        return [
            //...
            ['username', 'unique', 'targetClass' => Users::className(), 'message' => 'Имя пользователя уже занято', 'filter' => ['!=', 'username', $this->oldUsername]],
            //...
        ];
    }

    Собственно, вот страница документации, которая помогла решить проблему: www.yiiframework.com/doc-2.0/yii-validators-unique...
    Ответ написан
    2 комментария
  • JQuery: Ajax. Как реализовать передачу нескольких параметров в data?

    @NewMax
    Итог вышесказанного:
    $('form').submit(function(){
        // сериализация всех полей формы
        var data = $(this).serialize();
        // ручное добавление в виде массива
        var data = {name:'name', 'email':email};
        // ручное добавление для хардкорщиков. Не нужно так делать
        var data = 'name='+name+'&email='+email;
        //сформированные тем или иным способом данные можно передавать в $.ajax
        $.ajax({
            url: 'url',
            data: data
            ...
        });
    })
    Ответ написан
    5 комментариев
  • Как быть, если клиент после сделанной мной работы заплатил деньги и через некоторое время требует дополнить сайт и при этом не хочет платить деньги?

    @zuart
    ... уже и не знаю, нуп, похоже ...
    Скажу отчасти то, что сказали выше, но с небольшим отступлением:
    1. Никогда не стоит срываться и что-то там возвращать и удалять то, что сделали. Вам платят не за нечто "материальное", которое можно взять в руки, а платят в первую очередь за ВРЕМЯ и НЕРВЫ, которые вы тратите на работу, а вот это никто не вернет, даже короткое ощущение "эйфории, что типа вот я забрал то, что сделал"...
    2. Никогда не выходите на конфликт с даже самым вредным заказчиком. Оговорили условия "на берегу", получили четкий список работ, за которые получите деньги. Все "вот у нас есть сейчас такой материал, а потом появится еще и надо будет добавить" обсуждаете в формате "ок, тогда сумма с текущим материалом такая, если хотите потом моими силами добавить - сумма вот такая... или пока делаем по такой цене, а потом за отдельную плату добавлю то, что скажете". И все - баста... не нравится - пусть ищут другого исполнителя....
    3. Снова не выходите на конфликт уже после рассчета. И уж тем более не стоит мстить... Поначалу может показаться, что эти поведение "терпилы", однако мой жизненный опыт показал, что заработанная репутация достойного исполнителя передается по "сарафанному радио" и приводит клиентов лучше рекламы. И часто даже по истечение нескольких лет мне звонят старые клиенты и просят выполнить что-то по сайтам, переводят оплату заранее, с нужными доступами никаких проблем не возникает, т.к. просто знают - что я уважаю в первую очередь себя и не опускаюсь до "да я тебе жизнь испоганю"...
    Ответ написан
    Комментировать
  • Как отправить через jquery ajax, get параметры?

    powerdot
    @powerdot
    Ведущий программист
    Мои коллеги говорят все верно, разберемся еще раз с запросом к серверу (к php-файлу):

    jQuery.ajax() с GET-запросом можно заменить на jQuery.get()

    Немного простой теории:
    Когда Вы вручную пробуете организовать Get-запрос, то Вы просто в браузере запрашиваете ссылку со своими параметрами. Когда страница загрузилась - запрос к файлу выполнился.
    mysite.ru/action.php?param=value

    То есть, грубо говоря, чтобы скрипт выполнился, нужно просто запустить (задействовать) нужный файл. Что и делает Ajax. Он просто открывает (как Вы в браузере) эту страницу, но вы этого не видите.
    Причем, он делает это асинхронно (код будет работать и дальше, не ожидая ответа), для чего нужны колбеки (функции, которые выполняются после успешного/неуспешного запроса).

    Как сделать запрос?
    //В этом случае просто выполнился скрипт
    $.get('http://mysite.ru/action.php');
    
    //Параметры можно отправить как в ссылке, так и отдельно
    $.get('http://mysite.ru/action.php?param=1');
    //или
    $.get('http://mysite.ru/action.php', {param: 1});
    
    //а что на счет колбеков?
    //они нужны, чтобы выполнить какой-либо код после выполнения запроса
    //ну, например, если после успешного запроса пишется "ok" в action.php
    $.get('http://mysite.ru/action.php', {param: 1}).done(function(data){
       //data - это аргумент, в который передается содержимое страницы
       if(data=="ok"){
           alert("Сервер всем доволен")
       }
    });
    Ответ написан
    Комментировать
  • Когда использовать protected, private, public и static методы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть такая штука в ООП как инкапсуляция. С этого стоит начать и в принципе можно было бы закончить, если бы не static и не protected.

    public
    Публичные методы класса. Логично да? Какие методы у нас должны быть публичными - те которые составляют интерфейс класса. То есть для, например, класса кеширования у нас должен быть такой интерфейс:
    interface Cache {
        public function get($name);
        public function set($name, $value);
        public function has($name);
        public function remove($name);
        public function removeAll();
    }


    Давайте введем понятие "клиентский код". Это тот код который будет использовать ваш код, ваши объекты. Что он должен знать о реализации ваших классов? Да ничего он знать не должен. Он должен знать только как им пользоваться. Это как раз таки интерфейс и регламентирует. Мол "этот объект позволяет вам брать/сохранять/удалять данные в/из кэша. Клиентский код не знает где кэш находится, есть ли он вообще... да и ему и не нужно.

    private
    Внутренние методы классов. Те которые не входят в интерфейс но нужны, скажем, для уменьшения дублирования реализации.

    class FileCache implements Cache{
        public function has($name) {
              return is_file($this->getCacheFilePath($name));
        }
    
        public function get($name) {
             if (!$this->has($name)) {
                  return null;
             }
     
             return unserialize(file_get_contents($this->getCacheFilePath($name)));
        }
    
        private function getCacheFilePath($name) {
             return $this->cacheDir . '/' . $name;
        }
    }


    protected
    Иногда у вас появляется необходимость вынести общую реализацию внутренних методов в базовый какой-то абстрактный класс. Например у вас есть несколько реализаций кеша для одного и того же хранилища или что-либо такое. Тогда вы заводите абстрактный класс, выносите туда всю общую реализацию в protected методах ну и т.д. Придумывать пример лень... Придумайте сами. Суть в том что protected методы желательно использовать только в абстрактных классах (но не как абстрактные методы, хотя всякое может быть) или если вы планируете дать возможность расширять ваш класс (но если честно, это крайне редко бывает).

    static
    Статические методы, это всяческие методы хелперы. Например в языках типа Java есть такое понятие как именованные конструкторы. Мол когда для конструирования объектов нужно много данных переделать или что-то еще, для удобства заводят статический метод какой а в нем уже реализуют какую-то логику. Желательно вообще что бы статический метод не содержал много логики, но... всякое бывает. Вообще тут стоит еще поподробнее почитать о том как себя ведут статические методы и свойства, в чем их особенность и т.д. Попробуйте тот же сингелтон сделать к примеру.

    class Template($content) {
        public static fromFile($path) {
             return new static(file_get_contents($path));
        }
    }


    Вот... Возможно человеки вроде FanatPHP разгромят мой ответ, или дополнят его...

    Так же если вам хочется научиться правильно составлять интерфейсы классов, следует почитать про low coupling и high cohesion. Эти два принципа должны заставить вас соблюдать баланс и держать в интерфейсе класса только то, что там должно быть. Так же к вопросу о наследовании можно подключить принцип подстановки Барбары Лисков. Даже на той же википедии почитайте. А там если станет интересно в принципе можно поискать интересные материалы по GRASP и SOLID.
    Ответ написан
    4 комментария
  • Заставить ajax работать синхронно?

    @serega_kaktus
    Программист-самоучка, фрилансер
    тут варианта 2 - написать свой js движок, в котором ajax будет синхронный, продвинуть этот движок во все браузеры, параллельно поправить стандарты ActionScript. До даже тогда ваш говнокод не заработает, потому что надо хотя бы какое-то значение возвращать из функции checkTranslit.
    Ну или можно просто запомнить одно простое правило - если нужно выполнить какое-то действие после завершения ajax запроса, то это действие должно выполнятся в success колбэке.
    Перепишите код
    //валидатор
    checkTranslit($('#translit').val());
        
    
    //запрос 
    function checkTranslit(translit){
        $.ajax({
            url: 'http://site.com/scripts/checkTranslit.php',
            data: {'translit': translit},
            type: 'POST',
            dataType: 'json',
            async: false,
            success: function(data){
              if (!answer.result) {
                errorArray.push("translit");//кладем поле в массив с ошибками
                console.log('value is: ' + $('#translit').val());
                console.log('result is: ' + answer.result);
              } 
            },
            error: function(error){
               console.log('error is: ' + error + '\n');  
                return error;
            }
        });
    
    }

    Если у вас dataType: json, зачем вы какие-то манипуляции с ними в колбэках проводите? Скрипт на сервере должен возвращать json, а в колбэке уже будет десерализованный объект
    Ответ написан
    Комментировать
  • Заставить ajax работать синхронно?

    jqXHR-объекты, возвращаемые методом jQuery.ajax() реализуют интерфейс Promise, предоставляя им все свойства, методы и поведение Promise. Метод jqXHR.done() интерфейса Promise пришел на смену jqXHR.success().
    api.jquery.com/jQuery.ajax
    Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are deprecated as of jQuery 1.8. To prepare your code for their eventual removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

    Исходя из этого можно получать jqXHR-объект и слушать его события.
    Пример
    Ответ написан
    Комментировать
  • (YII2)Как устроить поиск AR при поиске нескольких значений одного параметра?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Я так понимаю что вместо
    andFilterWhere
    должно быть
    orFilterWhere
    или скорее всего так:
    $query->andFilterWhere(['or',
    ['like', 'city', $city_str1],
    ['like', 'city', $city_str2],
    ....
    ['like', 'city', $city_str999],
    ]);

    Потому как Ваш вариант найдет город, только если он называется как-то так "Казань-Самара-Ростовск"
    Ответ написан
  • Как в yii 2 стилизовать виджет?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Используется yii\bootstrap\ButtonDropdown.
    Судя по документации есть свойство options.
    Вот это и используйте.
    echo ButtonDropdown::widget([
                'label' => $current,
                'dropdown' => [
                    'items' => $items,
                ],
                'options' => [
                     'class' => 'class_name'
                ]
            ]);
    Ответ написан
    3 комментария
  • Как запретить добавление GET-параметров к уже существующим?

    @karminski
    Senior React.JS Developer
    Нужно в виджете ActiveForm добавить параметр action равный вашему route без параметров. Например,

    $form = ActiveForm::begin([
        'id' => 'search-cleaners',
        'method' => 'get',
        'action' => ['/cleaner/list'],
        'options' =>['class' => 'form-vertical'],
    ]);
    Ответ написан
    Комментировать
  • Когда в PHP использовать интерфейсы, а когда абстрактные классы?

    try4tune
    @try4tune
    С точки зрения архитектуры:

    Интерфейс описывает свойства. Обратите внимание на классические названия интерфейсов: Throwable, Countable, Comparable, Iterable и т.д. Возьмем, к примеру, интерфейс Rollable (катящийся), и Foldable (складывающийся).

    Абстрактный класс же описывает сущность. Например, стол: Table_Abstract. Стол может быть деревянным, тогда будет Table_Wood extends Table_Abstract. Также стол может быть хирургическим: Table_Surgical extends Table_Abstract. В таком случае Table_Abstract объединяет общий свойства всех столов (скажем, площадь поверхности, наличие ножек и т.п.). А конкретный класс описывает сущность определенного типа столов.

    Связью же интерфейсов и классов Вы описываете свойства. Например, стол можно катить: Table_Abstract implements Rollable. Деревянный стол, например, можно сложить: Table_Wood implements Foldable.
    Ответ написан
    5 комментариев
  • Различия между классом и объектом?

    homm
    @homm
    Может быть вам легче будет понять, если вы будете думать о классе как о наборе функций, а об объекте как о наборе данных.

    Некоторые функции в классе могут быть использованы только с набором данных (т.е. объектом), который передается неявно, когда вы указываете $object->method().

    Другие функции не требуют объекта, поэтому могут быть вызваны напрямую из класса.

    С этой точки зрения очень логично выглядит Python, где у любого метода есть явный аргумент self, указывающий на объект, из которого был вызван метод. А запись object.method(5) является краткой записью ObjectClass.method(object, 5).
    Ответ написан
    1 комментарий
  • Знания Junior php разработчика?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что должен знать идеальный джуниор (мое личное мнение):

    - Сетевой стэк. Нужно иметь хотя бы базовое представление о том как с сервером общаются. Ну то есть не нужно лезть в дебри, но понимать что такое HTTP или чем TCP от UDP отличается - нужно. В целом это пара часов чтения википедии.
    - GIT или любая другая распределенная VCS. Базовые навыки, что бы хотя бы понимал что есть git revert или git rebase, что такое фичабрэнчи и примерное представление как это работает и зачем надо.
    - Базовые основы unix. Ну то есть что бы не пугаться таких вещей как ssh хотя бы.
    - PHP. Без этого никуда. Он должен понимать что такое слабая динамическая типизация (не заучивать табличку кастов типов, а понимать плюсы и минусы, такая же история с приоритетами операторов - не заучивать а знать как избегать проблем с чтением кода)
    - Понимать что код чаще читают чем пишут, а потому не экономить 5 минут на написании кода, а писать так, чтобы сэкономить 30 минут человеку, разбирающемуся в куске кода.
    - Знать базовые вещи в плане безопасности. XSS и как защищаться, SQL инъекции и как защищаться, CSRF, MITM. Понимать что такое NDA, что данные пользователей - секретная информация. Как хэшировать пароли (не md5 а password_hash) и почему это важно.
    - Знать SQL. Глубоких знаний не требуется, нужно лишь понимание того, что такое нормальная форма, желательно разобраться с вопросом денормализации данных. Идеально иметь хотя бы базовые представления о том как работать с NoSQL решениями.
    - Процедурное программирование: почему глобальные переменные порождают сложность, что такое состояние, как можно использовать классы для изоляции состояния и т.д. Инкапсуляция. Инварианты, пост/пред условия, сохранение целостности...
    - Разделение ответственности. Это один из важнейших принципов, и упрощать все это до "mvc фреймворк" слегка неправильно. Вы должны понимать что от чего отделяете и главное зачем.
    - Автоматические тесты. Джуниор должен знать что это такое и иметь хотя бы минимальный опыт их написания. Должен понимать разницу между юнит и интеграционными тестами. Быть знакомым с пирамидой тестирования.
    - Уметь решать стандартные задачи не задавая слишком много вопросов. Например регистрацию пользователя по email-у вы должны написать, или авторизацию через соц сети, или комментарии, или новостную ленту.
    - Уметь дебажить. xdebug, blackfire и тд.

    В целом где-то за годик весь этот список можно влегкую покрыть с нуля.

    p.s. Я в списке специально не указывал ООП, поскольку всеравно первые пару лет у разработчиков выходит процедурщина на классах. Это не плохо, но того что в моем списке более чем должно хватать для решения стандартных задач. Но термины вроде "инкапсуляция/полиморфизм/наследование" требуются в обязательном порядке подавляющем количеством интервьюверов, а стало быть знать это надо. Единственное что - рекомендую в свободное время глубже погрузиться в этот вопрос а не тупо заучивать формулировки.

    Так же вещи вроде docker джуниорам знать не обязательно просто потому, что их врядли допустят сходу к управлению инфраструктурой. А так пару неделек на изучение и вперед.
    Ответ написан
    12 комментариев
  • Можно ли в yii2 из коробки сделать динамический slug?

    the_mix
    @the_mix Автор вопроса
    web developer
    Нашел:
    \yii\helpers\BaseInflector::slug($string)
    Ответ написан
    Комментировать
  • Как посчитать сумму чисел в столбце на Yii2?

    @profaller
    SomeModel::find()->sum('col_name');
    Ответ написан
    Комментировать