Для хранения переменных, которые меняются не очень часто, можно использовать хранение переменных в файлах (формат ключ-значение). Среди таких данных: email-ы, адреса, счетчики поисковых систем, числовые и строковые константы (описания). Среди достоинств такого подхода:
- не генерируется дополнительный запрос в БД,
- константы не "вшиваются" в код программы.
Сначала установим права на редактирование файла config/params.php:
sudo chown -R www-data:www-data config/params.php
sudo chmod -R 755 config/params.php
Также, следует занести params.php в .gitignore.
В бекенде создадим helper:
<?php
namespace app\backend\helpers;
use Yii;
use yii\helpers\VarDumper;
class ParamsHelper
{
public static function getConfig()
{
$directory = Yii::getAlias('@app/config');
$filename = $directory. '/params.php';
$config = require($filename);
return $config;
}
public static function setConfig($config)
{
$directory = Yii::getAlias('@app/config');
$filename = $directory. '/params.php';
file_put_contents($filename, "<?php\nreturn " . VarDumper::export($config) . ";\n", LOCK_EX);
return true;
}
}
Далее, создаем контроллер
<?php
namespace app\backend\controllers;
use app\backend\helpers\ParamsHelper;
use yii\base\DynamicModel;
use yii\web\Controller;
class StatisticController extends Controller
{
public function actionIndex()
{
$model = ParamsHelper::getConfig();
$labels = self::getLabels();
return $this->render('index', [
'model' => $model,
'labels' => $labels
]);
}
public function actionUpdate()
{
$config = ConfigHelper::getConfig();
$fields = self::fields($config);
$model = new DynamicModel($fields);
$model
->addRule($fields, 'required')
->addRule($fields, 'string',['max'=>500]);
$labels = self::getLabels();
foreach ($fields as $field) {
$model->$field = $config[$field];
}
if ($model->load(\Yii::$app->request->post()) && $model->validate()) {
if (ParamsHelper::setConfig($model->attributes)) {
\Yii::$app->session->setFlash('success', 'Данные обновлены');
sleep(4);
return $this->redirect('index');
}
}
return $this->render('update', [
'model' => $model,
'labels' => $labels
]);
}
protected function fields($config)
{
$result = [];
foreach ($config as $itemKey => $item) {
array_push($result, $itemKey);
}
return $result;
}
protected function getLabels()
{
return [
'adminEmail' => 'Админ-email'
];
}
}
Теперь, по маршруту /backend/statistic/index
доступен список переменных (не забудьте создать файл index.php), по маршруту /backend/statistic/update
доступно редактирование; примерное содержание файла update.php:
<div class="backend-params-update box box-primary">
<?php $form = ActiveForm::begin(); ?>
<div class="box-body table-responsive">
<?php foreach ($model->attributes as $attributeKey => $attribute) : ?>
<?= $form->field($model, $attributeKey)->textInput(['maxlength' => true])->label(isset($labels[$attributeKey]) ? $labels[$attributeKey] : $attributeKey) ?>
<?php endforeach; ?>
</div>
<div class="box-footer">
<?= Html::submitButton('Сохранить', ['class' => 'btn btn-success btn-flat']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
Среди недостатков можно отметить, что список переменных заранее должен быть задан, однако создание функционала для добавления новых переменных несложен в реализации.
{{ 'Comments (%count%)' | trans {count:count} }}
{{ 'Comments are closed.' | trans }}