Задать вопрос
  • Почему не получается обратиться к связи через геттер?

    qonand
    @qonand
    Software Engineer
    когда Вы обращаетесь к связи через метод $model->getTest() Вы в результате получаете объект ActiveQuery (объект запроса к базе) у которого вообще нет атрибутов, в том числе и prop. Когда же Вы обращаетесь к связи как с свойству $model->test, Yii автоматически выполняет запрос, обрабатывает результаты и формирует объект ActiveRecord (т.е. Вашу модель)
    Ответ написан
    Комментировать
  • Почему не получается обратиться к связи через геттер?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Потому что если Вы обращаетесь как к атрибуту - это одно, а как к методу другое.
    $model->test аналог $model->getTest()->one()
    Ответ написан
    1 комментарий
  • Как получить название изображения?

    riky
    @riky
    Laravel
    так это и есть картинка, то что нет расширения jpg ничего не значит.
    самое главное Content-Type
    Ответ написан
    Комментировать
  • Для чего в Yii2 именовать поведения?

    qonand
    @qonand
    Software Engineer
    использование именованных поведений позволяет:
    1. Откреплять по необходимости поведения от компонента c помощью функции detachBehavior
    2. Работать с поведением в классах-потомках (например, изменять конфигурацию поведения и т.п.)
    3. Получать собственно сам объект поведения и при необходимости с ним работать
    Ответ написан
    Комментировать
  • Правильно ли вносить изменения в стандартный bootstrap.css файл?

    pashted
    @pashted
    тыжпрограммист
    обычно создают свой файл для того, чтобы твои изменения не затирались при обновлениях и чтобы можно было легко понять, что было изменено.

    чтобы не конфликтовали, твой файл должен грузиться последним
    Ответ написан
    Комментировать
  • Какими методами можно узнать доставлено ли email письмо?

    proudmore
    @proudmore
    Можно следящий пиксель впихнуть, со ссылкой на ваш ресурс. Есть обращение к пикселю - письмо прочитано
    Ответ написан
    4 комментария
  • На чем лучше и быстрее написать парсер (PHP)?

    muhammad_97
    @muhammad_97
    PHP-разработчик
    DiDom: https://github.com/Imangazaliev/DiDOM

    + высокая скорость работы (сравнение с другими парсерами)
    + хорошая дока
    + большое количество поддерживаемых селекторов
    + самое главное - тесты

    Простой пример:

    $document = new Document('http://www.example.com/', true);
    
    echo $document->first('title::text');


    Чуть посложнее - парсим все ссылки:

    $links = $document->find('a[href]::attr(href)');
    
    var_dump($links);


    Еще сложнее - получить адреса всех ссылок-картинок:

    $links = $document->find('a[href]:has(img)::attr(href)');
    
    var_dump($links);


    Другие варианты:
    - Symfony DomCrawler
    - Zend Dom Query
    Ответ написан
    3 комментария
  • Вечные куки cookie. Что сейчас в моде?

    littleguga
    @littleguga
    Не стыдно не знать, а стыдно не интересоваться.
    Очистил куки - многие это делают и очень часто не только для конкретного сайта, а просто для всех.
    Поменял ip - я с ноутбуком из дома вышел, пересел в метро - ой, какой же я злодей.

    Поймите, что есть 2 вида пользователей(относительно данного вопроса):
    те, кто захотят, чтобы их не идентифицировали - не поможет ничего, он откроет в новом браузере, почистит локальное хранилище, запустит виртуалку, впн и т.д. Если он захочет, то он это сделает.
    те, кому пофиг - для них и обычные куки подойдут

    Так что советую не тратить время на бессмысленные действия.
    Ответ написан
    2 комментария
  • Как подобрать размеры изображений, что бы получить прямоугольник?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Делите Ваш будущий прямоугольник на сетку областей 50x50px, например.
    2. Определяете отношения сторон у каждого изображения и вписываете в сегменты сетки (определяете через кратность).
    3. После получения "фигурок" - Вам их нужно расположить друг за другом.
    4. Самый простой способ заполнения с максимальной площадью - это в высоту 6 блоков и кирпичная кладка: остался зазор - ищем подходящий блок по высоте блок, не нашли подходящий блок - ставим другой вместо предыдущего и снова ищем.
    Ответ написан
    3 комментария
  • Как подобрать размеры изображений, что бы получить прямоугольник?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    Тут скорее всего без обрезки можно обойтись только в исключительных случаях! Проще всего приводить все изображения к одному формату отношения сторон и потом их выстраивать. Например взять за l = 100 точек. Пройтись по всем изображениям, привести все длины или высоты к формату n * l. Другую сторону привести к m * l подрезкой и отсюда уже выстраивать. Ну это общий план начала действий. А вообще эта задача похожа на "задачу укладки рюкзака". Погуглите, может какие нить идеи в голову придут.
    Ответ написан
    1 комментарий
  • Как проверить что в начале и в конце строки есть число?

    mlnkv
    @mlnkv
    JavaScript Developer
    var regexp = /^\d|\d$/
    var string = 'Lorem ipsum1'
    
    if (regexp.test(string)) {
      // ...
    } else {
      // ...
    }
    Ответ написан
    Комментировать
  • Как правильно добавлять в div элементы, на которые добавляются события?

    olegshilov
    @olegshilov
    function handleNewElementClick() {
      console.log('handleNewElementClick');
    }
    
    function createDivWithData(data) {
      const newElement = document.createElement('div');
      newElement.setAttribute('data-somevalue', data.somevalue);
      newElement.addEventListener('click', handleNewElementClick);
    
      return newElement;
    }
    
    const container = document.getElementById('container');
    for (i = 1; i <= 10; i++) {
      container.appendChild(createDivWithData({ somevalue: i }))
    }
    Ответ написан
    Комментировать
  • Почему php цикл убивает сайт на WordPress?

    arutyunov
    @arutyunov
    Mooza.ru — Делаем сайты
    Скорее всего 500 ошибка, но в настройках php или веб-сервера отключен вывод ошибок.

    Видимо, цикл написан с ошибками.
    Прикладывайте код, либо включайте вывод ошибок на страницу (display_errors, error_reporting).
    Ответ написан
    2 комментария
  • Как хранить собственные классы в Yii2?

    arutyunov
    @arutyunov
    Mooza.ru — Делаем сайты
    Если в vendor хотите хранить, то упаковывайте все свои классы как расширение и подключайте его через composer.

    Если вы используете эти классы только в 1 проекте, то разместите их в любом месте (например, папка Components), настройке неймспейсы и подключайте их в нужных местах приложения.

    Не забывайте, что папка vendor находится в gitignore и в git её не будет (а значит и класса вашего там не будет).
    Ответ написан
    Комментировать
  • Как эффективно работать целый день?

    @sarathorn
    php программист, веб-дизайнер, коллекционер
    Мне 20 лет, живу отдельно от родителей, зарабатываю фрилансом. Самое важное - организовать свой день.

    В случае с собой я не смог найти корреляцию между временем пробуждения и продуктивностью. Зато совершенно точно могу сказать, что для максимальной результативности я должен выспаться и не испытывать голода и жажды.
    Вам не могу предложить выключить будильник и просыпаться только тогда, когда организм посчитает нужным, увы...

    В моём случае физическая нагрузка или простая прогулка не улучшают продуктивность, с другой стороны залипание в ютюб/вк или чтение статей могут свести все старания на 0.

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

    8 часов подряд кодить каждый день... Вы серьёзно? На этой неделе мои результаты такие: воскресенье - 12 часов кодинга, понедельник - 8, вторник - 8, среда - 6, четверг - 4, пятница - 3, суббота (сегодня) - нет ни малейшего желания, но очень надо хотя бы пару часов... Вы просто перегорите. Настраивайтесь на 4, максимум на 6 часов кодинга в день. Остальное время можно заполнить чтением документаций, проработкой прототипов на бумаге, обсуждениями с коллегами и боссом.

    Если ситуация требует 8-16 часов кодинга подряд (такое, увы, бывает), то меня спасают две вещи:
    1) Сериалы. Второй монитор, второй ПК, планшет или даже смартфон вам в помощь. Берёте сериал, который УЖЕ смотрели и включаете. Он должен быть интересный, но уже знакомый, это два обязательных требования. Так он не будет отвлекать от работы (сюжет же уже знаком, а половину реплик вы можете произнести вместо актёров), но создаст иллюзию отдыха. В моём случае можно всё привести к такому выражению: 60 минут кодинга = 80 минут кодинга под сериал. НО! Так я могу выдерживать 12-16 часов без особых усилий. Что в итоге даёт больше результата, чем 6-8 часов чистого кодига после которых я просто убитый на пару дней.
    2) Кофеин. Обычный кофеин. Кофе я не пью, а энергетики слишком дорогие для регулярного применения. Есть замечательная альтернатива - Кофеин-бензоат натрия. ~30рублей в аптеке за 6 таблеток. Максимальная разовая доза - 6 таблеток, она же 300мг кофеина. 1-2-3 таблетки мой организм может не заметить, а при шести я начинаю разговаривать сам с собой. Грань очень тонкая, но при правильной дозировке получается неплохой boost к производительности. Внимание! Кофеин может повышать давление и пульс, а также имеет ряд побочных эффектов. Передозировка может убить. Я не несу ответственности за последствия приёма кофеина.

    Смесь кофеина и прогулки (зима, 3 часа ночи, -20C) может породить тонну гениальных идей, увы, лишь 1 из сотни имеет шанс на успех в реальном мире.

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

    Чтобы работа давалась без усилий нужно какое-то вдохновенье и чувство гордости за свою работу. Я сделаю этот проект и тысячи людей будут им пользоваться! Я напишу эту программу и моя девушка за меня порадуется. Этот проект будет помогать начинающим бизнесменам, они никогда не узнают моего имени, но они будут мне благодарны.

    Непосредственно программирование (как и дизайн) идёт легче, если есть план и схемы. В моём случае при работе над back-end у меня 70% времени уходит на проектирование и проработку мелочей на бумаге, лишь 30% времени это сам кодинг. При работе с фронт-эндом я где-то 60-70% времени работаю, а 30-40% проектирую. Я так понимаю, вас не заставляют именно кодить 8 часов. Вас заставляют 8 часов сидеть на рабочем месте. Вот и прикиньте, что из них лишь где-то 3-4 часа будут самим кодингом. Хотя... Если работы очень много, вы не единственный кодер в конторе и есть более опытные, которые и берут на себя всё проектирование... ух... тогда остаётся только монотонно стучать по клаве...

    Ещё очень важный момент. ОБЯЗАТЕЛЬНО ОТДЫХАЙТЕ! В выходные не должно быть ни единой мысли о работе, после работы займитесь хобби, уберитесь дома, погуляйте, сходите в спорт зал, почитайте книгу, посмотрите кино, поспите в конце-концов. Никакой работы за пределами рабочего места. Этот трюк заставит мозг ассоциировать рабочее место с рабочим процессом, а значит уже не нужно будет самому его мотивировать работать. Это работает крайне просто. Если вы видите очень красивую девушку да ещё и без одежды, то кое-что что происходит с одним очень важным органом и мозг начинает работать совершенно иначе. И вот теперь в поле зрения попадает ваше кресло и ваш рабочий комп, мозг пробегается по ассоциациям и понимает, что надо работать. В паре с состоянием вынужденной необходимости всё сработает на ура.

    Перерывы - спорный момент. Мне проще проработать, например, 6 часов без перерывов (только если на отойти до туалета или до кухни, чтобы налить воды и стащить печеньку), чем 6-8 с перерывами. Я очень много времени и сил трачу на переключение с одного вида деятельности на другой.

    По поводу еды. В момент приёма и пищи и где-то следующий час я способен только читать и смотреть, но никак не творить.
    Ответ написан
    10 комментариев
  • Как при выводе из ActiveRecord в виде массива получить и динамические свойства?

    bitver
    @bitver
    Переопределите extraFields() вашей модели
    www.yiiframework.com/doc-2.0/guide-structure-model...
    The extraFields() method defines additionally available fields which can also be returned by toArray() as long as you specify them via the $expand parameter.
    Ответ написан
    2 комментария
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

    * Кэш должен очищаться по двум условиям (не по одному из, а именно по двум):
    - Время.
    - Протухание по бизнес логике.
    Разрешается по только времени в безвыходных ситуациях, но тогда время - короткий период.
    - При расчете ключей кэша должна использоваться переменная из конфигурации приложения (на случай обновлений кэш сбрасывается кодом, а не флашем кэш-сервера). В случае использования множества серверов - это очень удобный и гибкий инструмент при диплое.

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

    Это далеко не полный список требований, очень много зависит от проекта в целом и от принципов, заложенных в нем. Для больших мредж реквестов 200 комментариев к коду - это ок. Дерзайте.

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев