Привет, читатель!
Сегодня я расскажу, как админке материала добавить все родительские категории автоматически, избежав надоедливых поисков и кликов мышкой. Ведь я уверен, Вы тоже не любите тратить на это время.
От слов к делу.
Решение представляет собой 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.