• Для чего нужен singleton?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ощути разницу между заводом автомобилей, автомобилем и компанией владельцем. синглтон в данном случае это например соединение с базой данных этакая конструкция кода доступная в любом месте программы. В примере с автомобилями компания сама может быть синглтоном чтобы время от времени при работе на заводе получать разрешение или просто запрашивать имя компании. Синлтон нужен чтобы не потерять обьект в толще кода, но я все больше склоняюсь к тому чтобы возвращать обьект при подключении класса в файл сборки. Косяк что в пхп до версии 5.6 слово array нужно было писать полностью вот и придумали возможность с помощью статики в любом месте проги вернуть единственный экземпляр класса. С тем же успехом ты можешь сделать return include new App и потом обьект передавать в параметр другой функции. Но тогда с этим долбаться не хотелось вот и придумали очередную новую технологию
    Ответ написан
  • Как сделать гибкий фон для кнопок и расположить их согласно макету?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    1) Кнопку делаешь inline-block
    2) левую часть с треугольником отрезаешь в виде картинки и вешаешь через :after {}
    3) если хочется чтобы они выстраивались в столбик - создаешь еще один инлайн блок и поскольку он у тебя прижат верхней стороной - пишешь ему vertical-align: top;
    4) задаешь максимальную ширину блоку, чтобы при переполнении он не перепрыгнул на новую строчку а расширялся вниз

    все
    Ответ написан
    Комментировать
  • Веб-сервис Менеджер задач. Какие выбрать технологии?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    php будет дорабатывать дешевле, но это же будет и его минусом - на языке где разработка дешевая, профессионалы не задерживаются, а значит чем дольше времени проект будет на плаву тем дороже он будет становится в обслуживании

    взять js + node - там профессионалы дорогие, зато код будет качественный - одного спеца можно в случае проблем на другого поменять легко

    взять python - и у вас профессионалов 1 на 100 километров, зато он один сядет все сделает

    ==

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

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

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

    Кратко еще раз - на пхп разработка дешевле, но постоянно придется менять специалиста, потому что там мало профессионалов - один того не знает, другой этого, третий наговнокодил и тд. На яваскрипте разработка дороже, зато больше уверенности что все будет гладко. Что до Питона или там всяких АСП.нет - то найти разраба будет сущим адом, и придется терпеть все его прихоти, зато сделано будет как с конвеера, там обычно узкоспециализированные профи с очень умной головой.
    Ответ написан
    Комментировать
  • Битрикс. Как загружать разные инфоблоки в зависимости от URL?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ну варианты разные есть.
    Самый классический - это привязываться к папкам на сайте. Вводите одну папку - там собственный index.php, вводите другую - там другой index.php - в них можно разные компоненты писать.

    Если у вас в пределах одной папки может быть куча адресов с параметрами, таких как
    /catalog/
    /catalog/category-name/category-name/product-name
    то либо вы используете стандартный написанный компонент каталога
    либо пишете свой компонент. Он работать будет в двух словах так:
    1) получить адрес
    2) отрезать папку в которой мы сейчас
    3) остальное разбить по заранее известным правилам (если хотите можно почитать про .urlrewrite.php - он как раз про эти правила)
    4) параметры запихнуть в запрос, чтобы выдрать информацию
    5) информацию вывести в соответствии с шаблоном

    Битрикс не первой удобности система, часто приходится бегать из одного места в другое. Гораздо удобнее, когда модули сайта лежат в папке modules/ например, а внутри каждого есть папки model + view + controller - тогда вы сразу видите, где лежит верстка, где запросы к базе, а где скрипт который соединяет одно и другое в нужном порядке.

    К сожалению ВСЕ современные ЦМС предпочитают сделать наоборот - сначала разбить на model/view/controller, а потом долбаться с одинаковыми именами круглые сутки, постоянно прыгая из папки в папку, как кенгуру
    Ответ написан
    Комментировать
  • Почему при редактировании шаблона html слетают теги?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    У битрикса стоит защита, там есть модуль родной заводской кажется "сканер безопасности".
    Проще говоря на вашего пользователя нет прав размещать теги <script> в коде.
    Нужно попросить админа изменить права для вашего юзера.
    Ответ написан
    Комментировать
  • Почему слетает верстка в Битриксе?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Чаще всего проблемы верстки связаны с подключением всяких глобальных стилей. Бутстрапы, библиотеки от новичков - все это объявляет классы и особо не думает о будущем - а бы заработало, а дальше как хотите. Нанимайте на работу людей знакомых например с БЭМ или чем-то таким.
    Они конечно люди особые, любят поумничать и покидать умных фраз. Но пообщавшись с ним 15 минут вы можете понять - легко ли это для него самого, или он просто только что статью прочел, как верстать на бэм
    Ответ написан
    Комментировать
  • Как удалить ссылку?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Третий вариант - залогиниться под админом и справа сверху будет переключатель "режим редактирования". Штука не очень быстрая и удобная, зато позволяет точно определить где лежит искомый файл и сразу вызвать панельку для его изменения.
    Ответ написан
    Комментировать
  • Как сделать сайт для небольшой производственной компании?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ни в коем случае не рекомендую начинать продажи с "удобного сайта".
    Практика в сфере такова, что денег должно хватать на разработку удобного сайта с уже имеющихся продаж. Если у вас есть розница или другая отрасль для спонсирования - нанимаете нормального кодера, и пусть он не спеша с толком делает ваш проект под руководством вашего специалиста - тот ему будет отвечать на вопросы и изредка похваливать, потому что работа жутко затратная на эмоции. Тогда у вас получится проект с заботой о людях, который будет приносить клиентам пользу, а вам деньги.

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

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

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Скайп, демонстрация экрана
    TeamViewer
    Тупо отправить скриншот
    Купить собственный хостинг
    Закачать на github pages

    Любой из этих и я думаю еще десяток способов есть
    Ответ написан
    Комментировать
  • Что надо сделать чтобы когда обновляю страницу поменялся картинка?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    1) Первое что нужно сделать -- CTRL+F5

    2) Несколько раз нажать CTRL+F5 - вы не поверите, браузеры это единственное место, в которых две перезагрузки это лучше чем одна.

    2б) Поставить расширение Clearcache в браузер и нажать кнопку "Очистить".

    3) Проставить к ссылке параметр с "img.jpg?" . filemtime($filename); если вы пишете на серверном языке (PHP например).

    4) Если вы поменяли ссылку на ссылку с вопросом, а вопроса в верстке не появилось, значит вы пишите на CMS, которая имеет собственный кэш. Придется пойти по форумам и поискать - где она его хранит, чтобы его очистить. Такие говноцмс-ки бывают.

    5) И на крайняк - открыть вашу картинку по прямой ссылке и там нажать CTRL+F5 и убедится что она изменилась.

    6) Если она изменилась, а при возврате на страницу все еще старая, проверьте URL - если он совпадает с пунктом 5, вы не поверите - ЗАКРОЙТЕ БРАУЗЕР и откройте его снова. Современные требования быстродействия заставляют браузеры почерному кешировать некоторые иконки и favicon, что вроде бы поменялось, а на деле все равно из локального хранилища картинки берутся.

    7) Попробовать в режиме инкогнито CTRL+SHIFT+N в большинстве браузеров.
    Ответ написан
    Комментировать
  • Возможно ли привязать одно свойство к другому (Битрикс)?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Средствами админки это точно не сделать. Вообще битрикс только выглядит хорошо, он весьма топорный и неумелый внутри. В нем удобно искать данные вашим заказчикам (любящим красивые админки). Привыкайте закачивать данные через CSV файлы, а работу в админке оставьте продавцам и прочим лентяям.

    Вообще все продавцы с рождения умеют пользоваться экселем. Представьте вашу БД как кучу эксель таблиц и работайте в уме с ними как будто в экселе. Внешне будет отличаться только формат - он будет CSV. Типа удобные типа фильтры - это заказчикам, которые устают смотреть таблицы и хотят... не пойми чего хотят. Часто они будут платить вам деньги за "ощущение удобства" и "внешний вид", как будто вы дизайнер/копирайтер, в реальной работе с данными нет более удобного представления, чем таблица, но увы им не удается это обьяснить. Они просят сделать систему, в которой они будут работать медленнее, чем они работали раньше. Глупо, но реалистично.

    ===

    Предполагается что свойства - это разные данные одного и того же элемента.
    Но вы можете например, создать инфоблок, в нем сделать элементы "красные яблоки", "зеленые яблоки", "желтые яблоки" - и этим элементам проставить свойство "красные".

    А потом в вашем инфоблоке элементу проставлять свойство через привязку к только что созданному инфоблоку - "красные яблоки".

    Только на самом деле мне непонятно зачем, ведь можно сделать одно свойство "цвет", а второе "фрукт". Опишите подробнее задачу.
    Ответ написан
  • Как заставить tooltip не убираться при наведении на него?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Все проще.
    .b-bullet {
      /* стили кружочка со знаком вопроса */
    }
    .b-bullet:hover .b-bullet__pad,
    .b-bullet:focus .b-bullet__pad {
      visibility: visible;
    }
    .b-bullet__pad {
      visibility: hidden;
      position: absolute;
      top: 100%
      left: 50%;
      margin-left: -100px;
      width 200px;
      height: 0;
    }
    .b-bullet__tooltip {
      /* стили подсказки */
    }


    В HTML (EMMET code):
    .b-bullet>.b-bullet__pad>.b-bullet__tooltip

    Если хотите, чтобы между иконкой и подсказкой было место например для треугольничка - просто добавьте padding-top в элемент b-bullet__pad, таким образом вы создадите невидимое пространство, двигаясь по которому, система будет считать, что вы все еще в :hover, и не будет закрывать подсказку.
    Ответ написан
    Комментировать
  • Как создать адаптивный дизайн?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Смысл адаптивного дизайна - в медиа-запросах
    Поскольку устройств десятки - писать для каждого класса адаптивный дизайн - это пустая работа, потому что стили будут в большинстве своем одинаковые.
    В связи с этим придумали - колоночный дизайн, который заранее задает стили для т.н. колонок, которые выстраиваются в строку - если место есть, и в столбик, если места нет.

    Это работает либо инлайн-блоками, либо флоатами.
    Если инлайн-блоки - нужно родительскому элементу постоянно занулять размер шрифта. А в колонке возвращать его обратно. Плюсы - можно выровнять колонки по центру если нужно (редко нужно на самом деле, чаще создают второй контейнер с отступами).
    Если флоатами - вешать на родительский элемент clearfix. Ну и разумеется выравнивание по центру САМИХ КОЛОНОК будет недоступно. Кроме того - работа с float: left; весьма специфична по наследованию максимальной высоты, например, когда вы хотите сделать форму для ввода в которой в одной колонке находится лейбл, а в другой поле, при этом форма должна выглядеть ровно - вы задаете строке min-height: 30px например, а потом попытка сеткой унаследовать этот min-height: сломает вашу сетку к чертям.

    Короче, используйте inline-block;

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

    >> БЭМ
    .grid.grid_size_12
      .grid_col.grid__col_size_2.grid__col_size_4mobile


    Вышеуказанный код работает примерно так - по-умолчанию в строке помещается 12х, внутри находится колонка которая по умолчанию занимает 2/12 = 1/6 экрана, на мобильном 4/12 - 1/3 экрана по ширине.

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

    Напишите свою сетку, это не так сложно, а потом вы сможете задавать отступы колонкам примерно в таком виде
    .grid {
      display: block;
      font-size: 0;
      box-sizing: border-box;
      min-height: inherit;
      max-height: inherit;
      height: 100%;
    }
    
    /* здесь не нужна вложенность, на класс будут навешиваться другие классы */
    /* мы указываем "начинается с класса", чтобы каждый раз не писать .grid__col.grid__col_size_2 а просто писать grid__col2 например */
    [class^="grid__col"] {
      display: inline-block;
      vertical-align: top;
      font-size: 1rem; /* постоянно следите за этим размером шрифта, он еще не один раз напомнит о себе */
      box-sizing: inherit;
      height: 100%;
      min-height: inherit;
      max-height: inherit;
    }
    
    /* циклы */
    .grid_col_size_12 .grid__col_size_12 {
      width: 100%;
    }
    .grid_col_size_12 .grid__col_size_6 {
      width: 50%;
    }
    /* и т.д. */
    
    .grid_project_foo {
      margin: 0 -8px -16px;
    }
    
    .grid_project_foo .grid__col {
      padding: 0 8px;
      margin-bottom: 16px;
    }


    Что обеспечит вам отступ между колонками в 16 пикселов по горизонтали без отступов крайних колонок, а также отступ после того как они соберутся в столбик по вертикали тоже 16 пикселов, не включая последнюю строку (она будет сожрана отрицательным маргином).

    P.S.
    Только что проверил колонки с float: left. Их ломает min-height - они перестают влазить по ширине, а если убрать min-height: - не будет работать выравнивание по высоте. А причина в том, что отрицательный маргин ломает все флоаты к чертям. Так что да, единственный нормальный вариант это inline-block.

    Если вам нужно раскрасить колонки - используйте table, table-cell, которое на мобильных устройствах (после перестраивания в столбик) превратится в block, inline-block.
    Ответ написан
    1 комментарий
  • По какому принципу написать bootstrap структуру?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    На бутстрапе 12 колоночная сетка, которая подходит не всегда.
    Я написал для себя свои сетки на 2 3 4 6 8 10 12 16 колонок и под каждое разрешение
    После этого в конкретном проекте (или модуле) задаю класс b-grid_padding_8 b-grid_margin_bottom_16, а по умолчанию сетка без отступов вообще.

    Таким образом если мне нужны нестандартные (неодинаковые колонки) - я либо подбираю нужное соотношение в сетках, а если его невозможно подобрать в процентах - задаю g-grid__col без цифры, а потом добавляю второй класс .b-project__colleft/right и указываю размеры ячеек для левой колонки например width: 200px, для правой width: calc(100% - 200px).

    Конкретно по вашему примеру: у вас сетка начинается не отступом, а колонкой (отступа то ли нет вообще, то ли он уже использован для того, чтобы сместить всю верстаемую страницу) - а внутри отступ есть - то есть по любому у вас будет "сетка-в-сетке" или "сетка-в-контейнере".
    Ответ написан
    1 комментарий
  • Как правильно передать ID поста в модальное окно?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Выводить контент с помощью fancybox - туда шаблон
    Или сразу вывести все модальные окна и поскрывать их, а потом в div.modal иметь параметр data-modalname="" и скрипт который открывая новое окно, закрывает старое.

    Не стоит забывать про мобильные устройства с маленьким экраном, это означает, что при создании модалок с нуля не стоит использовать position: absolute, left: 50%, top: 50%, поскольку размеры окна придется вручную высчитывать под размер экрана. Универсальное решение - темная подложка под модальным окном делается как и всегда position: fixed; width: 100%; height: 100%; но добавляем overflow-y: auto;
    Потом идет div.modals__table (display: table), div.modals__cell (display: table__cell; vertical-align: middle); сами модалки - inline-block и они будут равняться по центру для любого экрана.

    Модалкам после этого можно указать width: calc(100% - _двойной_отступ_) и потом каждой конкретной модалке задавать max-width.
    Ответ написан
  • Почему код сортировки работает не так как ожидается?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    ОБНОВЛЕНО 06.12.2016
    sandbox.onlinephpfunctions.com/code/41ea9f04b0e9b2...

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

    <?php
    error_reporting(0);
    
    // эмуляция БД - если у вас SQL - это не нужно
    $menu = array(
        array("id", "parent_id", "level"),
        
        array(1, 0, 0),
        array(2, 0, 0),
        array(3, 0, 0),
        array(4, 0, 0),
        array(5, 0, 0),
        array(6, 0, 0),
        array(7, 0, 0),
        array(8, 0, 0),
        array(9, 0, 0),
        array(10, 0, 0),
        array(11, 0, 0),
        
        array(17, 15, 1),
        array(18, 15, 1),
        array(19, 15, 1),
        array(20, 15, 1),
        array(21, 15, 1),
        array(22, 15, 1),
        array(23, 15, 1),
        array(17, 1, 2),
        array(18, 1, 2),
        array(19, 1, 2),
        array(20, 1, 2),
        array(21, 1, 2),
        array(22, 1, 2),
        array(23, 1, 2),
        
        array(24, 16, 1),
        array(25, 16, 1),
        array(26, 16, 1),
        array(27, 16, 1),
        array(28, 16, 1),
        array(24, 2, 2),
        array(25, 2, 2),
        array(26, 2, 2),
        array(27, 2, 2),
        array(28, 2, 2),    
    
        array(12, 1, 1),
        array(13, 1, 1),
        array(14, 1, 1),
        array(15, 1, 1),
        
        array(16, 2, 1),
    );
    $columns = array_shift($menu);
    $menu = array_map(function ($v) use ($columns) {
        return array_combine($columns, array_replace(array_fill(0, count($columns), NULL), $v));
    }, $menu);
    
    
    // сортируем правильно - если у вас SQL - делайте в запросе
    usort($menu, function ($a, $b) {
       return 0
        ?: ($a["level"] - $b["level"])
        ?: ($a["parent_id"] - $b["parent_id"])
        ?: ($a["id"] - $b["id"]);
    });
    
    
    // выбираем в массив по родителям
    $menu_parents = array();
    foreach ($menu as $v):
        $menu_parents[$v["parent_id"]][] = $v;
    endforeach;
    
    
    // пробегаем каждый элемент собирая потомки по очереди
    function tree($arr, $parent_id = 0, &$res = array()) {
        foreach ($arr[$parent_id] as $v):
            $id = $v["id"];
            if (!isset($res[$id])):
                $res[$id] = $v;
            elseif ($res[$id]["level"] < $v["level"]):
                $res[$id] = $v;
            endif;
            if (isset($arr[$id])):
                tree($arr, $id, $res);
            endif;
        endforeach;
      return $res;
    }
    $menu = tree($menu_parents);
    
    
    echo "<pre>";
    print_r($menu);
    Ответ написан
    Комментировать
  • Для чего в БЭМ т.н. "первый уровень вложенности", то есть "блок__элемент"?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    Пораскинули мозгами с коллегами, плюс собрал ваши мнения.

    По итогу:
    • БЭМ есть методология/философия - набор рекомендаций, а не стандарт разработки, поскольку она ничего не запрещает, а просто существует и все XD
    • Правильно написанные стили (с БЭМ или без БЭМ) позволяют их использовать в других проектах без доработки
    • Возможно, принципы БЭМ уходят к теории баз данных, где для хранения деревьев используют таблицу с parent__child__level, описывая элемент на предположим третьем уровне вложенности, мы просто указываем 1_4 2_4 3_4, просто в нашем случае выбрасываются те связи, которые не оказывают влияния на дочерний элемент. Обратите внимания, что порядок подключения файлов стилей и является тем самым полем level - расположи мы их в неправильном порядке и результаты нас неприятно удивят
    • Следует стремится уменьшить число классов и их длину настолько насколько возможно, при этом оставив их читабельными
    • Каждый уровень вложенности увеличивает число работы во много раз, перед тем как сделать уровень вложенности - нужно очень хорошо все взвесить
    • Общепринятым решением является _один_модификатор_на_класс_ - но помните, что у DOM-элемента может быть много классов, просто если писать несколько модификаторов - число классов возрастет в n^2 раз согласно уровня вложенности - проще написать _theme_material и _color_red, _color_blue, _color_yellow в отдельных классах, чем писать каждый раз _theme_material_color_red, _theme_material_color_blue, _theme_material_color_yellow
    • БЭМ допускает использование дефисов в именах классов, если они состоят из нескольких слов, но предпочтительнее использовать "верблюд" или вообще писать все в одно слово, поскольку выделение двойным щелчком в редакторе кода никто не отменял, а дефисы сломают от этого все удовольствие (ну или придется обучать ваших спецов настраивать их любимый редактор)
    • Для совместимости с другими библиотеками рекомендуется использовать префикс для каждого проекта, так классы продакшена могут начинаться с "b-", например "b-menu__item", это должно окончательно устранить дублирование вашего и чужого кода, написанного опять же на БЭМ
    • Общий принцип работы в БЭМ такой: сначала определите из чего состоит большинство ваших элементов. Например - вы используете header, footer, content, info, top, bottom и тд из которых состоят ваши блоки на странице. Все. Запомните, что они у вас всегда элементы. Блоков с такими именами быть не должно, запутаетесь и сломаете мозги. То есть на сайте у вас не может быть блока .header, потому что вы определили __header как элемент. Теперь на вашем сайте есть блок например .page, и у .page__header - и есть ваш хедер от сайта. Потом вы создаете продукт .product, и .product__header - это верх продукта. Следующий момент: иногда неразумно писать 10 классов, если этот кусок верстки встречается 1 раз и не повторяется. Создайте дополнительный блок! Так например, в шапке сайта находится совершенно уникальное поле для поиска, которого не видно больше нигде на сайте (на сегодняшний день) - назовите его .b-page-header-search и разбейте на элементы как угодно. Вам не нужно писать .b-page-header__элемент.b-page-search__element, поскольку общего у них будет ну разве что position relative. Когда дойдете до следующего поиска - вернетесь назад и исправите этот, не нужно продумывать на будущее, вы будете терять кучу времени в изучении и все равно запутаетесь.


    Три способа реализации при БЭМ:
    Вариант 1. Без вложенности - имя элемента составляется из имени блока и элемента для избежания дублирования
    <style>
    .select__selectitem {...}
    .menu__selectitem {...}
    </style>
    <div class="menu">
      <div class="menu__menuitem">
        Menu item 3
        <div class="select">
          <div class="select__selectitem menu__selectitem">option1</div>
          <div class="select__selectitem menu__selectitem">option2</div>
        </div>
      </div>
    </div>


    Вариант 2. Со вложенностью, если есть модификатор - вложенность сделать можно, осознавая что при подключении стилей из других проектов также придется работать со вторым уровнем вложенности
    <style>
    .select_type_in-menu .select__item {...} // БЭМ не_запрещает вложенность, если есть модификатор
    </style>
    <div class="menu">
      <div class="menu__item">
        Menu item 3
        <div class="select select_type_in-menu">
          <div class="select__item">option1</div>
          <div class="select__item">option2</div>
        </div>
      </div>
    </div>


    Вариант 3. Без вложенности. Создание класса для каждого элемента с модификатором. Минус - дополнительные классы, увеличивающие сложность при чтении верстки
    <style>
    .select__item_type_in-menu {...}
    </style>
    <div class="menu">
      <div class="menu__item">
        Menu item 3
        <div class="select">
          <div class="select__item select__item_type_in-menu">option1</div>
          <div class="select__item">option2</div>
        </div>
      </div>
    </div>
    Ответ написан
  • Как защитить свою верстку от рипа?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Демонстрация экрана иногда решает проблему
    Ответ написан
    Комментировать
  • Почему PCRE (PHP) не читает символ < (меньше) при разборе верстки?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    Текущее решение:
    <?
      $text = <<<TEXT
        <scriptsrc=""></script>
        <script blablabla src=""></script>
        <script src=""></script>
        <script blabl abla src="123.js"></script>
        <script bla 22bl2 abla src="tanks/tank.js"></script>
    TEXT;
    
      $match = array();
      $tmp = str_replace("<script", "|script", $text);
      preg_match_all('/\|script[^<>]+src=[\'"]([^\'"]+)/ium', $tmp, $match);
    
      echo "<pre>";
      print_r($match);


    Но вопрос все еще актуален! ПОЧЕМУ (мать такая)?
    Ответ написан
    Комментировать
  • Почему запрос из PHP идет 10 секунд, а из консоли или навиката тот же запрос - 0.2 сек?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    Прошу прощения посетившим, решение найдено, но оно никак не было связано с запросом.
    Проблема была в пользовательской сортировке usort($arr, function () { return mb_strcasecmp($a,$b); }); - слишком долго происходила
    Ответ написан
    Комментировать