CSS — PHP Как перезаписать определенный раздел файла

У меня есть небольшой файл CSS.

:root {
--header-bg:
#004d73;
--header-title-color:
#dbebfa;
}

Я пытаюсь написать скрипт, который принимает входное значение и перезаписывает определенную строку в файле CSS с новыми данными. Вот что у меня так далеко.

 $path = 'custom-test.css';
if (isset($_POST['header-bg'])) {
$fh = fopen($path,"a+");
$string = $_POST['header-bg'];
fwrite($fh,$string,7); // Write information to the file
fclose($fh); // Close the file
header('Location: ' . $_SERVER['HTTP_REFERER']);
}

Это работает, за исключением того, что он просто добавляет данные в конец файла.

Я не могу понять, нужно ли мне указывать, какую строку перезаписывать через fopen, fwrite, или мне нужен сценарий, чтобы открыть весь файл в массив (который путь вне моего элементарного набора навыков PHP).

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

Кстати, не вдаваясь в детали, я не могу использовать запись в базе данных для этого.

0

Решение

Вы можете использовать файл шаблона, и str_replace функционировать и делать это так.

Давайте предположим, что у вас есть style.css который содержит это:

:root {
--header-bg: #004d73;
--header-title-color: #dbebfa;
}

и у тебя есть template.style.css который содержит это:

:root {
--header-bg: {{background}};
--header-title-color: {{color}};
}

Теперь все, что вам нужно сделать, когда вам нужно изменить style.css, это заменить значения в template.style.css и поместите контент в style.css

<?php

$background = $_POST['background'];
$color      = $_POST['color'];
// you may need to check these values before using them

$contents = file_get_contents('template.style.css');
$css = str_replace('{{background}}',$background,$contents);
$css = str_replace('{{color}}',$color,$css);
file_put_contents('style.css',$css);?>

Обновить

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

Самый простой способ — изменить каждый файл вручную для каждого веб-сайта, поскольку вы не собираетесь изменять их снова, но! если вы хотите что-то более динамичное, все равно вам не нужен php, потому что в этом вам понадобится Less.js: использование 2 переменных в вашем меньшем файле (вам не нужно менять CSS, вам нужно только заменить цвета на имя переменной @varName) и установите переменную через less.js для каждого сайта.

Обновить

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

-1

Другие решения

Лучший и стандартный способ сделать это — создать файл шаблона, а затем отобразить этот файл с параметрами.
Взгляни на этот

Сначала создайте файл шаблона следующим образом:

:root {
--header-bg: <?=$this->e($headerBg)?>;
--header-title-color: <?=$this->e($headerTitleColor)?>;
}

и в вашем PHP-скрипте:

 $path = './';
$template = 'custom-test.css';
$output = 'output-test.css';
if (isset($_POST['header-bg'])) {
$params = [
'headerBg' => $_POST['header-bg'],
'headerTitleColor' => ''
];
$templates = new League\Plates\Engine($path);
file_put_content($output, $templates->render($template, $params));
header('Location: ' . $_SERVER['HTTP_REFERER']);
}

Вы должны установить этот пакет с помощью composer (если вы используете composer):

composer require league/plates

А затем импортируйте его в свой скрипт require 'vendor/autoload.php'
Если вы не используете композитор, вы должны загрузить и включите следующие файлы в ваш скрипт

    "src/Template/match.php",
"src/Extension/Data/data.php",
"src/Extension/Path/path.php",
"src/Extension/RenderContext/func.php",
"src/Extension/RenderContext/render-context.php",
"src/Extension/LayoutSections/layout-sections.php",
"src/Extension/Folders/folders.php",
"src/Util/util.php"
-1

По вопросам рекламы [email protected]