Привет, читатель!
Сегодня я расскажу, как админке материала добавить все родительские категории автоматически, избежав надоедливых поисков и кликов мышкой. Ведь я уверен, Вы тоже не любите тратить на это время.
От слов к делу.
Решение представляет собой JS код, который необходимо добавить в файл, который подключается в админке. Работу кода я описывать не буду, так как думаю, что если Вы хоть немного понимаете, то разберетесь. А если не понимаете, оно Вам и не нужно, ага?
// FICTIONLABS ADD PARENT CATEGORIES START
// Get Category Level
function flGetCategoryLevel(text) {
var level = text.split('.').length;
if (level == 0) {
level = 1;
}
return level;
}
// Get Parent Categories By ID
function flGetParentCategories(id) {
var tree = [];
var select = $('#categories');
var prevLevel = currentLevel = 1;
var parents = [];
var idx = 0;
var result = [];
// Get Categories Array
select.find('option').each(function(index, el) {
currentLevel = flGetCategoryLevel($(el).text());
if (currentLevel > prevLevel) { // Child Category
idx = index - 1; // Get Parent Option Index
parents.push(select.find('option').eq(idx).attr('value')); // Get Parent Id
} else if (currentLevel < prevLevel) { // Parent Category
for (var i = parents.length; i >= currentLevel; i--) {
parents.pop(); // Remove All IDs
}
}
var key = $(el).attr('value');
var name = $(el).text().split('|_')[1] ? $(el).text().split('|_')[1] : $(el).text().split('|_')[0];
tree[key] = [];
tree[key]['name'] = $.trim(name);
tree[key]['level'] = flGetCategoryLevel($(el).text());
tree[key]['parents'] = parents.join();
prevLevel = currentLevel; // Next Level
});
result = tree[id]['parents'].split(',');
return result;
}
// Change Select Function
function flChangeSelect(id) {
var parents = flGetParentCategories(id);
var selectedItems = $('#categories').val();
var result = $.merge(selectedItems, parents);
$('#categories').val(result).trigger('liszt:updated');
}
// On Change Event
var valArray = ($('#categories').val()) ? $('#categories').val() : [];
$('#categories').on('change', function(event) {
var val = $(this).val(),
numVals = (val) ? val.length : 0,
changes;
if (numVals != valArray.length) {
var longerSet, shortSet;
(numVals > valArray.length) ? longerSet = val : longerSet = valArray;
(numVals > valArray.length) ? shortSet = valArray : shortSet = val;
//create array of values that changed - either added or removed
changes = $.grep(longerSet, function(n) {
return $.inArray(n, shortSet) == -1;
});
if (numVals > valArray.length) {
flChangeSelect(changes);
}
}
valArray = ($(this).val()) ? $(this).val() : [];
});
// FICTIONLABS ADD PARENT CATEGORIES END
Например, это можно сделать, добавив этот код в файл /media/zoo/applications/jbuniversal/assets/js/back-end.js
Уже измененный файл я прикрепил отдельным сообщением для самых ленивых.
Все, теперь при добавлении любой дочерней категории в список категорий попадут и все ее родители.
Код рожден в муках, при финансовой поддержке happy home.













