---
title: Страница поиска
section: pages
theme: mebelidomanet
framework: bootstrap
redesign_status: done
last_updated: 2026-07-18
files:
  php_inline: []
  php_partials:
    - views/search/index.php
    - views/search/detail.php
    - views/search/_search-form.php
  scss:
    - src/client/search-md/style.scss
  js:
    - src/client/search/index.js
  widgets: []
  shared: []
deps_on:
  - catalog/category-page
  - catalog/product-card
  - catalog/pagination
themes_with_analog:
  - mebelmall
  - dommebeli
  - mebelmart
  - freshshop
  - mebelmag
  - mebelbazar
  - hormebel
  - cartzilla
  - mebelmarket
  - stolkomebeli
---

# Страница поиска

## Назначение

Две страницы: `/search` (`index.php`) — пустая форма, и `/search/<query>` (`detail.php`) — результаты. Форма вынесена в `_search-form.php` и рендерится на обеих.

Поиск в мобильном меню — отдельный блок, см. [layout/mobile-nav](../layout/mobile-nav.md). Поиск в десктопной шапке — инпут `.searchQuery` в `views/layouts/main.php`.

## Где живёт

- **HTML:** `views/search/index.php`, `views/search/detail.php`, `views/search/_search-form.php`.
- **SCSS:** `src/client/search-md/style.scss`.
- **JS:** `src/client/search/index.js` — вешает `onsubmit` на все `.search`, редиректит на `/search/<query>`.

## Редизайн

**Выполнен** (2026-07-18) в стиле ../mebel-landing на чистом BS4+SCSS.

- **Заголовок** — переиспользует готовый `.md-cat-head` из [category-page](../catalog/category-page.md) (Fraunces, sentence-case). Свой h1 не заводили.
- **Сетка результатов** — переиспользует `.md-listing` / `.md-listing__col` / `.md-listing__summary` оттуда же: 2 карточки в ряд на телефонах (`col-6`), 3 с `lg`. Было `col-md-4` (3 в ряд везде, на телефоне — 1). Пагинация отцентрована (`d-flex justify-content-center`), как на категории.
- **Форма** `.md-search-form` — белая карточка, hairline `$md-line`, иконка лупы, кнопка в `$md-accent-dark`. `:focus-within` даёт рамку `$md-accent` + мягкое кольцо. Было: BS-инпут курсивом `width:80%` + пустая кнопка-заглушка (`button:first-of-type` прятался в CSS) — заглушку убрали.
- **Форма добавлена на страницу результатов** — раньше её там не было, уточнить запрос можно было только через шапку.
- **Пустой результат** — `.md-search-empty` вместо дефолтного «No results found.» ListView.

## Скоупинг (важно)

Все правила лежат под `.md-search-page` — обёртка в `index.php` / `detail.php`. Причина: два соседних класса общие с другими страницами и темами, править их in-place нельзя.

- `.menu-catalog-sidebar` — тот же виджет на `views/factory/{index,detail}.php`. Редизайн вынесен в `src/client/catalog-nav-md/style.scss` на opt-in классе `md-catalog-nav` (добавляется в `parentClass` виджета), см. [page-factory](page-factory.md).
- `.page-search` / `.page-search__search` (`src/client/page-search/index.scss`) — бандл `web/assets/bundle.css` **один на все темы** (`assets/AppAsset.php`), а `page-search` ещё используют `themes/mebelmarket`, `themes/mebelmag` и др. Поэтому SCSS-файл и его импорт оставлены как есть — классы убраны только из вьюх корневой темы.

## Прочее

- В `_search-form.php` значение инпута теперь через `Html::encode()` — раньше `$_GET['query']` подставлялся в `value` сырым (XSS).
- Классы `.search` и `.searchInput` на форме/инпуте сохранены намеренно: на них завязан обработчик в `search/index.js`. Переименование сломает сабмит.
- Инпут — `font-size: 16px`, иначе iOS Safari зумит страницу при фокусе.
- У кнопки явный `margin: 0` + `display: inline-flex` — страховка от легаси `aside form button { display:block; margin:15px auto 0 }` в `src/client/vendor/media.css` (см. [layout/mobile-nav](../layout/mobile-nav.md), там оно уже стреляло).
