@Kerm

Можно ли сделать лучше?

Есть сайт _consowear.ru, на главной его странице товары с Ajax подгрузкой, если пролистать товары можно заметить, например рядом с артикулами 190516 или 190521, 190525, 190538 белые пропуски и это не баг, так задумано, руководство хочет чтобы каждый новый артикул начинался с новой строчки, артикулов может быть от 1 до бесконечности, строчка кратна четырем товарам и вот приходится извращаться и пустые товары добавлять в конце чтобы другие артикула переносились с новой строчки, усложняет это все и подгрузка товаров, например вначале может один цвет подгрузится в конце из 3, а со следующей подгрузкой подгружаются еще 2, а после должен идти товар пустышка. А еще после одной коллекции идет следующая коллекция..

И вот к тому же по скольку остатки интернет-магазина скачут, этих цветов тоже может быть разное количество всегда и у меня не получается довести это все до автоматизьма, приходится каждый раз, для каждой коллекции, категории или ситуации пилить свои правила, это неимевоверно выбешивает.

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

Пока я в начале запускаю скрипт:

foreach ($products as $key => $product) {
			$name = $product['name_g'];
			$w_id = $product['w_id'];

			$keys = array_keys(array_column($products, 'name_g', 'w_id'), $name, true);
			$keys = array_values($keys);

			$count = count($keys); // 4

			if (!empty($count)) {
				$products[$key]['key'] = $keys;
				$products[$key]['count'] = $count;

				db_q('INSERT INTO `sh_prod_count_` (`w_id`, `count`, `key`) VALUES ('.(int)$w_id.', '.(int)$count.', "'.serialize($keys).'")');
			}
		}


Который проходит по всему массиву с товарами, подсчитывает сколько одинаковых артикулов и записывает ключи товаров в массиве.

Далее когда уже товары выводятся на сайт, если кол-во товаров в одном артикуле не кратно 4, то я смотрю кол-во товаров в одном артикуле, после ищу последнию ключ товара в этом артикуле и пробовляю к ключу столько пустышех, сколько нужно чтобы товары в этом артикуле были кратны 4, типа в массив добавляются такие пустышки:

Array
(
    [116] => Array
        (
            [w_id] => 29405
            [up] => 3579
            [name_t] => Пальто пуховое женское
            [name_g] => WDLF 190521
        )

    [116.2] => Array
        (
            [test] => 123
            [name] => WESF 190538
        )

    [116.3] => Array
        (
            [test] => 123
            [name] => WESF 190538
        )

    [116.4] => Array
        (
            [test] => 123
            [name] => WESF 190538
        )

)


После еще раз сортирую ksort($trik, SORT_NUMERIC) чтобы пустышки заняли свое место и вывожу на сайт.

Я понимаю что может код и реализация дикая, но спросить совершенно не у кого и решал так как мог задачу, а сейчас вот хочу узнать может найдется тот кто подскажет как можно реализовать было лучше все это?

Сам скрипт вывода у меня страшный, думал еще показывать тут его или нет, но если кому надо все же, то смотрите:

$checkTable = db_t("SHOW TABLES LIKE 'sh_prod_count';");

	if (!empty($checkTable)) {
		$trik = array();

		$a = 0 + $startfrom;

		foreach($ls_p as $k => $r) {
			if ($r['gr_c'] == 308) {
				$a++;
				if (isset($r['count']) && $r['count'] == 5) {
					$product_keys = (isset($r['key']) && !empty($r['key'])) ? unserialize($r['key']) : '';

					$key = $product_keys[4];

					if ($a != $key) {
						$trik[$a] = $r;
						unset($ls_p[$k]);
					} else {
						unset($ls_p[$k]);
					}
				} else {
					$trik[$a] = $r;
					unset($ls_p[$k]);
				}
			}
		}

		// Добавляем товары пустышки
		foreach($trik as $t) {
			$product_count = (isset($t['count']) && !empty($t['count'])) ? $t['count'] : 4;
			$product_keys = (isset($t['key']) && !empty($t['key'])) ? unserialize($t['key']) : '';
			// Дополнительная проверка на то чтобы товаров в массиве было столько же сколько указано в count
			$name = $t['name_g'];

			if ($t['gr_c'] == 318) {
				$keys = array_keys(array_filter(
					$trik, 
					function ($goody) use ($name) {
						if (isset($goody['name_g'])) return $goody['name_g'] == $name;
					}
				));
			} elseif ($t['gr_c'] == 308) {
				$keys = array_keys(array_filter(
					$trik, 
					function ($goody) use ($name) {
						if (isset($goody['name_g'])) return $goody['name_g'] == $name;
					}
				));
			} else {
				$keys = array_keys(array_column($trik, 'name_g', 'number'), $name, true);
			}


			$arrayName = array('test' => '123','name' => $t['name_g']); // Товар пустышка

			if ($product_count == 1 && count($keys) == $product_count) {
				$key = $product_keys[0];
				if ($t['gr_c'] == 307) $key = $product_keys[0] + $startfrom;
				if ($t['gr_c'] == 318) $key = $keys[0];
				if ($t['gr_c'] == 308) $key = $keys[0];
				$new_key2 = $key.'.2';
				$new_key3 = $key.'.3';
				$new_key4 = $key.'.4';
				$trik[$new_key2] = $arrayName;
				$trik[$new_key3] = $arrayName;
				$trik[$new_key4] = $arrayName;
			} elseif ($product_count == 2 && count($keys) == $product_count) {
				$key = $product_keys[1];
				if ($t['gr_c'] == 307) $key = $product_keys[1] + $startfrom;
				if ($t['gr_c'] == 318) $key = $keys[1];
				if ($t['gr_c'] == 308) $key = $keys[1];
				$new_key3 = $key.'.3';
				$new_key4 = $key.'.4';
				$trik[$new_key3] = $arrayName;
				$trik[$new_key4] = $arrayName;
			} elseif ($product_count == 3 && count($keys) == $product_count) {
				$key = $product_keys[2];
				if ($t['gr_c'] == 307) $key = $product_keys[2] + $startfrom;
				if ($t['gr_c'] == 318) $key = $keys[2];
				if ($t['gr_c'] == 308) $key = $keys[2];

				$new_key = $key.'.4';
				$trik[$new_key] = $arrayName;
			} elseif ($product_count == 3 && count($keys) == 1) { // Если ajax подгружает последний из трех товаров
				$key = $product_keys[2];
				if ($t['gr_c'] == 307) $key = $product_keys[2] + $startfrom;
				if ($t['gr_c'] == 318) $key = $keys[0];
				if ($t['gr_c'] == 308) continue;
				$new_key2 = $key.'.2';
				$new_key3 = $key.'.3';
				$new_key4 = $key.'.4';
				$trik[$new_key2] = $arrayName;
				$trik[$new_key3] = $arrayName;
				$trik[$new_key4] = $arrayName;
			} elseif ($product_count == 3 && count($keys) == 2) {
				if ($t['gr_c'] == 308) {
					$key = $keys[1];
					$new_key2 = $key.'.2';
					$trik[$new_key2] = $arrayName;
				} else {
					continue;
				}
			} elseif ($product_count == 4 && count($keys) == 3) {
				continue;
			} elseif ($product_count == 3 && count($keys) == 2) { // Если ajax подгружает последний из трех товаров
				$key = $product_keys[2];
				$new_key = $key.'.4';
				$trik[$new_key] = $arrayName;
			} elseif ($product_count == 5 && count($keys) == $product_count) {
				$key = $product_keys[4];
				if ($t['gr_c'] == 307) $key = $product_keys[4] + $startfrom;
				if ($t['gr_c'] == 318)$key = $keys[4];
				if ($t['gr_c'] == 308)$key = $keys[4];
				$new_key6 = $key.'.6';
				$new_key7 = $key.'.7';
				$new_key8 = $key.'.8';
				$trik[$new_key6] = $arrayName;
				$trik[$new_key7] = $arrayName;
				$trik[$new_key8] = $arrayName;
			} elseif ($product_count == 6 && count($keys) == $product_count) {
				$key = $product_keys[5];
				if ($t['gr_c'] == 307) $key = $product_keys[5] + $startfrom;
				if ($t['gr_c'] == 318) $key = $keys[5];
				if ($t['gr_c'] == 308) $key = $keys[5];
				$new_key7 = $key.'.7';
				$new_key8 = $key.'.8';
				$trik[$new_key7] = $arrayName;
				$trik[$new_key8] = $arrayName;
			} elseif ($product_count == 7 && count($keys) == $product_count) {
				$key = $product_keys[6];
				if ($t['gr_c'] == 307) $key = $product_keys[6] + $startfrom;
				if ($t['gr_c'] == 318) $key = $keys[6];
				if ($t['gr_c'] == 308) $key = $keys[6];
				$new_key8 = $key.'.8';
				$trik[$new_key8] = $arrayName;
			}
		}

		ksort($trik, SORT_NUMERIC); // Сортировка товаров и пустышек между собой, чтобы пустышки были в конце после каждого артикула
		$ls_p = $trik + $ls_p;
	}
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 2
one_day
@one_day
Можно было просто делать проверку на последний товар из одной коллекции и после него добавлять:
<div class="clearfix"></div>
и незачем прикручивать пустые товары
Ответ написан
irishmann
@irishmann
Научись пользоваться дебаггером
Лучше всего на фронте реализовывать, задача не такая сложная. У Вас там bootstrap, вы выводите каждый товар как столбец (col-lg-3 col-md-3 col-sm-6 и т.д.). Что мешает выводить строками?
Например
<div class="row">
    <div class="col-lg-3 col-md-3 col-sm-6 col-xs-4 col-mob-6 col-xxs-6 l-category-model-wrap">
        вёрстка товара
    </div>
    <div class="col-lg-3 col-md-3 col-sm-6 col-xs-4 col-mob-6 col-xxs-6 l-category-model-wrap">
        вёрстка товара
    </div>
    <div class="col-lg-3 col-md-3 col-sm-6 col-xs-4 col-mob-6 col-xxs-6 l-category-model-wrap">
        вёрстка товара
    </div>
    <div class="col-lg-3 col-md-3 col-sm-6 col-xs-4 col-mob-6 col-xxs-6 l-category-model-wrap">
        вёрстка товара
    </div>
</div>
<div class="row">
    <div class="col-lg-3 col-md-3 col-sm-6 col-xs-4 col-mob-6 col-xxs-6 l-category-model-wrap">
        вёрстка товара
    </div>
    <div class="col-lg-3 col-md-3 col-sm-6 col-xs-4 col-mob-6 col-xxs-6 l-category-model-wrap">
        вёрстка товара
    </div>
</div>

row - строка, даже если элементов внутри не будет хватать, он все равно перескочит на новую.
Массив, который будете передавать в JS из PHP надо будет тоже изменить примерно
так
Array
(
    [190516] => Array
        (
            [0] => Array
                (
                    [test] => 123
                    [name] => test
                )
            [1] => Array
                (
                    [test] => 123
                    [name] => test
                )
            [2] => Array
                (
                    [test] => 123
                    [name] => test
                )
            [3] => Array
                (
                    [test] => 123
                    [name] => test
                )
        )
    [190521] => Array
        (
            [0] => Array
                (
                    [test] => 123
                    [name] => test
                )
            [1] => Array
                (
                    [test] => 123
                    [name] => test
                )
            [2] => Array
                (
                    [test] => 123
                    [name] => test
                )
        )
    [190525] => Array
        (
            [0] => Array
                (
                    [test] => 123
                    [name] => test
                )
            [1] => Array
                (
                    [test] => 123
                    [name] => test
                )
        )
)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы