feat(web-api): seo-блок для product/category get - #599
Conversation
|
Влил #597 (facets) — этот PR теперь конфликтует с Хорошая новость: конфликт тривиальный, всего два файла и чистый union — обе стороны регистрируют свой сервис в одном месте: Нужны обе записи. Проверил локально: после union-резолва всё зелёное — smoke 90, PHPUnit 273. То есть после ребейза PR готов, вопросов по содержанию нет. Заметил, что ты добавляешь новое событие |
|
Ребейзнул на текущую Локально: smoke 90, PHPUnit 273, Про |
4a05882 to
c870b01
Compare
Conflict resolution: integrate with merged PR 598 gallery (ms3_product_gallery_public + ms3_public_seo in registry, seo attach wrapped around gallery-aware getById payload).
|
Этот PR включён в тестовую интеграционную сборку всех открытых PR MiniShop3: AgelxNash/MiniShop3, ветка Сборка нужна, чтобы проверить совместимость взаимозависимых серий PR до их мержа — при последовательном слиянии они конфликтуют друг с другом. Это не ревью и не конкурирующий PR: авторство сохранено (1 PR = 1 коммит с исходным автором), ветка пересобирается по мере обновления PR. Как вошёл в сборку: Конфликт со слитым #598 (галерея) разрешён: в |
|
Отличная работа! Желаю этому PR быстрого мержа и ни одного конфликта 🙌 |
|
PR проверен и к вливанию годен — возвращаю только на ребейз.
Что проверено до конфликтаНа ветке с домердженной актуальной на тот момент Отдельно подтвердил по коду то, что было главным вопросом к этому PR:
Что нужно сделать при ребейзеКонфликтуют:
Первые три — механический union: обе стороны добавляют свою запись рядом с одним якорем ( Четвёртый требует руки, а не accept-both. public function getById(int $productId, array $params = []): ?array
{
$product = $this->findVisibleProduct($productId, $params);
if ($product === null) {
return null;
}
$options = self::stripOptionMetadata(
$this->optionService()->loadOptionsForProduct($productId, false)
);
$includeImages = self::toBool($params['include_images'] ?? false);
$images = $includeImages ? $this->loadImagesForProduct($product) : null;
return $this->formatProduct($product, true, $options, $images);
}То есть #598 вынес построение критериев и выборку в Предупреждаю специально: я прогнал автослияние — git выдаёт синтаксически бессмысленный результат, код seo-привязки уезжает внутрь чужого метода Мелочи, на усмотрение
После ребейза — вливаем. |
Headless SSR needs a stable title/canonical/og contract instead of guessing longtitle vs pagetitle and joining site_url by hand.
|
Rebased onto current Конфликты
Проверки
Мелочи (friendly_urls / searchable / секция events / docs) — на follow-up, как в ревью. |
c870b01 to
0bd77db
Compare
Описание
В ответах
GET /api/v1/product/get/{id}иGET /api/v1/category/get/{id}появляется объектseoсtitle,description,canonical,robotsиog.{title,description,image,type}. Nuxt SSR может собрать<title>, meta description, canonical и базовый Open Graph без своей угадайки по полям ресурса.Плоские поля (
pagetitle,longtitle,description,uri,image/thumb) не меняются.product/list,category/listиcategory/treeполныйseoне отдают.Тип изменений
Связанные Issues
Closes #567
Как это было протестировано?
Локальный CI-гейт (без полной установки MODX/MySQL):
cd core/components/minishop3 php -l src/Services/Seo/PublicSeoBuilder.php php -l src/Services/Seo/PublicSeoService.php composer test:smoke composer ci:php composer stanphp -l(затронутые PHP)composer test:smokecomposer ci:phpcomposer stancomposer ci:php/composer test,npm run lint:ci,composer stan/ GitHub Actions CI)Конфигурация тестирования:
feat/issue-567-public-seo-blockотbetaСкриншоты (если применимо)
Не применимо (JSON API).
Чеклист
composer stan/ CI jobPHPStan)npm run lint:ciдля Vue) — Vue не трогалиДополнительные заметки
Правила derivation:
title← непустойlongtitle, иначеpagetitle.description← непустойdescription, иначеintrotext.canonicalиog.image— absolute URL изsite_urlконтекста (?context=илиcontext_keyресурса) + relative path.robotsдля уже публичных сущностей:index,follow.og.type:product/website.include_seo=0на get убирает ключseo. Default на get — включено.Опциональный хук
msOnGetPublicSeo: плагин патчит$modx->event->returnedValues['seo']. Патч толькоtitleзеркалится вog.title, пока плагин сам не задалog.title. Whitelist отбрасывает неизвестные ключи и не-скаляры. TV mapms3_public_seo_tv_mapв этот PR не входит.Событие появится в Manager после rebuild/upgrade пакета.
Follow-up: get по
uri/alias, multi-size og из галереи (#566),include_seoна list.