Кастомизация TicketForm

Доброго времени суток, сообщество =)

На днях, видел вопрос человека, еще на старом сайте сообщества, о том, как же добавить свои поля в форму редактирования\создания тикетов.

Вот мой вариант, который только что написал. За основу, в целом взял подход Василия (ну т.е так как сделано тут), т.к считаю его оптимальным.

И так, первой что делаем, это добавляем в чанк tplSectionRow параметр, который будем ловить в лиснере и по нему выставлять значение параметра. Т.к я использую как и сдесь завязку на parent то его и ловим.
<option value="[[+id]]" [[+selected]] data-name="[[+alias]]">[[+pagetitle]]</option>
теперь alias секции будет собственно подставляться в data-name, которое надо обработать.

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

<script type="text/javascript">
    
    
    
Hash = {
    get: function () {
        var vars = {}, hash, splitter, hashes;
        if (!this.oldbrowser()) {
            var pos = window.location.href.indexOf('?');
            hashes = (pos != -1) ? decodeURIComponent(window.location.href.substr(pos + 1)) : '';
            splitter = '&';
        } else {
            hashes = decodeURIComponent(window.location.hash.substr(1));
            splitter = '/';
        }
        if (hashes.length == 0) {
            return vars;
        } else {
            hashes = hashes.split(splitter);
        }
        for (var i in hashes) {
            if (hashes.hasOwnProperty(i)) {
                hash = hashes[i].split('=');
                if (typeof hash[1] == 'undefined') {
                    vars['anchor'] = hash[0];
                } else {
                    vars[hash[0]] = hash[1];
                }
            }
        }
        return vars;
    },
    set: function (vars) {
        var hash = '';
        for (var i in vars) {
            if (vars.hasOwnProperty(i)) {
                hash += '&' + i + '=' + vars[i];
            }
        }
        if (!this.oldbrowser()) {
            if (hash.length != 0) {
                hash = '?' + hash.substr(1);
            }
            window.history.pushState(hash, '', document.location.pathname + hash);
        } else {
            window.location.hash = hash.substr(1);
        }
    },
    add: function (key, val) {
        var hash = this.get();
        hash[key] = val;
        this.set(hash);
    },
    remove: function (key) {
        var hash = this.get();
        delete hash[key];
        this.set(hash);
    },
    clear: function () {
        this.set({});
    },
    oldbrowser: function () {
        return false;
    }
};


    
    $('#ticket-sections').on('change', function () {
        var params = Hash.get();
        var parent = $(this).find(':selected').data('name');
        if (params) {
            params['parent'] = parent;
        } else {
            params = {
                "parent": parent
            };
        }
        Hash.set(params);
        document.location.reload();
    });
   
</script>
Дальше делаем чанк extFormCreate в котором и будет логика, кому-чего показывать и какие плейсхолдеры выставлять.

<?php
 

if(isset($_REQUEST['parent'])){
 $parent=$_REQUEST['parent'];
    switch ($parent){
        case 'blogs':
             
            $fields='
        	<div class="alert alert-warning fade in">
                <button type="button" class="close" data-dismiss="alert">×</button>
                <strong>Внимания!</strong> Раздел Блоги перед публикацией, проходит модерацию редакторов сайта. Редактор поможет грамотно сверстать дизайн,
                подправит картинки, а так же проверит текст на наличие ошибок орфографии. Как правило публикация статьи происходит день-в день, но если по каким -то причинам
                статья не появилась на сайте а следующий день - большая просьба сообщить об этом в поддержку. Спасибо за понимание!
            </div>';


            $modx->toPlaceholders(
                array(
                    'fields' => $fields,
                    'publishBtn' => '0'),
                    'extForm'
            );

            break;

}

}

Ну и собственно в обертку формы все это дело вставляем:
tpl.Tickets.form.create
[[!extTicketForm]]
<form class="well create" method="post" action="" id="ticketForm">
	<div id="ticket-preview-placeholder"></div>

	<input type="hidden" name="tid" value="0" />

	<div class="form-group">
		<label for="ticket-sections">[[%tickets_section]]</label>
		<select name="parent" class="form-control" id="ticket-sections" >[[+sections]]</select>
		<span class="error"></span>
	</div>

	<div class="form-group">
		<label for="ticket-pagetitle">[[%ticket_pagetitle]]</label>
		<input type="text" class="form-control" placeholder="[[%ticket_pagetitle]]" name="pagetitle" value="" maxlength="50" id="ticket-pagetitle"/>
		<span class="error"></span>
	</div>
	
	[[!+extForm.fields]]

	<div class="form-group">
		<textarea class="form-control" placeholder="[[%ticket_content]]" name="content" id="ticket-editor" rows="10"></textarea>
		<span class="error"></span>
	</div>

	<div class="ticket-form-files">
		[[+files]]
	</div>

	<div class="form-actions row">
		<div class="col-md-6">
			<input type="button" class="btn btn-default preview" value="[[%ticket_preview]]" title="Ctrl + Enter" />
		</div>
		<div class="col-md-6 move-right">
		[[!+extForm.publishBtn:is=`0`:then=``:else=`<input type="button" class="btn btn-primary publish" name="publish" value="[[%ticket_publish]]" title="" />`]]	
			<input type="submit" class="btn btn-danger draft" name="draft" value="[[%ticket_draft]]" title="Ctrl + Shift + Enter" />
		</div>
	</div>
</form>
Все! Это всего лишь пример и конечно идею можно развить, добавив туда вывод нескольких полей, циклы, что угодно. Но основа останется примерно такая- что все управление передается сниппету, а он уже решает что ему нужно.
Clean
14 апреля 2014, 19:05
modx.pro
8
2 852
+2

Комментарии: 3

Clean
15 апреля 2014, 17:47
0
Обратил внимание, что если открывать например страницу по ссылке
modx.pro/topic/?parent=crowdfunding
то в секции разумеется может открыться явно не Краудфандинг, а либо дефолт, либо последний сохраненный в кеше браузера стейт… По хорошему конечно такого быть не должно, и когда делается переход по ссылке, должна автоматом подставляться соответствующая секция… Попробую исправить, если никто не опередит, по идее все что нужно это добавить соответствие секции к параметру parent и заставлять делать его активным в обертке тикетов…
SEQUEL.ONE
27 июля 2016, 14:41
0
Дальше делаем чанк extFormCreate в котором и будет логика, кому-чего показывать и какие плейсхолдеры выставлять.
Можно пример, что в этом чанке может быть?
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3