Jump to content

Sélection automatique des catégories parentes


stevent
 Share

Recommended Posts

Bonjour à tous !

 

Un de mes clients en PRESTASHOP 1.6.1.7 me donne une mission assez complexe ( à mes yeux en tous cas ).

 

La question est simple, afin de ne pas devoir passer son temps à cocher toutes les catégories ( Il en à 40 000 ), il souhaite pouvoir sélectionner plusieurs catégories d'un coup. Je m'explique : 

 

S'il coche une catégorie en niveau 5, il faudrait que les catégories parentes soient AUTOMATIQUEMENT COCHEES.

 

Deuxième chose, éventualité d'ajouter un bouton "Tout cocher" mais pas celui qui est déja existant, un bouton qui permet de ne cocher que le ficher ouvert !

 

J'ai joins une image pour explication.

 

Quelqu'un pense que ce serait envisageable ??

 

Merci d'avance !

post-521137-0-31680100-1487068717_thumb.png

Share this post


Link to post
Share on other sites

Bonjour,

 

Vous pouvez intervenir directement sur votre fichier tree.js (admin/themes/default/js/) en éditant la méthode init du prototype du constructeur Tree utilisé sur la page admin products.

Votre fichier contiendrait alors ceci :

var Tree = function (element, options)
{
	this.$element = $(element);
	this.options = $.extend({}, $.fn.tree.defaults, options);
	this.init();
};

Tree.prototype =
{
	constructor: Tree,

	init: function ()
	{
		var that = $(this);

		this.$element.find("label.tree-toggler, .icon-folder-close, .icon-folder-open").click(
			function ()
			{
				if ($(this).parent().parent().children("ul.tree").is(":visible"))
				{
					$(this).parent().children(".icon-folder-open")
						.removeClass("icon-folder-open")
						.addClass("icon-folder-close");

					that.trigger('collapse');
				}
				else
				{
					$(this).parent().children(".icon-folder-close")
						.removeClass("icon-folder-close")
						.addClass("icon-folder-open");

					that.trigger('expand');
				}
				$(this).parent().parent().children("ul.tree").toggle(300);
			}
		);
		this.$element.find("li").click(
			function ()
			{
				$('.tree-selected').removeClass("tree-selected");
				$('li input:checked').parent().addClass("tree-selected");
			}
		);
		this.$element.find("input").click(
			function () // Select/Unselect all parent main cats
			{
				var isChecked = $(this).is(':checked');
				
				if (isChecked) {
					$(this).parents('.tree-folder').find('input:first').prop('checked', true);
				}
				if (!isChecked) {
					var anItemIsChecked = false;
					$(this).parents('ul.tree').find('.tree-item input').each(function(i) {
						var thisChecked = $(this).is(':checked');
						if (thisChecked) {
							anItemIsChecked = true;
						}
					});
					if (!anItemIsChecked) { // If one item inside ul.tree is checked, do not uncheck...
						$(this).parents('.tree-folder').find('input:first').prop('checked', false);
					}
					// And finally, uncheck direct parent if no sibling item is checked 
					var aSibIsChecked = false;
					$(this).parents('.tree:first').find('.tree-item input').each(function(i) {
						var thisChecked = $(this).is(':checked');
						if (thisChecked) {
							aSibIsChecked = true;
						}
					});
					if (!aSibIsChecked) {
						$(this).parents('.tree-folder:first').find('input:first').prop('checked', false);
					}
				}
			}
		);

		return $(this);
	},
	
	collapseAll : function($speed)
	{
		this.$element.find("label.tree-toggler").each(
			function()
			{
				$(this).parent().children(".icon-folder-open")
					.removeClass("icon-folder-open")
					.addClass("icon-folder-close");
				$(this).parent().parent().children("ul.tree").hide($speed);
			}
		);

		return $(this);
	},

	expandAll : function($speed)
	{
		this.$element.find("label.tree-toggler").each(
			function()
			{
				$(this).parent().children(".icon-folder-close")
					.removeClass("icon-folder-close")
					.addClass("icon-folder-open");
				$(this).parent().parent().children("ul.tree").show($speed);
			}
		);

		return $(this);
	},
};

$.fn.tree = function (option, value)
{
	var methodReturn;
	var $set = this.each(
		function ()
		{
			var $this = $(this);
			var data = $this.data('tree');
			var options = typeof option === 'object' && option;

			if (!data){
				$this.data('tree', (data = new Tree(this, options)));
			}
			if (typeof option === 'string') {
				methodReturn = data[option](value);
			}
		}
	);

	return (methodReturn === undefined) ? $set : methodReturn;
};

$.fn.tree.Constructor = Tree;
  • Like 1

Share this post


Link to post
Share on other sites

Merci pour la réponse. Par contre, autant le tpl n'à presque plus de secrets pour moi, autant le javascript j'ai encore beaucoup à apprendre.

Sauriez vous éventuellement me mettre sur la voie ... ?

 

Merci d'avance.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More