Вид списка товаров таблицей

Поздравляю всех мужчин с праздником!

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

$('a.three').click(function() {
	  $('.span9').removeClass('col-xs-9').addClass('col-xs-12');
	  $('.rightBlock').addClass('hidden');
Но вот результаты обернуть в код таблицы, так и не получилось, пытался так:

$("#mse2_results").wrapInner("<table class='table table-bordered'><thead><tr class='gray'><th class='text-center'>Артикул</th><th class='text-center'>Наименование</th><th class='text-center'>Цена</th><th class='text-center'>Количество</th><th class='text-center'>В корзину</th></tr></thead><tbody>")
Но как-то тихо всё. Буду рад любой подсказке!
Klike
23 февраля 2015, 04:54
modx.pro
1
1 687
0

Комментарии: 23

Василий Наумкин
23 февраля 2015, 08:11
+1
Именно из-за подобного все давно перешли на вёрстку блоками.
    Klike
    23 февраля 2015, 08:54
    0
    Василий, то есть с помощью стилей оформить? И внешне будет выглядеть, как таблица, правильно понимаю? А как шапку этой самой таблицы в таком случае сделать? Также скриптом добавлять?
      Василий Наумкин
      23 февраля 2015, 10:15
      +1
      Шапку можно вывести сразу, скрытой.

      А потом показать.
        Klike
        23 февраля 2015, 15:37
        +1
        Спасибо большое, Василий! Переделал, как вы подсказали – всё отлично работает!
          Klike
          24 февраля 2015, 11:49
          0
          Василий, при добавлении товара в корзину кнопку меняю скриптом таким образом:
          if (typeof(miniShop2) != 'undefined') {
              // кнопки В корзину/Оформить
              miniShop2.Callbacks.Cart.add.response.success = function(response) {
                  miniShop2.Order.getcost();
                  miniShop2.sendData.$form.find('.btn-cart').addClass('hidden');
                  miniShop2.sendData.$form.find('.btn-checkout').removeClass('hidden');
              };
              miniShop2.Callbacks.Cart.remove.response.success = function() {
                  miniShop2.sendData.$form.find('.btn-cart').removeClass('hidden');
                  miniShop2.sendData.$form.find('.btn-checkout').addClass('hidden');
              };
          }
          И всё классно, но после обновления страницы, естественно, весь эффект пропадает.
          Как можно закрепить этот эффект? То есть, если товар в корзине, то кнопка другая. Искал решение, но не додумался, как это реализовать. Подскажи, пожалуйста.
            Василий Наумкин
            24 февраля 2015, 11:50
            +1
            Нужен сниппет на php, который будет проверять наличие товара в корзине и выводить кнопки с нужными классами.
              Klike
              24 февраля 2015, 11:52
              0
              Спасибо!
                Klike
                24 февраля 2015, 12:55
                0
                Собрал такой сниппет:
                <?php
                $miniShop2 = $modx->getService('minishop2','miniShop2',
                	MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties);
                if (!($miniShop2 instanceof miniShop2)) return '';
                $miniShop2->initialize($modx->context->key, $scriptProperties);
                $idd = $modx->resource->get('id');
                $cart = $miniShop2->cart->get();
                $kolvo = 0;
                foreach($cart as $value)
                	{if ($value['id'] == $idd)
                		{$kolvo += $value['count'];}}
                print_r($kolvo);
                Отлично работает на странице товара, а в галерее и в категориях(mFilter2) – нет, товар в корзине, выводит 0. Что не так делаю, подскажи, пожалуйста:)
                  Василий Наумкин
                  24 февраля 2015, 13:05
                  0
                  Потому что галереи и категории нет в корзине. Ты же берешь id текущего ресурса:
                  $idd = $modx->resource->get('id');
                    Klike
                    24 февраля 2015, 15:50
                    0
                    И тут я застрял… Как же получить id непосредственно товара?
                      Василий Наумкин
                      24 февраля 2015, 17:52
                      0
                      Наверное, как-то его передать в вызов сниппета?

                      Как обычно в сниппеты передаются параметры, подумай.
        Klike
        25 февраля 2015, 16:33
        0
        Спасибо, Василий за подсказки! Чем давать рыбу, лучше удочку))
        <?php
        $miniShop2 = $modx->getService('minishop2','miniShop2',
        	MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties);
        if (!($miniShop2 instanceof miniShop2)) return '';
        $miniShop2->initialize($modx->context->key, $scriptProperties);
        
        if (empty($idd)) {$idd = $modx->resource->id;}
        $cart = $miniShop2->cart->get();
        $kolvo = 0;
        foreach($cart as $value)
        	{if ($value['id'] == $idd)
        		{$kolvo += $value['count'];}}
        $modx->setPlaceholder('countP', $kolvo);
        
        //вот этот кусок не знаю, нужен ли
        $toPlaceholder = $modx->getOption('toPlaceholder',$scriptProperties,false);
        if (!empty($toPlaceholder)) {
        	$modx->setPlaceholder($toPlaceholder,$output);
        	return '';
        }
        //конец "ненужного" куска
        return $kolvo;
        Сниппет таким образом:
        [[!+countP? &idd=`[[+id:default=`[[*id]]`]]`]]
        ID передаётся правильно (может лишнее, конечно, и в сниппете проверять на пустоту ID и в вызове сниппета), думаю ещё отправлять результат сниппета в плейсхолдер
        [[!+countP? &idd=`[[+id:default=`[[*id]]`]]` &toPlaceholder=`countP`]]
        и в кнопке условие сделать – если результат >0, то одна кнопка, если =0, вторая.

        Но почему-то не всегда сниппет работает как нужно. Где что не так делаю?
          Василий Наумкин
          25 февраля 2015, 17:12
          1
          +1
          Не нужно никаких плейсхолдеров, просто сделай tpl1 и tpl2 и выдавай их в зависимости от того, находится ли товар в корзине.

          <?php
          // Параметры
          $idd = $modx->getOption('idd', $scriptProperties, $modx->resource->id);
          $tplIn = $modx->getOption('tplIn', $scriptProperties, '@INLINE Товар в корзине, цена = [[+price]]'); 
          $tplOut = $modx->getOption('tplOut', $scriptProperties, '@INLINE Товара в корзине нет'); 
          // Классы для работы
          $pdo = $modx->getService('pdoTools');
          $miniShop2 = $modx->getService('minishop2');
          $miniShop2->initialize($modx->context->key, $scriptProperties);
          $cart = $miniShop2->cart->get();
          // Поехали
          $found = false;
          foreach($cart as $product) {
          	if ($value['id'] == $idd) {
          		$found = $product;
          		break;
          	}
          
          return $found
          	? $modx->getChunk($tplIn, $found)
          	: $modx->getChunk($tplOut);

          Вызывать так:
          [[!myButton?&idd=`[[+id]]`]]
          Можно указывать и чанки tplIn и tplOut.

          На опечатки не проверял, принцип должен быть ясен.
            Klike
            27 февраля 2015, 15:29
            0
            Наконец-то добился результата) Спасибо большое, Василий, за направление на путь истинный))
            Чуть доработал код и вот результат:
            <?php
            // Параметры
            $idd = $modx->getOption('idd', $scriptProperties, $modx->resource->id);
            $tplIn = $modx->getOption('tplIn', $scriptProperties, '@INLINE Товар в корзине, цена = [[+price]]'); 
            $tplOut = $modx->getOption('tplOut', $scriptProperties, '@INLINE Товара в корзине нет'); 
            // Классы для работы
            $pdo = $modx->getService('pdoTools');
            $miniShop2 = $modx->getService('minishop2');
            $miniShop2->initialize($modx->context->key, $scriptProperties);
            $cart = $miniShop2->cart->get();
            // Поехали
            $found = false;
            foreach($cart as $value) {
            	if ($value['id'] == $idd) {
            		$found = $value['id'];
            		break;
            	}
            }
            $found != false 
                ?   $result = $modx->getChunk('tplIn', 'found')
                :	$result = $modx->getChunk('tplOut');
            return $result;
            Теперь всё работает, как надо!
              Василий Наумкин
              27 февраля 2015, 16:40
              0
              Вот здесь ошибка
              $found != false 
                  ?   $result = $modx->getChunk('tplIn', 'found')
                  :	$result = $modx->getChunk('tplOut');
              Ты передаёшь строку 'found', а я передавал переменную $found. Это позволило бы использовать в чанке данные о товаре из корзины: количество и цену.

              Соотвественно мне непонятно, зачем у тебя
              $found = $value['id'];
              когда в $found должен быть просто не false — так уж лучше в него записать true.

              В общем, если не хочешь в чанке использовать данные корзины, то убери вообще 'found', потому что строку вторым параметром метод pdoTools::getChunk() не ожидает — это ошибка.

              Если же хочешь — то перепиши как у меня в примере, чтобы на кнопке можно было вывести «Оформить 5 этих товаров на сумму 300 руб»
                Klike
                28 февраля 2015, 11:52
                0
                Вот твой пример, чуть подкорректирован, создал два чанка tplIn1 и tplOut1, товар в корзине, выводит, что товара нет (tplOut), что не так?
                $found = false;
                foreach($cart as $product) {
                	if ($value['id'] == $idd) {
                		$found = $product;
                		break;
                	}
                }  //не было в твоём примере
                return $found
                	? $modx->getChunk('tplIn1', 'found') // здесь было ($tplIn, $found), ниже также
                	: $modx->getChunk('tplOut1');
                  Василий Наумкин
                  28 февраля 2015, 11:56
                  0
                  if ($value['id'] == $idd) {
                  Должно быть
                  if ($product['id'] == $idd) {
                  Я же говорю — не проверял на опечатки.

                  $modx->getChunk('tplIn1', 'found')
                  Ты разницу между переменными $tplIn $found и строками 'tplIn' и 'found' вообще не понимаешь?
                    Klike
                    28 февраля 2015, 12:07
                    0
                    каюсь, пока не силён в php)

                    А так совсем ничего не выводит…
                    foreach($cart as $product) {
                    	if ($product['id'] == $idd) {
                    		$found = $product;
                    		break;
                    	}
                    }
                    return $found
                    	? $modx->getChunk($tplIn1, $found)
                    	: $modx->getChunk($tplOut1);
                      Василий Наумкин
                      28 февраля 2015, 12:32
                      0
                      А вообще, в буквах?

                      У тебя в начале сниппета определяются $tplIn и tplOut. Откуда ты взял $tplIn1 и $tplOut1?

                      Давай уже повнимательнее, тут кода на 10 строк, а вопросов на неделю.
                        Klike
                        28 февраля 2015, 12:37
                        0
                        <?php
                        // Параметры
                        $idd = $modx->getOption('idd', $scriptProperties, $modx->resource->id);
                        $tplIn1 = $modx->getOption('tplIn1', $scriptProperties, '@INLINE Товар в корзине, цена = [[+price]]'); 
                        $tplOut1 = $modx->getOption('tplOut1', $scriptProperties, '@INLINE Товара в корзине нет'); 
                        // Классы для работы
                        $pdo = $modx->getService('pdoTools');
                        $miniShop2 = $modx->getService('minishop2');
                        $miniShop2->initialize($modx->context->key, $scriptProperties);
                        $cart = $miniShop2->cart->get();
                        // Поехали
                        $found = false;
                        foreach($cart as $product) {
                        	if ($product['id'] == $idd) {
                        		$found = $product;
                        		break;
                        	}
                        }
                        return $found
                        	? $modx->getChunk($tplIn1, $found)
                        	: $modx->getChunk($tplOut1);
                        У меня предыдущий сниппет работает с tplIn и tplOut, поэтому в этом tplIn1 и tplOut1, в начале тоже добавил единицу к ним. Вообще, даже в буквах не выводит)
                          Василий Наумкин
                          28 февраля 2015, 12:43
                          0
                          А, ну да. Для INLINE чанков нужен pdoTools, а я там забыл его использовать.

                          Вот так работает:
                          return $found
                          	? $pdo->getChunk($tplIn1, $found)
                          	: $pdo->getChunk($tplOut1);
                            Klike
                            28 февраля 2015, 13:14
                            0
                            Супер! Теперь отлично работает! И твой функционал классно можно использовать с количеством и ценой. Спасибо большое, Василий!
                            Можно ещё вопрос? :)

                            Искал решение по пересчету цен в корзине при стоимости свыше 10.000р., видел только по определенному количеству. В моём случае нужно писать сниппет и плагин на событие, и для динамического обновления (без обновления страницы) нужен скрипт. И в итоге вместо стандартного сниппета корзины вызывать свой. Я всё правильно понял?
                            Василий Наумкин
                            28 февраля 2015, 13:37
                            0
                            Если работает — то правильно.

                            Но мне больше нравится расширять классы магазина.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        23