【環境情報】
・baserCMSのバージョン:5.2.1
・レンタルサーバー名:XAMPP on Windows
・使用テーマ:BcCosmo
・PHPスキル(自己評価):始めて20日程度の全くの初心者
少々以前にここで質問した件の続きです。その後あれやこれやを学習し、またAIにも助けてもらってCOREに手を付けずに実現することができました。pluginではなく、テーマにファイルを追加と変更で実現しています。イベントを拾って確認コードを走らせます。
plugins/テーマ/config/setting.php
に以下を記述します。BcCosmoにはこのファイルは無かったので作成しました。
<?php
use Cake\Event\EventManager;
use Cake\Event\EventInterface;
EventManager::instance()->on('Model.beforeMarshal', function (EventInterface $event, \ArrayObject $data) {
$table = $event->getSubject();
if ($table->getAlias() === 'MailMessages') {
$validator = $table->getValidator('default');
// 第1引数: フィールド名
// 第2引数: エラーメッセージ (string)
// 第3引数: 条件判定用コールバック (callable)
$validator->allowEmptyString('appver', '必須項目です。', function ($context) {
// ラジオボタンの値を取得
$radioVal = $context['data']['what'] ?? null;
// 「不具合の報告」以外の場合は「空を許可」する(=trueを返すとバリデーションをスルー)
// 「不具合の報告」の場合は「空を許可しない」ため、falseを返す
return ($radioVal !== '不具合の報告');
});
}
});
return [];
これで条件付き必須が実現できました。また、「不具合の報告」のときは「必須」を、それ以外のときは「任意」を表示することもできました。
plugins/テーマ/templates/layout/default.php
の
</body>
の上に以下を挿入します。
<?php if ($this->getRequest()->getParam('plugin') === 'BcMail'): ?>
<script>
$(function() {
var radioName = 'what';
var triggerValue = '不具合の報告';
var targetFieldId = 'FieldMessageAppver'; // 実際のテキスト項目のID、ブラウザで調べる
var $targetField = $('#' + targetFieldId);
var $parentRow = $targetField.closest('tr');
// 「必須」または「任意」という文字が入っているspanを正確に取得
var $badge = $parentRow.find('th span').filter(function() {
var text = $(this).text();
return text.indexOf('必須') !== -1 || text.indexOf('任意') !== -1;
});
function updateValidationUI() {
var selectedValue = $('input[name="' + radioName + '"]:checked').val();
if (selectedValue === triggerValue) {
// --- 必須モード ---
$targetField.prop('required', true);
$badge.text('必須');
// クラスを他の項目と同一のものに差し替え、クラスはブラウザで調べる
$badge.removeClass('normal').addClass('required');
} else {
// --- 任意モード ---
$targetField.prop('required', false);
$badge.text('任意');
// クラスを他の項目と同一のものに差し替え
$badge.removeClass('required').addClass('normal');
}
}
// 変更イベントの監視
$(document).on('change', 'input[name="' + radioName + '"]', updateValidationUI);
// 初期実行(確認画面からの戻りや読み込み時)
updateValidationUI();
});
</script>
<?php endif; ?>
またまた初歩的なことを聞いて恐縮ですが、テーマのファイルを改変したり、ファイルを追加することは問題ないとされているのでしょうか?


