• Как ведет себя JOIN & WHERE?

    Общая логика: сначала всё сджойнить, потом от фильтровать по where.
    Можно указать условия из where в нужном join, тогда отбор значений будет до join.
    Как-то так: on (t1.id=t2.id and <условие>)
    Ответ написан
    Комментировать
  • Как и чем быстрее всего начать зарабатывать на программировании/веб-программировании?

    @CAMOKPYT
    Забудь про фриланс, сколько бы про него не говорили, это биржа ДЕШЕВОЙ рабочей силы со всеми вытекающими последствиями в виде кидалова, низкой зп, скучной работы, туда идут люди с серьезными проблемами вроде невозможности перебраться в город, социопатии, инвалидности, "утонченная личность", фриланс это почти всегда вынужденная мера. Вообще фриланс и стабильный заработок несовместимые понятия, просто потому что фриланс подразумевает постоянный поиск мелкой работы, никакой заказчик не будет давать большой серьезный проект фрилансеру никогда, потому что это большая ответственность, посмотрите соседние вопросы, пацики с рейтами 150баксов в час работают 10 часов в месяц, а остальное время ищут заказы, причем это люди с опытом и портфолио + отличный английский. Начинать карьеру с фриланса это 100% гарантия того что, все что можно сделать неправильно (техническая сторона), будет сделано неправильно, потому что работает, дедлайн вчера, а подсказать или сделать код ревью некому, никакие книжки тут не помогут, выбора не будет, ты либо читаешь либо работаешь. Так что не советую ввязываться в эту тему. Лучше начать работы в офисе под строгим надзором. Ну и конечно html+css+js это мало, нужно знать еще около программисткие штуки вроде систем контроля версий, багтрекеры, несколько ide/ текстовых редакторов, если это веб почти гарантированно надо иметь представления о http/https, ООП, возможно sql. Не то чтобы для 20к месяц все это нужно отлично знать, но как минимум иметь представление, чтобы не отвлекаться. Вот по фронтэнду. Для большой гарантии устройства на работу, как уже сказали выше, лучше сделать себе сайт, а еще лучше сделать небольшое портфолио и выложить на гитхаб, это сейчас очень модно. На изучения всего вышеперечисленного уйдет 1-2 месяца если сидеть по 8-4 часа в день примерно, свой сайт где-то неделю на разработку визитки и еще неделя на вылизывание, но оно того стоит, а в процессе поиска работы можно и на гитхаб по чуть-чуть кидать, хотя вряд ли получится много. Удачи.
    Ответ написан
    8 комментариев
  • Стоит ли писать свой php-фреймворк с целью улучшения знаний в области ООП и изучения шаблона MVC?

    @romeo7
    Читая Ваш вопрос,вспомнил себя 5-ей летней давности:) На тот момент мой бэкграунд состоял из дюжины сайтов на различных CMS и одного стартапа,который ясное дело не взлетел. Я к тому моменту долго вынашивал план по реабилитации одного замороженного проекта (спортивный портал),который разрабатывал со своими товарищами ещё в студенческие годы. Изначально задачи написать свой движок не было,но... всё началось с разработки шаблонизатора с синтаксисом а-ля CMS MODx. Много читал о том,что данная реализация выделяется на фоне остальных конкурентов,по сути являясь визитной карточкой последней. На поверку оказалось, что это всего навсего синтаксическая абстракция над Smarty,со всеми вытекающими по производительности. К примеру,моя реализация имеет альтернативную поддержку нативного php-шаблонизатора
    <?=$this->getSnippet('List', $params)?>
    для тех, кто терпеть не может синтаксические абстракции (Smarty, Twing, Fenom и иже с ними.) из-за их низкой производительности и иным религиозным соображениям.
    Шло время, кодовая база росла. От паттерна Singleton до DI (Dependency Injection), к Service Locator-у. Много чего выпилено в угоду существующих решений. За последние 2 года,не без помощи Composer,стало в разы больше готовых решений,причём несколько на реализацию конкретно задачи. К примеру,из последнего - был заменён собственный файловый менеджер (манипуляция с файловой системой) на библиотеку Flysystem, ибо последняя помимо всего прочего, умеет "бегать" в облака. Круто же ;) Единственное,в моей реализации была возможность поиска по regexp-паттерну,пришлось писать абстракцию.

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

    Вот сходу антипример. Достаточно популярная библиотека для валидации данных Respect Validation. Требовалось реализовать интернационализацию сообщений, не было возможности вывести иерархию выброшенных во время валидации ошибок одним большим массивом,а также хотелось вернуть,к примеру,только первую ошибку (first) или последнюю (last). Пришлось форкнуть,ибо абстрагироваться попросту невозможно.

    Совет: Иногда сталкиваешься с тем, что не все возможности какой-либо библиотеки задокументированы,даже если она достаточно популярна и имеет свой красивый "твиттеробутстраповый" сайт. Загляните в unit-тесты,возможно,откроете для себя что-то новое;)

    Если всё же надумаете писать свой фреймворк,то опирайтесь на существующие решения. Выберите для себя один-два популярных фреймворка и изучите,как реализован в них тот или иной функционал,хотя бы визуально,благо документации навалом. Начните с модели MVC. Посмотрите как реализованы actions,а именно доступ к ним,фильтрация на входе и выходе в action. Я,к примеру,не сторонник реализации псевдо-аннотаций,как в Symfony,ибо в PHP поддержки нативных аннотаций пока нет,а всё остальное - это жалкое подобие через медленные Reflections,даже если всё это кэшируется. Вот и автор АОП парадигмы для PHP всё это понимает, но всё равно продолжает разрабатывать свой проект Go!. Реализация конечно интересная,но я обойдусь событийной моделью (Observer или PubSub).
    Взгляните как устроен роутинг, ибо это основополагающая для реализации SOAP и REST. К примеру,моё решение испытало влияние Lavarel Routing по части использования групп. Нынче в силу распространённости мобильных платформ всё чаще используется REST не только на основе url-а,но и на основе кастомных заголовков (X-<имя прагмы>).
    Обратите внимания на то,как осуществляется обработка ошибок/exceptions. К примеру,Yii давно ругают на то,что нет возможности верной идентификации того или иного исключения. Лучше для каждой отдельной задачи (к примеру, FileManager) свой класс Exception,который наследуется от базового:
    class Exception extends BaseException
    {
        const FILE_EXISTS = 'File exists: {path}';
    
        public function __construct(
            $level = self::ERROR,
            $msg = null,
            array $dataReplace = null,
            \Exception $handler = null
        ) {
            return parent::__construct($level, $msg, $dataReplace, $handler);
        }
    }

    Тогда в базовом классе BaseException можно легко реализовать логирование (к примеру, воспользоваться Monolog) и красивую визуальную выдачу в режиме дебага (к примеру, Whoops).
    Желательно сразу избавить себя от привычки делать "жирные" контроллеры/actions. В этом может Вам помочь различные реализации валидации,фильтрации данных,а также задания дефолтовых значение на уровне модели. Обратите внимание на метод rules. Тогда в Вашем контроллере будет лишь метод отправки уже обработанных данных на вьюху.
    Что касается ORM и DBAL (синонимы: DAO и Query Builder), то в этом случае уж точно не стоит изобретать свой "велосипед". Написать по возможности единый интерфейс для различных реляционных и нереляционных решений (СУБД, Систем полнотекстового поиска/индексаторов (Sphinx, Elasticsearch)) - более чем нетривиальная задача. Я в своём фреймворке взял за основу AR (ORM) и Query Builder Yii2. Да,в Yii отсутствует модульность,а потому всё достаточно зависимо друг от друга,но если захотеть, то можно.
    Чувствуете этот момент. Вы препарируете почти готовое (прим. Yii2 еще в состоянии беты),одно из самых выдающихся на текущий момент решений и тем самым разбираетесь во всех тонкостях, попутно проявляете активность в исправлении ошибок.
    Научитесь писать unit тесты. Множество ошибок всплывут на поверхности,да и сон Ваш тогда будет более крепким.
    Вы наверно могли для себя заметить на том же stackoverflow или иных ресурсах, задаются достаточно тривиальные вопросы по фреймворкам. Вот и сейчас пока пишу Вам этот большущий ответ,в разделе "Похожие вопросы" красуется такой вопрос "Как реализовать правильно авторизацию с сессиями ... Отсутствует элементарная дисциплина к самостоятельности. И я даже догадываюсь почему так. Фреймворков стало больше,фреймворки стали лучше. Programmer Frendly,а не страшный зверь для избранных,как было когда-то. Правда,некоторые и по сей день недружелюбно скалятся;) Так или иначе,если есть желание задать вопрос из серии каким образом в JQuery сравнить две переменные,то стоит задуматься,а надо ли тебе всё это.
    Не в коем случае не нужно уверять себя в том,что Ваш инструмент взлетит. Он не уникален,и в конечном счёте скорее всего будет состоять из множества готовых библиотек (прим. в моём случае 60 против 40% вендорного кода. Если учитывать значимость,то в этом случае, уже счёт будет не в мою пользу). К сожалению, не могу найти ссылку на англоязычную статью, где автор сетует на полный отказ от фреймворков в пользу packagist. Даже если в уникальности вашего решения нет сомнения,это ничего Вам не гарантирует. Необходимо грамотное продвижение - множество статей на тематические ресурсах,а также участие в конференциях. К примеру, PHPDaemon хоть и стартовал первым, но пока вчистую проигрывает ReactPHP, а всего-навсего необходимо было уделить внимание написанию документации. Автор PHPDaemon, Василий Зорин,как-то на вопрос чем отчается его проект от React,указал на то,что последний использует его идеи. Конечно печально за нашего соотечественника,но его проект попахивает откровенным эгоизмом.
    Делайте Ваш инструмент прежде всего для себя,и возможно,когда-нибудь он станет интересен кому-то ещё. Так или иначе,Вы получите бесценный опыт. Главное,постараться довести это дело до конца. Отличительной чертой нашей ремесленной профессии является терпение. Вот Вам и проверка этого замечательного человеческого качества:) Кстати,чтобы интерес не угас,стоит свои наработки применять,если не в продакшене,то хотя бы небольшой проект для экспериментов.
    Заметил за собой,что пока занимался разработкой инструмента,гораздо больше получил опыта,чем на предыдущих двух работах. Но это субъективно. Можно с самого начала устроится в такое место,где замечательный отзывчивый коллектив и не менее интересные проекты/стартап, а не "натяни шаблон на Wordpress". Считаю,что пусть CMS-сника - это путь в никуда, и Кипелов здесь не причём:) Чем раньше, тем раньше;)
    Мне, как и sWinDos тоже забавно смотреть на свои исходники годичной давности:)) Вам знакомо такое понятие,как "Тезаурус"? В трактовке теории информации,это экспоненциальный рост знаний/опыта до какого-то предела, после которого, эффективность полученных знаний/опыта заметно падает. Получается этакая кривая Гаусса или что-то вроде жизненного цикла знаний/опыта в отдельно взятой предметной области.

    Совет: Запомните,Ваши проекты на github-е и контрибьюторская активность - это твёрдое, незыблемое портфолио. На собеседовании в большинстве компаний вы вправе выбрать свой сценарий поведения и темы для бесед.

    P.S. Я специально не стал затрагивать моральную и финансовую сторону вопроса. Opensource или заработок? Вечные поиски свободного времени между семьёй,работой и отдыхом. Смотрю здесь уже кто-то отметился:) Если Вы ещё студент и не обременены чем-либо,то дерзайте. Вполне возможно уже по окончанию университета или даже раньше, Вы выйдите уверенным таким коренастым мидлом:) К слову,в первой организации, с которой я начал свой профессиональный путь проповедовали процедурное программирование,ибо ООП никем не понималось должным образом.
    Ответ написан
    6 комментариев
  • Как правильно работать с объектами выборки doctrine в Symfony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    дополню ответ Юрий

    Во первых, это на столько здоровый объект реляции images, что отдебажить его можно только с помощью функции dump.


    Все сущности заворачиваются в прокси объекты, что бы работала "магия" вроде ленивой подгрузки и т.д. Именно по этому в сущностях "больше" чем есть на самом деле.

    По поводу коллекций, в Doctrine есть такая штука как Collection. Вы должны понимать что в доктрине вы оперируете не табличками в базе, а объектами. Строите именно объектную модель вашей системы. В этом ключе можете почитать что такое "агрегат сущностей". В вашем случае у вас агрегат будет состоять из двух сущностей. Product и его Image. Например если вы захотите сделать добавление картинок, вы можете сделать так:

    /**
     * usage: $product->addImage($image);
     */
    public function addImage(Image $image)
    {
        $this->images->add($image);
    }


    А коллекция сама выполнит persist новой сущности. Таким образом количество репозиториев уменьшается до количества корней агрегатов сущностей. В вашем примере "корнем", то есть вершиной графа взаимоотношений объектов в контексте продуктов, является сам продукт. А потому репозиторий мы будем делать только для продуктов. Все остальное внутри оного разруливается либо при помощи коллекций.

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

    К примеру "новички" в доктрине любят персисть сущность даже для обновления. Они путают `persist` и `save`. Так вот, если вы загрузили сущность из базы через доктрину, то сущность уже попадает в unit of work. И делать persist уже не нужно, этот метод только для того чтобы доктрина узнала о чем-то новом. А так она и так знает про эту сущность. В итоге вы можете просто что-то поменять и вызвать flush. То есть репозиторий - это тупо хранилище. Хранилище умеет хранить. Изменять то, что оно хранит оно не может.

    Так же рекомендую на тему репозиториев почитать это:

    www.whitewashing.de/2013/03/04/doctrine_repositori...

    Ну и в целом.

    https://www.youtube.com/watch?v=rzGeNYC3oz0 - доклад о том как готовить доктрину от авторов оной.

    От себя лишь добавлю простые правила:

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

    что очень сильно срет память.


    Доктрина гарантирует вам что в памяти будет всегда только один инстанс сущности. То есть если у вас есть 10 объектов одного типа и имеющих один объект, это все будут ссылки на одну сущность. В вашем случае у вас просто циклическая ссылка между продуктами и изображениями. dump циклические ссылки не особо умеет.

    Это логичное ограничение, дабы не возникало ситуаций что вы обновили что-то в одном экземпляре сущности и что-то в другом, и в базу попадут только часть изменений. За подробностями - читайте документацию к доктрине в отношении UnitOrWork и Identity Map.
    Ответ написан
  • Как интегрировать git-bash.exe в WebStorm/PhpStorm?

    @toha_man Автор вопроса
    Так.... вообще-то был просто тупняк у меня. Извиняюсь. Всё работает, автокомплит есть уже в
    C:\Program Files\Git\bin\bash.exe

    Просто у меня есть настроены альясы в bash'e:
    alias go="git checkout"
    и другие, и соот-но автокомплит их не понимает. Тут уже надо отдельно поискать погуглить, как сообщить автокомплиту что go = git checkout. Если пишешь git checkout branch всё работает

    И если уважаемые модераторы позволят. Дополню ссылкой на стаковерфлоу, с информацией как настроить alias'ы в такой ситуации. Всё крайне просто

    https://stackoverflow.com/questions/9869227/git-au...
    Так же есть еще такой скрипт , может кому поможет
    https://artur.minimulin.ru/blog/git-autocomplete-c...
    Ответ написан
    Комментировать
  • Как правильно сделать использование общих полей в Symfony forms?

    Matmode
    @Matmode
    PHP/Symfony Developer
    В начальном варианте Вы пытаетесь встроить форму, а не наследовать её. В этом случае поля были бы доступны для вывода так: form.commonFields.titleLink.

    Вашу задачу наследования решает именно второй вариант
    Ответ написан
    3 комментария
  • За что отвечает require-dev в Composer?

    @harmoxyne
    Отвечает за те зависимости, которые необходимы только для dev-окружения.
    К примеру, Вы точно знаете, что библиотека phpunit нужна для разработки, а на проде будет лишней, тогда phpunit попадает в require-dev.
    Когда выполняется простой
    composer install
    устанавливаются и dev-зависимости.
    Когда выполняется
    composer install --no-dev
    устанавливаются только те зависимости, что в основном блоке require.

    Источник
    Ответ написан
    Комментировать
  • Symfony 4 - как сделать POST запрос на чужую (внешню) API?

    php10
    @php10
    Разработчик на PHP
    Ответ написан
    Комментировать
  • Как в Twig сделать простой цикл, пока i < n?

    delphinpro
    @delphinpro
    frontend developer
    {#
        n разумеется можно задавать и в логике (или в gulp-data, если это сборщик фронта),
        это просто переменная
    #}
    {% set n = 3 %}
    {% for i in range(1, n) %}
        {{ i }},
    {% endfor %}
    Ответ написан
    1 комментарий
  • Что не так с php?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    В первом случае не сравнение, а присваивание. В итоге в условии используется значение переменной a, которое равно 1, которое приводится к true.

    Во втором случае в первой строке вы производите сравнение, а не присваивание значения. Поэтому во второй строке у переменной $a нет значения, то есть она точно не равна 1.

    С php всё ок, проблема с вашим кодом.
    Ответ написан
    1 комментарий
  • Как завести связи между объектами?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    1. по логике если operation не может существовать без user то при создании объекта он должен быть обязателен new Operation(new User("username"));
    2. public setUser() - неправильно реализован, так нужно: setUser(User $user)
    3. Работа с вложенными объектами тема правильная но нужно понимать что для передачи такого объекта в слой хранения нужен будет писать datamapper который будет трансформировать объект в формат хранения бд. Как правило ORM сразу предоставляет инструментарий для этого.
    Ответ написан
    5 комментариев
  • Правила игры, проверка правил?

    @rowdyro
    Я бы ввел в таблицу games_rules параметр type, который может принимать значения:
    'choice', 'range'.

    В случае choice параметр options содержит json
    key=>value
    В случае range
    min=>{MIN_VALUE}, max=>{MAX_VALUE}

    Дальше делаете классы для каждого type, которые знают свой формат options, знают как проверять условия и какой рисовать контрол (select,input & etc). Оборачиваете все это дело в фабрику профит.
    Ответ написан
    Комментировать
  • Регулярные выражения. Как выделить имя файла?

    slo_nik
    @slo_nik Куратор тега PHP
    Доброе утро.
    А зачем Вам в данной ситуации регулярные выражения?
    Есть pathinfo().
    А ещё есть basename().

    p.s. Если есть возможность не использовать регулярные выражения - не используйте.

    p.s. Ну а если уж сильно приспичило, то вот, попробуйте начать с этого.
    Ответ написан
    4 комментария
  • Как реализовать sql поиск по нескольким полям с учётом того, что запрос может содержать сразу два поля?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    SELECT ID, Name + ' ' + Surname AS LikeName FROM Users WHERE LikeName = 'Ракзин Роман'

    Если вы хотите всех 'Роман' и всех 'Ракзин'
    SELECT ID, Name + ' ' + Surname AS LikeName FROM Users 
    WHERE (LikeName LIKE '%Ракзин%') OR  (LikeName LIKE '%Роман%')

    Реальный поиск фильмов, их атрибутов и персон.
    Представление для поиска
    CREATE VIEW SearchLike
    AS
      SELECT Film.ID, 
             ISNULL(CAST(Film.Year AS VARCHAR) + ' ', '') + ISNULL(Head.Name + ' ' + Film.HeadingNumber + ' ', '') 
               + ISNULL(Film.Article + ' ', '') + ISNULL(Film.Name + ' ', '') + ISNULL(Film.NameTranslat + ' ', '') 
               + ISNULL(Film.Addition + ' ', '') + ISNULL(Film.Country + ' ', '') 
               + ISNULL(FilmAttributeGroup.Name + ' ', '') + ISNULL(FilmAttributeValue.Value + ' ', '') AS Search,
             Film.[Key]
        FROM FilmAttributeValue 
          INNER JOIN FilmAttribute ON FilmAttributeValue.ID = FilmAttribute.Attribute 
          INNER JOIN FilmAttributeGroup ON FilmAttributeValue.[Group] = FilmAttributeGroup.ID 
          RIGHT OUTER JOIN Film ON FilmAttribute.Film = Film.ID 
          LEFT OUTER JOIN Film AS Head ON Film.Heading = Head.ID
      --
      UNION
      --
      SELECT Person, 
             [Name], 
             'P' + CAST(Person AS VARCHAR)
        FROM PersonNameFormat
        WHERE ([Format] > 10) OR ([Format] = 0)
    --
    GO

    Представление для наименования
    CREATE VIEW SearchName
    AS
      -- Фильмы:
      SELECT Film.ID, 
             FilmNamePower.[Year]     AS [Year], 
             FilmNamePower.NameCommon AS [Name], 
             Film.WatchDisplay,
             Film.Icon,
             Film.AttributeIcon,
             '0' + Film.[Range] AS [Range],
             Film.[Key],
             Film.ID AS UnitID
        FROM Film INNER JOIN FilmNamePower ON Film.ID = FilmNamePower.ID
      --
      UNION
      -- Персоны:
      SELECT ID, 
             ISNULL(YEAR(BirthDay), 1900), 
             NameFull, 
             '', 
             NoteIcon, 
             NULL, 
             '1' + CONVERT(VARCHAR, ISNULL(BirthDay, '19000101'), 112) + [Range], 
             [Key],
             -1
        FROM Person    
    --
    GO

    Грид, поиск до трёх параметров
    CREATE PROCEDURE SearchGrid @P1 VARCHAR(100) = NULL, @P2 VARCHAR(100) = NULL, @P3 VARCHAR(100) = NULL
    AS
      SELECT DISTINCT
             SearchName.ID, 
             SearchName.[Year], 
             SearchName.[Name], 
             SearchName.WatchDisplay, 
             SearchName.Icon,
             SearchName.AttributeIcon,
             SearchName.[Range],
             LEFT(SearchName.[Key], 1) AS Kind,
             SearchName.UnitID
        FROM SearchName INNER JOIN SearchLike ON SearchName.[Key] = SearchLike.[Key]
        WHERE ((NOT @P1 IS NULL) AND (SearchLike.Search LIKE '%' + @P1 + '%'))
           OR ((NOT @P2 IS NULL) AND (SearchLike.Search LIKE '%' + @P2 + '%')) 
           OR ((NOT @P3 IS NULL) AND (SearchLike.Search LIKE '%' + @P3 + '%')) 
        ORDER BY SearchName.[Range]
    --
    GO

    Ответ написан
    3 комментария
  • Как решить ошибку?

    DevMan
    @DevMan
    ну если ты используешь mysqli, то что в 13 строке делает mysql_fetch_array???!!!!!1 o_O
    это же разные расширения.

    и добрый совет: забудь про mysql/mysqli, используй pdo.
    Ответ написан
    Комментировать
  • Почему при скачке больших файлов через curl иногда они не докачиваются?

    @remzalp
    Программер чего попало на чем попало
    логируете всё на стороне php (лог ошибок посмотреть)
    берётё tcpdump, сохраняете дамп, анализируете в Wireshark

    одна из очевидных ошибок - пытаетесь всё забрать в оперативную память (отдаёте в переменную), а надо отдавать указатель на файл. CURLOPT_RETURNTRANSFER в случае больших файлов - вреден.

    Пример:
    $out = fopen($local_path.$newfilename,"wb");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_FILE, $out);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_URL, $file);

    curl_exec($ch);
    curl_close($ch);
    Ответ написан
    Комментировать
  • После обновления Ubuntu 16.04 сбилось разрешение. Как вернуть?

    zooks
    @zooks Автор вопроса
    Frontend
    После отключения опции Secure Boot в BIOS (UEFI) все заработало с нормальным разрешением.
    Видимо, это фишка нового ядра Linux 4.4.0-72-generic.

    6b9055f57abf4733b84166082e138e36.png

    Отключить настройку помогла статья:
    remontka.pro/secure-boot-disable
    Ответ написан
    Комментировать
  • Как называть индексы в PostgreSQL?

    sim3x
    @sim3x
    Ответ написан
    Комментировать
  • Как сделать две колонки (сайдбар + контент) в bootstrap?

    kapitansen
    @kapitansen
    Веб-погромист
    например, так:
    <div class="container">
    	<div class="row">
    		<div class="col-md-4">sidebar</div>
    		<div class="col-md-8">content</div>
    	</div>
    </div>
    Ответ написан
    1 комментарий
  • Вопрос по View (PHP MVC)?

    Вообще говоря, да, для каждого действия нужен свой вид/шаблон, причём вид и шаблон считать синонимами можно только с натяжкой. Или даже несколько видов, среди которых контроллер выбирает нужный в данный момент.

    Использования наследования и включений шаблонов это следование другим практикам и паттернам непосредственно к MVC отношения не имеющим. Как, кстати, не имеет отношения к MVC и «запускается приложение из index.php, метод route разбирает запрос пользователя и отдает управление одному из методов соответствующего контроллера».

    При выборе между наследованием/декорирования и включение посоветовал бы делать упор на первое. Даже без использования шаблонизаторов типа Smarty или Twig оно осуществляется довольно легко с помощью функций ob_*, особенно если достаточно двухуровневого. Метод render может выглядеть примерно так:
    ob_start();
    require $template;
    $content = ob_get_clean();
    require 'layout.php';
    

    layout.php так
    <html>
    <body>
    <div id="header">Шапка</div>
    <div id="content">
      <?= $content ?>
    </div>
    </body>
    </html>
    

    А blog_index так
    <?php foreach($posts as $post): ?>
      <div class="post">
        <h1><?= $post->title ?></h1>
        <?= $post->content ?>
      </div>
    <?php endforeach ?>
    
    Ответ написан
    1 комментарий