問い合わせ条件付き必須項目 できました

【環境情報】
・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; ?>

またまた初歩的なことを聞いて恐縮ですが、テーマのファイルを改変したり、ファイルを追加することは問題ないとされているのでしょうか?

@beshio
basermarketで提供されている「Cosmo」というテーマであれば
「baserマーケット標準販売ライセンス」となっているため、それに反しなければ問題ないと思われます。

以下リンクを参考にしてみてください。
baserマーケット標準販売ライセンス

また他のプラグインやテーマについてはライセンスが異なる場合もございますので、ご確認の上ご利用ください。
▼Cosmoの場合

このようなライセンスの存在を認識しておりませんでした。ご教授感謝いたします。

「いいね!」 1