Кастомизация TicketForm
Доброго времени суток, сообщество =)
На днях, видел вопрос человека, еще на старом сайте сообщества, о том, как же добавить свои поля в форму редактирования\создания тикетов.
Вот мой вариант, который только что написал. За основу, в целом взял подход Василия (ну т.е так как сделано тут), т.к считаю его оптимальным.
И так, первой что делаем, это добавляем в чанк tplSectionRow параметр, который будем ловить в лиснере и по нему выставлять значение параметра. Т.к я использую как и сдесь завязку на parent то его и ловим.
это делает лиснер onChange, обновляя страницу, не забывая сохранить все ее содержимое в локальном кэше. Все в общем содрано у Василия, ни на что не претендую.
Ну и собственно в обертку формы все это дело вставляем:
tpl.Tickets.form.create
На днях, видел вопрос человека, еще на старом сайте сообщества, о том, как же добавить свои поля в форму редактирования\создания тикетов.
Вот мой вариант, который только что написал. За основу, в целом взял подход Василия (ну т.е так как сделано тут), т.к считаю его оптимальным.
И так, первой что делаем, это добавляем в чанк 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>
Все! Это всего лишь пример и конечно идею можно развить, добавив туда вывод нескольких полей, циклы, что угодно. Но основа останется примерно такая- что все управление передается сниппету, а он уже решает что ему нужно. Комментарии: 3
Обратил внимание, что если открывать например страницу по ссылке
modx.pro/topic/?parent=crowdfunding
то в секции разумеется может открыться явно не Краудфандинг, а либо дефолт, либо последний сохраненный в кеше браузера стейт… По хорошему конечно такого быть не должно, и когда делается переход по ссылке, должна автоматом подставляться соответствующая секция… Попробую исправить, если никто не опередит, по идее все что нужно это добавить соответствие секции к параметру parent и заставлять делать его активным в обертке тикетов…
modx.pro/topic/?parent=crowdfunding
то в секции разумеется может открыться явно не Краудфандинг, а либо дефолт, либо последний сохраненный в кеше браузера стейт… По хорошему конечно такого быть не должно, и когда делается переход по ссылке, должна автоматом подставляться соответствующая секция… Попробую исправить, если никто не опередит, по идее все что нужно это добавить соответствие секции к параметру parent и заставлять делать его активным в обертке тикетов…
Так и сделано, и у меня нормально всё работает.
Дальше делаем чанк extFormCreate в котором и будет логика, кому-чего показывать и какие плейсхолдеры выставлять.
Можно пример, что в этом чанке может быть?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.