Yii2-如何在设置中设置选中和保存复选框?

hl0ma9xz  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(306)

大家好,我有复选框的问题,我必须设置默认情况下被选中,其他人编程这一点,我是新的这段代码,所以如果有人知道如何解决这个问题,我将不胜感激。
下面是我的代码:

  1. use app\settings\SettingsModel;
  2. use app\helpers\Html;
  3. use yii\helpers\ArrayHelper;
  4. use youdate\widgets\ActiveForm;
  5. use trntv\aceeditor\AceEditor;
  6. /** @var $elements array */
  7. /** @var $title string */
  8. /** @var $subTitle string */
  9. /** @var $model SettingsModel */
  10. $message = \Yii::$app->session->getFlash('settings');
  11. ?>
  12. <div class="card">
  13. <div class="card-header">
  14. <h3 class="card-title"><?= Html::encode($title) ?></h3>
  15. </div>
  16. <?php $form = ActiveForm::begin() ?>
  17. <div class="card-body">
  18. <?= $this->render('/_alert') ?>
  19. <?php if (isset($subTitle)): ?>
  20. <h4 class="mb-5"><?= Html::encode($subTitle) ?></h4>
  21. <?php endif; ?>
  22. <?php foreach ($elements as $alias => $element) {
  23. if (is_callable($element['type'])) {
  24. echo $element['type']($model, $alias);
  25. } else {
  26. switch ($element['type']) {
  27. case 'dropdown':
  28. echo $form->field($model, $alias)
  29. ->dropDownList(is_callable($element['options']) ? $element['options']() : $element['options'], [
  30. 'prompt' => Yii::t('youdate', '-- Select --'),
  31. ])
  32. ->hint($element['help']);
  33. break;
  34. case 'checkboxList':
  35. echo $form->field($model, $alias)->checkboxList($element['options'])->hint($element['help']);
  36. break;
  37. case 'checkbox':
  38. echo $form->field($model, $alias)->checkbox(isset($element['options']) ?: [])->hint($element['help']);
  39. break;
  40. case 'code':
  41. echo $form->field($model, $alias)->widget(AceEditor::class, ArrayHelper::merge(isset($element['options']) ? $element['options'] : [], [
  42. 'mode' => 'php',
  43. 'containerOptions' => [
  44. 'style' => 'width: 100%; min-height: 200px'
  45. ]
  46. ]))->hint($element['help']);;
  47. break;
  48. default:
  49. case 'text':
  50. echo $form->field($model, $alias)->hint($element['help']);;
  51. }
  52. }
  53. } ?>
  54. </div>
  55. <div class="card-footer d-flex justify-content-end">
  56. <?= Html::submitButton(Yii::t('youdate', 'Save'), ['class' => 'btn btn-primary']) ?>
  57. </div>
  58. <?php $form->end() ?>
  59. </div>```

我试着用这样的东西:

  1. ```$model->$alias= true;
  2. echo $form->field($model, $alias)->checkbox(isset($element['options']) ?: [])->hint($element['help']);```

我实现了设置复选框默认选中,但我认为信息必须存储在后台会话中生效,所以只有当我点击提交按钮时才能工作,但我想存储它而不点击按钮。
所以我将分享一些代码下面,这是包含在这个文件。SettingsAction代码:

  1. ```<?php
  2. namespace app\settings;
  3. use app\traits\RequestResponseTrait;
  4. use app\traits\SessionTrait;
  5. /**
  6. * @package app\settings
  7. */
  8. class SettingsAction extends \yii\base\Action
  9. {
  10. use RequestResponseTrait, SessionTrait;
  11. /**
  12. * @var string
  13. */
  14. public $category;
  15. /**
  16. * @var string
  17. */
  18. public $viewFile;
  19. /**
  20. * @var array|callable
  21. */
  22. public $viewParams = [];
  23. /**
  24. * @var array
  25. */
  26. public $items;
  27. /**
  28. * @var string
  29. */
  30. public $title;
  31. /**
  32. * @return string
  33. * @throws \Exception
  34. */
  35. public function run()
  36. {
  37. $settingsManager = new SettingsManager($this->category, $this->items);
  38. $settingsModel = SettingsModel::createModel($this->items);
  39. $settingsModel->setAttributes($settingsManager->getSetting($settingsModel->getAttributes()));
  40. if ($settingsModel->load($this->request->post()) && $settingsModel->validate()) {
  41. $settingsManager->setSetting($settingsModel->getAttributes());
  42. $this->session->setFlash('settings', 'Settings have been saved');
  43. return $this->controller->refresh();
  44. }
  45. $viewParams = is_callable($this->viewParams) ? call_user_func($this->viewParams) : $this->viewParams;
  46. $viewParams = array_merge($viewParams, [
  47. 'settingsManager' => $settingsManager,
  48. 'settingsModel' => $settingsModel,
  49. 'items' => $this->items,
  50. 'title' => $this->title,
  51. ]);
  52. return $this->controller->render($this->viewFile, $viewParams);
  53. }
  54. }```

下面是ActiveField的代码:

  1. ```<?php
  2. namespace youdate\widgets;
  3. use app\helpers\Html;
  4. /**
  5. * @package youdate\widgets
  6. */
  7. class ActiveField extends \yii\widgets\ActiveField
  8. {
  9. /**
  10. * @var array
  11. */
  12. public $labelOptions = ['class' => 'form-label'];
  13. /**
  14. * @param array $options
  15. * @param bool $enclosedByLabel
  16. * @return \yii\widgets\ActiveField|ActiveField
  17. */
  18. public function checkbox($options = [], $enclosedByLabel = false)
  19. {
  20. $options['class'] = 'custom-control-input';
  21. if (!isset($options['uncheck'])) {
  22. $this->parts['{uncheck}'] = Html::hiddenInput(Html::getInputName($this->model,$this->attribute), 1);
  23. $options['uncheck'] = false;
  24. } else {
  25. $this->parts['{uncheck}'] = 'true';
  26. }
  27. $this->template = '
  28. {uncheck}
  29. <label class="custom-control custom-checkbox">
  30. {input}
  31. <span class="custom-control-label">{labelText}</span>
  32. </label>';
  33. $this->parts['{name}'] = $this->attribute;
  34. $this->parts['{labelText}'] = $this->model->getAttributeLabel($this->attribute);
  35. if (isset($options['value'])) {
  36. $this->parts['{value}'] = $options['value'];
  37. } else {
  38. $this->parts['{value}'] = $this->model->{$this->attribute};
  39. }
  40. return parent::checkbox($options, $enclosedByLabel);
  41. }
  42. /**
  43. * @param array $options
  44. * @param bool $enclosedByLabel
  45. * @return ActiveField
  46. */
  47. public function radio($options = [], $enclosedByLabel = true)
  48. {
  49. $this->labelOptions['class'] = 'custom-control custom-radio';
  50. $this->parts['{customInput}'] = Html::activeRadio($this->model, $this->attribute, [
  51. 'class' => 'custom-control-input',
  52. 'label' => false,
  53. ]);
  54. $this->radioTemplate = "<label class=\"custom-control custom-radio\">{customInput}<div class=\"custom-control-label\">{labelTitle}\n</div></label>\n{error}\n{hint}";
  55. return parent::radio($options, $enclosedByLabel);
  56. }
  57. /**
  58. * @param null $label
  59. * @param array $options
  60. * @return \yii\widgets\ActiveField
  61. */
  62. public function label($label = null, $options = [])
  63. {
  64. if ($label !== null) {
  65. $this->parts['{labelText}'] = $label;
  66. }
  67. return parent::label($label, $options);
  68. }
  69. }```

还有很多文件是通过复选框和设置表单连接的,但我认为这些是最重要的

arknldoa

arknldoa1#

按照你的代码:

  • )->checkbox(isset($element['options']) ?: [])选项通过$element['options'],其中一个数组元素可以是'checked' => 1
  • 也可以硬编码)->checkbox(['checked' => 1])
  • 即使是基于条件,比如说,你的字段的名称,你可以合并$element['options']和你的硬编码['checked' => 1],检查将被覆盖。
  • 一个选项也在case 'checkbox':块内,设置$model->$alias = true

相关问题