fix(config): enable explicit face focus
deploy-preland / deploy barbariskatest (push) Skipped
deploy-preland / deploy zoomstage.online (push) Successful in 33s
deploy-preland / deploy zoompixel.online (push) Skipped
deploy-preland / deploy zoompixel.ru (push) Skipped

This commit is contained in:
Panfilov Konstantin committed 2026-10-17 19:25:05 +03:00
1 parent ed1e476cc6
commit 356eeb9806
5 files changed
+64 -18

No files matched your search

+7 -5
View File
@@ -23,11 +23,13 @@
Не обходить серверные правила доступа к загрузке и результату обработки.
- Рабочий `config.json` на каждом хостинге настраивает владелец. Деплой не имеет
права перезаписывать его значений. При появлении новой обязательной UTM workflow
получает текущий хостовый конфиг и добавляет только отсутствующий ключ через
`bin/ensure-focus-config.php`; имеющиеся значения, включая уже настроенный
`focus`, остаются байт-в-байт прежними. `requisites.html` также живёт только на
хостинге и не перезаписывается. Не создавать target-specific конфиги или
`config.json.example`.
получает текущий хостовый конфиг и меняет только ключи, которые прямо
согласованы в задаче. Иные значения, включая уже настроенные UTM, остаются
байт-в-байт прежними. Для #274 `bin/ensure-focus-config.php` — явное
исключение: он задаёт только новый `focus=face` (default и rnd). После каждого
такого выпуска фактический stage-config следует забрать и зафиксировать в Git.
`requisites.html` также живёт только на хостинге и не перезаписывается. Не
создавать target-specific конфиги или `config.json.example`.
- Коммит в `main` запускает FTP-автодеплой на все цели workflow; откат через `git revert`
также запускает выкат. Коммит, push и изменения хостинга — только по прямому поручению.
- Проверки кода и браузера проводить в Docker без установки ПО на хост.
+1 -1
View File
@@ -65,7 +65,7 @@ Preland всегда формирует полный resolved-набор сво
| `requisites.html` | реквизиты для подвала (HTML), если в `config.json` нет `requisites`. Без обоих — **заглушка «ИП Иванов Иван Иванович»** из `template.php` |
| `images/`, `fonts/`, `favicon/`, `*.css` | статика; `style.min.css` встраивается в страницу |
| `.htaccess` | только сроки кэширования статики (Apache) |
| `config.json` | схема и стартовое значение конфигурации. Рабочий конфиг на каждом хостинге настраивает владелец; deploy не перезаписывает его значения и добавляет только отсутствующие обязательные UTM-ключи |
| `config.json` | снимок актуального stage-конфига и схема. Рабочий конфиг на каждом хостинге настраивает владелец; deploy не заменяет его и меняет только явно согласованные в задаче ключи. После такого изменения актуальный stage-снимок забирают обратно в Git |
### `config.json`
+15 -10
View File
@@ -1,11 +1,13 @@
<?php
/**
* Точечно добавляет новую UTM focus в рабочий конфиг приленда на хостинге.
* Точечно включает UTM focus в рабочем конфиге приленда на хостинге.
*
* Значения уже существующих полей конфигурации намеренно не нормализуются и
* не переписываются: владелец настраивает их непосредственно на стенде или
* production. Скрипт возвращает 0, когда focus уже существует, и 10, когда
* ключ добавлен и config.json требуется загрузить обратно.
* production. В #274 владелец явно задал значения самого нового ключа focus:
* face включён и для TypeIn default, и для rnd. Скрипт возвращает 0, когда
* focus уже совпадает с этим контрактом, и 10, когда требуется загрузить
* обратно config.json с изменённым только focus.
*
* @usage php bin/ensure-focus-config.php /path/to/config.json
*/
@@ -36,12 +38,8 @@ if (!is_array($config) || !isset($config['utm']) || !is_array($config['utm'])) {
exit(2);
}
if (array_key_exists('focus', $config['utm'])) {
fwrite(STDOUT, "focus уже настроен: конфиг не изменён.\n");
exit(0);
}
$config['utm']['focus'] = [
/** Единственное явно согласованное изменение host-config в #274. */
$focus = [
'weights' => [
'center' => 0,
'face' => 1,
@@ -49,6 +47,13 @@ $config['utm']['focus'] = [
'default' => 'face',
];
if (($config['utm']['focus'] ?? null) === $focus) {
fwrite(STDOUT, "focus уже включён: конфиг не изменён.\n");
exit(0);
}
$config['utm']['focus'] = $focus;
try {
$encoded = json_encode(
$config,
@@ -64,5 +69,5 @@ if (file_put_contents($path, $encoded, LOCK_EX) === false) {
exit(2);
}
fwrite(STDOUT, "Добавлен только utm.focus (face включён по умолчанию).\n");
fwrite(STDOUT, "Изменён только utm.focus: face включён по умолчанию и для rnd.\n");
exit(10);
+39
View File
@@ -0,0 +1,39 @@
<?php
/** Регрессия правила: deploy меняет только явно согласованный ключ focus. */
declare(strict_types=1);
$root = dirname(__DIR__);
$script = $root . '/bin/ensure-focus-config.php';
$fixture = [
'host' => 'custom.example',
'requisites' => ['Не менять'],
'utm' => [
'theme' => ['weights' => ['dark' => 7, 'light' => 3], 'default' => 'light'],
'focus' => ['weights' => ['center' => 9, 'face' => 1], 'default' => 'center'],
],
];
$path = tempnam(sys_get_temp_dir(), 'preland-config-');
if ($path === false) {
fwrite(STDERR, "FAIL: не создан временный config.\n");
exit(1);
}
try {
file_put_contents($path, json_encode($fixture, JSON_THROW_ON_ERROR));
exec(PHP_BINARY . ' ' . escapeshellarg($script) . ' ' . escapeshellarg($path), $output, $code);
$actual = json_decode((string) file_get_contents($path), true, 512, JSON_THROW_ON_ERROR);
} finally {
@unlink($path);
}
if ($code !== 10
|| ($actual['host'] ?? null) !== 'custom.example'
|| ($actual['requisites'] ?? null) !== ['Не менять']
|| ($actual['utm']['theme'] ?? null) !== $fixture['utm']['theme']
|| ($actual['utm']['focus'] ?? null) !== ['weights' => ['center' => 0, 'face' => 1], 'default' => 'face']) {
fwrite(STDERR, "FAIL: host-config должен сохранить все значения, кроме явно заданного focus.\n");
exit(1);
}
fwrite(STDOUT, "OK: host config changes only explicit focus\n");
+2 -2
View File
@@ -4,7 +4,7 @@
*
* Репозиторный config.json задаёт схему и стартовые значения. Рабочий конфиг
* владельца на хостинге не перезаписывается: delivery добавляет только
* отсутствующие обязательные UTM-ключи.
* явно согласованные ключи. В #274 это единственный новый ключ focus.
*/
declare(strict_types=1);
@@ -63,7 +63,7 @@ foreach ([
|| !str_contains($block, 'config\\.json$')
|| !str_contains($block, 'ensure-focus-config.php')
|| !str_contains($block, 'Preserve host config and add focus if absent')) {
$failures[] = "{$delivery} обязан сохранять хостовый config.json и добавлять только отсутствующий focus.";
$failures[] = "{$delivery} обязан сохранять хостовый config.json и менять только явно согласованный focus.";
}
}