Корзина в windows

Как устроена Корзина в ОС Windows

Как сказано выше, корзина – это специальная системная папка, создаваемая при установке операционной системы в корне каждого локального диска. Т.е. на какое количество локальных дисков разбит ваш винчестер, то столько и будет создано папок под корзину. Данная папка принадлежит к категории системных объектов и по умолчанию скрыта от просмотра в проводнике Windows. Рядовому пользователю достаточно ярлыка, указывающего на эту папку и располагаемого, как правило, на рабочем столе. Иконка стилизована под обыкновенную мусорную корзину и является единой для всех локальных дисков, т.е. открывая корзину двойным щелчком по иконке, вы увидите удаленные файлы со всех дисков.


Как и любая мусорная корзина, Корзина в Windows тоже имеет размер. Изначально, после установки операционной системы, под корзину выделяется 10% от общего объема локального диска. Например у вас только один локальный диск С, под размер которого выделен весь объем жесткого диска в 500Гб. В этом случае размер корзины будет составлять 50Гб. Если ваш винчестер разделен на 4 диска по 125Гб, то соответственно для каждого диска будет создана корзина по 1.25Гб.

Если корзина полностью заполнилась, то при перемещении файлов и папок в корзину, самые старые объекты в ней будут удалены окончательно для освобождения места для нового “мусора”. В том случае если происходит удаление сразу большого объема информации, превышающего весь размер корзины, то удаляемая информация будет стерта без помещения в корзину, о чем Windows предупредит с помощью диалогового окна. Размер корзины можно  настраивать в большую или меньшую сторону.

Настройка корзины

В настройка корзины можно задать размер корзины каждого диска. Например если вы зададите 4гб на диске С, то после удаления этого объем файлы будут удаляться не в корзину, а на совсем, без возможного восстановления. Восстановить конечно другими программами и можно, но не на 100%.

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

Так же можно поставить галочку запрашивать подтверждение на удаление тогда windows будет спрашивать поместить ли файл в корзину или нет. Так же, чтобы удалить объект без участия корзины можно нажать Shift + Delete.

Пропали свойства корзины?

Запустите файл восстановление свойств корзины и нажмите да. Перезагружаем компьютер, наслаждаемся результатом

Теперь вы знаете как настроить корзину своими силами, а так же поменять иконку, переименовать и удалить.

https://youtube.com/watch?v=D7fyWLv1rkg

Обработка событий

В части просвещённой jQuery не будет ничего особенного: добавим класс к нужному элементу при клике по иконке корзины. Так же стоит отметить, что в изначальной HTML структуре мы помещаем навигацию вне элемента . На мобильных устройствах мы хотим чтобы навигация всплывала как корзина, только из противоположной стороны. Чтобы данную фишку было легче реализовать мы поместим навигацию за пределы шапки. При отображении на экранах свыше 1200px, воспользуемся возможностями jQuery и вернём навигацию обратно.

<header>
    <div id="logo"></div>

    <div id="cd-hamburger-menu"><a class="cd-img-replace" href="#0">Menu</a></div>
    <div id="cd-cart-trigger"><a class="cd-img-replace" href="#0">Cart</a></div>

    <!-- we use jQuery to move the #main-nav here when the viewport is > 1200px -->
</header>

<nav id="main-nav">
    <ul>
        <li><a href="#0">Home</a></li>
        <li><a href="#0">About</a></li>
        <li><!-- ... --></li>
    </ul>
</nav>
function move_navigation( $navigation, $MQ) {
	if ( $(window).width() >= $MQ ) {
		$navigation.detach();
		$navigation.appendTo('header');
	} else {
		$navigation.detach();
		$navigation.insertAfter('header');
	}
}

Шаг 7

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

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

<?php

      if(isset($_GET) && $_GET==»add»){

          $id=intval($_GET);

          if(isset($_SESSION)){

              $_SESSION++;

          }else{

              $sql_s=»SELECT * FROM products                 WHERE id_product={$id}»;             $query_s=mysql_query($sql_s);             if(mysql_num_rows($query_s)!=0){                 $row_s=mysql_fetch_array($query_s);

                  $_SESSION]=array(                         «quantity» => 1,                         «price» => $row_s                     );

              }else{

                  $message=»This product id it’s invalid!»;

              }

          }

      }

  ?>

  1. Если установлена ​​переменная GET с именем action и ее значение равно ADD, мы выполняем код.
  2. Мы уверены, что идентификатор, передаваемый через переменную GET, является целым числом
  3. Если идентификатор продукта находится в корзине СЕССИИ, мы просто увеличиваем его количество на 1
  4. Если идентификатор не находится в сеансе, мы должны убедиться, что идентификатор, переданный через переменную GET, существует в базе данных. Если это так, мы берем цену и создаем ее сессию. Если это не так, мы устанавливаем переменную с именем message, которая будет содержать нашу ошибку.

Давайте проверим, установлена ​​ли эта переменная сообщения, и отобразим ее на странице (введите этот код под заголовком страницы H1):

1 2 3 4 5

    <?php     if(isset($message)){         echo «<h2>$message</h2>»;     } ?>

Здесь вы можете увидеть полную страницу products.php .

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

<?php

      if(isset($_GET) && $_GET==»add»){

          $id=intval($_GET);

          if(isset($_SESSION)){

              $_SESSION++;

          }else{

              $sql_s=»SELECT * FROM products                 WHERE id_product={$id}»;             $query_s=mysql_query($sql_s);             if(mysql_num_rows($query_s)!=0){                 $row_s=mysql_fetch_array($query_s);

                  $_SESSION]=array(                         «quantity» => 1,                         «price» => $row_s                     );

              }else{

                  $message=»This product id it’s invalid!»;

              }

          }

      }

  ?>     <h1>Product List</h1>     <?php         if(isset($message)){             echo «<h2>$message</h2>»;         }     ?>     <table>         <tr>             <th>Name</th>             <th>Description</th>             <th>Price</th>             <th>Action</th>         </tr>

          <?php

              $sql=»SELECT * FROM products ORDER BY name ASC»;             $query=mysql_query($sql);

              while ($row=mysql_fetch_array($query)) {

          ?>             <tr>                 <td><?php echo $row ?></td>                 <td><?php echo $row ?></td>                 <td><?php echo $row ?>$</td>                 <td><a href=»index.php?page=products&action=add&id=<?php echo $row ?>»>Add to cart</a></td>             </tr>         <?php

              }

          ?>

      </table>

Вот сообщение об ошибке, если идентификатор продукта является недействительным

Одна кнопка «Добавить в корзину» с множеством чекбоксов и полей «Количество»

Решение:

1. Установить модуль Commerce Add to Cart Extras.

2. Добавить в представление новое поле Commerce Product: Quantity input field.

3. Добавить в представление поле Commerce Product: Product ID с включённой опцией Exclude from display и сделать это поле первым в списке (скриншот).

4. Добавить в представление поле Global: Custom text с текстом (скриншот).


5. Добавить в свой модуль или template.php следующий код:

/**
 * Implements hook_form_BASE_FORM_ID_alter(): views_form.
 */
function MODULENAME_form_views_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'VIEWS_FORM_ID') {
    $form'add_to_cart_state' = array('#tree' => TRUE);
    foreach (element_children($form'add_to_cart_quantity') as $key) {
      $form'add_to_cart_state'$key = array('#type' => 'checkbox');
      $form'#substitutions''#value' = array(
        'placeholder' => '',
        'field_name' => 'add_to_cart_state',
        'row_id' => $key,
      );
    }
    array_unshift($form'#submit', 'MODULENAME_multi_add_to_cart_form_submit');
  }
}
 
/**
 * Custom submit callback for multi_add_to_cart_form.
 */
function MODULENAME_multi_add_to_cart_form_submit($form, &$form_state) {
  foreach ($form_state'values''add_to_cart_state' as $key => $state) {
    if (!$state) {
      $form_state'values''add_to_cart_quantity'$key = ;
    }
  }
}

Заменить на id формы.

6. Сбросить кэш.

Создание структуры

HTML-ая часть очень проста. Элемент будет использоваться для “вызова” корзины. Сами продукты магазина поместим в элемент . Пустой контейнер будет использоваться для размытия фона. Все элементы корзины будут помещены в ненумерованный список.

</header>

<main>
    <!-- content here -->
</main>

<div id="cd-shadow-layer"></div>

<div id="cd-cart">
    <h2>Cart</h2>
    <ul class="cd-cart-items">
        <li>
            <!-- ... -->
        </li>

        <li>
            <!-- ... -->
        </li>
    </ul> <!-- cd-cart-items -->

    <div class="cd-cart-total">
        <p>Total <span>$39.96</span></p>
    </div> <!-- cd-cart-total -->

    <a href="#0" class="checkout-btn">Checkout</a>

    <p class="cd-go-to-cart"><a href="#0">Go to cart page</a></p>
</div> <!-- cd-cart -->

Шаг 4

Прежде чем мы перейдем к извлечению данных из базы данных, я сделаю свой index.php шаблоном для списка товаров и корзины. Поэтому добавьте следующий код в начало страницы index.php :

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

<?php     session_start();     require(«includes/connection.php»);     if(isset($_GET)){

          $pages=array(«products», «cart»);

          if(in_array($_GET, $pages)) {

              $_page=$_GET;

          }else{

              $_page=»products»;

          }

      }else{

          $_page=»products»;

      } ?>

session_start () — это для последующего использования; это позволит нам фактически использовать сеансы (крайне важно, чтобы session_start записывался до того, как любые другие данные отправляются в браузер). Во второй строке мы включаем connection.php, который установит соединение с базой данных (мы разберемся с этим во второй)

Еще одна вещь: разница между include и require заключается в том, что если вы используете require и файл не может быть найден, выполнение скрипта закончится. Если вы используете «include», скрипт продолжит работать. Вместо того чтобы копировать весь HTML-код (ссылку на CSS, JS) для каждого файла на вашем сайте, вы можете просто сделать их все относительно одного файла. Итак, во-первых, я проверяю, есть ли переменная GET с именем «набор страниц». Если это не так, я создаю новую переменную с именем _pages . Если сначала задается переменная GET с именем pages, я хочу убедиться, что файл, который я собираюсь включить, является допустимой страницей.

Чтобы это работало, нам нужно включить файл; добавьте эту строку в index.php между div с идентификатором «main»:

1

<?php require($_page.».php»);

Теперь вот полный index.php, который мы имеем сейчас:

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

    <?php     session_start();     require(«includes/connection.php»);     if(isset($_GET)){

          $pages=array(«products», «cart»);

          if(in_array($_GET, $pages)) {

              $_page=$_GET;

          }else{

              $_page=»products»;

          }

      }else{

          $_page=»products»;

      }

  ?> <!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Transitional//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»> <html xmlns=»http://www.w3.org/1999/xhtml»> <head>

      <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />     <link rel=»stylesheet» href=»css/reset.css» />     <link rel=»stylesheet» href=»css/style.css» />

      <title>Shopping Cart</title>

  </head>

  <body>

      <div id=»container»>

          <div id=»main»>

              <?php require($_page.».php»);

          </div><!—end of main—>

          <div id=»sidebar»>

          </div><!—end of sidebar—>

      </div><!—end container—>

  </body> </html>

Давайте создадим соединение с MySQL. Откройте connections.php и введите следующее:

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

    <?php

      $server=»localhost»;     $user=»tutorial»;     $pass=»supersecretpassword»;     $db=»tutorials»;

      // connect to mysql

      mysql_connect($server, $user, $pass) or die(«Sorry, can’t connect to the mysql.»);

      // select the db

      mysql_select_db($db) or die(«Sorry, can’t select the database.»);

  ?>

Кнопка «Добавить в корзину» («В корзину», «Купить») должна быть понятной, заметной и простой

Сделайте процесс добавления товара в корзину легким и удобным для пользователя. Оформите кнопку «Добавить в корзину» таким образом, чтобы ее было хорошо видно и клиенту не приходилось думать, какие действия необходимо совершить для того, чтобы купить необходимый ему товар.

Рассмотрим два примера ниже. На примере слева кнопка «В корзину» отлично видна, и очевидно, что при нажатии на эту кнопку товар добавится в корзину. А вот на примере справа придется подумать, чтобы понять, что для добавления товара в корзину нужно не только поставить галочку рядом с товаром, но еще и нажать на ссылку «Добавить выбранное в корзину», а это не слишком удобно для пользователей.

Настройки корзины

С подключением закончили, теперь давайте займемся настройкой.

Итак, первое что мы сделаем — это укажем нашему скрипту обертку вашей карточки товара.

Для этого, в месте, где инициализировали скрипт указываем класс обертки карточки в параметре ‘productElement‘:

$(function () {
  $('.smart-basket__wrapper').smbasket({
    productElement: 'product__element',
  });
});

product__element — и есть класс моего блока с карточкой.

На следующем шаге нужно указать скрипту класс кнопки, которая будет отправлять товар в корзину, для этого воспользуемся параметром «buttonAddToBasket»:

$(function () {
  $('.smart-basket__wrapper').smbasket({
    productElement: 'product__element',
    buttonAddToBasket: 'product__add-to-cart-button',
  });
});

product__add-to-cart-button — класс моей кнопки.

У кнопки есть несколько обязательных атрибутов, в которых и хранятся основные данные о товаре.

  • data-sb-id-or-vendor-code — артикул или id товара;
  • data-sb-product-name — название товара;
  • data-sb-product-price — цена, разделенная точкой, если есть копейки;
  • data-sb-product-quantity — количество, по умолчанию укажите 1;
  • data-sb-product-img — полный путь к картинке;

Не обязательные атрибуты:

data-sb-product-size — размер. Задается, если вы используете опцию вывода размера в карточке товара. Подробнее о том, как это сделать в инструкции ниже.

AJAX корзина

Вот мы и добрались до самого интересного — написание клиентского js кода функиционала ajax корзины. В основном шаблоне уже из первых уроков подключена библиотека jQuery и скрипт cart.js, в котором мы будеим писать весь js код.

application/views/template.php


Открывайте файл cart.js и напишите следующее:

assets/js/cart.js

Это анонимная функция, которая сразу же вызывается, чтобы исключить конфликты с другими скриптами js (хоть у нас их и нет, но нужно привыкать к хорошему).

Нам нужно сделать формы (добавления в корзину, удаления товара из корзины и остальные) аяксовыми. Поэтому при клике на кнопку, мы будет посылать AJAX запрос на сервер, и в зависимости от результата, который возвратил сервер, выполнять какие то действия (например выводить сообщение пользователю).

Давайте добавим эту возможность кнопкам «купить»:

assets/js/cart.js

Итак, разберём что тут получилось. Для начала с помощью js необходимо изменить событие отправки формы на своё. Для этого в

мы «слушаем» все события submit на элементе внутри блока , т.е. отправку формы добавления в корзину товара. Чтобы запретить обычную отправку формы мы используем функцию

Далее необходимо отправить POST запрос к серверу. Для этого надо подготовить данные, которые будет отправлять. В jQuery есть функция , котороя преобзазует данные формы в строку (см. официальную документацию).

Вот что у нас получилось:

Т.к. вывод сообщений пользователю с помощью javascript нам ещё понадобиться, то предлагаю сделать функцию , чтобы не плодить код. Добавьте её в самое начало cart.js:

assets/js/cart.js

И изменим код добавления в корзину:

assets/js/cart.js

Шаг 9

Наконец, откройте cart.php и начните с ввода следующего кода:

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

<h1>View cart</h1> <a href=»index.php?page=products»>Go back to products page</a> <form method=»post» action=»index.php?page=cart»>

      <table>

          <tr>             <th>Name</th>             <th>Quantity</th>             <th>Price</th>             <th>Items Price</th>         </tr>

          <?php

              $sql=»SELECT * FROM products WHERE id_product IN («;

                      foreach($_SESSION as $id => $value) {                         $sql.=$id.»,»;                     }

                      $sql=substr($sql, 0, -1).») ORDER BY name ASC»;                     $query=mysql_query($sql);                     $totalprice=0;                     while($row=mysql_fetch_array($query)){                         $subtotal=$_SESSION]*$row;                         $totalprice+=$subtotal;                     ?>                         <tr>                             <td><?php echo $row ?></td>                             <td><input type=»text» name=»quantity ?>]» size=»5″ value=»<?php echo $_SESSION] ?>» /></td>                             <td><?php echo $row ?>$</td>                             <td><?php echo $_SESSION]*$row ?>$</td>                         </tr>                     <?php

                      }         ?>                     <tr>                         <td colspan=»4″>Total Price: <?php echo $totalprice ?></td>                     </tr>

      </table>     <br />     <button type=»submit» name=»submit»>Update Cart</button> </form> <br /> <p>To remove an item, set it’s quantity to 0. </p>

Код похож на тот, что есть в index.php и products.php, поэтому я не буду все объяснять снова. Вы должны заметить, что вместо отображения количества в форме, теперь оно отображается в поле ввода (чтобы мы могли изменить количество). Также таблица оборачивается тегом формы. Чтобы получить общую стоимость товаров, мы умножаем количество идентификатора конкретного продукта (из сеанса) на его цену. Это делается в каждом цикле.

ПРИМЕЧАНИЕ . Входные данные — это массив, ключ — это идентификатор продукта, а количество — это величина количества.

Выбор количества

Если ваша карточка товара предусматривает выбор количества товара, добавляемого в корзину, то укажите класс элемента где будет располагаться блок выбора количества в параметре ‘productQuantityWrapper‘. Например, я хочу, чтобы выбор количества располагался в теге div с классом ‘product__quantity’.

<div class="product__quantity"></div>

$(function () {
  $('.smart-basket__wrapper').smbasket({
    productElement: 'product__element',
    buttonAddToBasket: 'product__add-to-cart-button',
    countryCode: '+7',
    smartBasketCurrency: '₽',
    productQuantityWrapper: 'product__quantity',
  });
});

После добавления параметра ‘productQuantityWrapper’ cо значением ‘product__quantity’, кнопки выбора количества автоматически появятся на сайте в указанном блоке.

Но ведь добавленный товар не появляется в корзине!

Как вы уже заметили, товар в корзину добавляется, но не появляется там. Он появится только после перезагрузки страницы. Почему? Да потому что мы не написали javascript функционал добавления строки с товаром в корзину.

Реализовывать это будем самым простым способом:

При добавлении товара в корзину, в случае успеха, сервер возвращает весь HTML код корзины (с уже добавленной в неё строкой нового товара), а мы с помощью js просто обновим её.

Этот способ простой, но не лишён недостатков. Один из них — нужно получать весь HTML корзины, а не только ту часть, которую нужно обновить. Т.е. мы будет «гонять» больше трафика. Но думаю это не такая большая проблема. Во-первых скорость интернета позволяет, во-вторых корзина не такой большой элемент на странице, чтобы мы почувствовали какие-то тормоза в работе интерфейса. В-третьих — вы посмотрите исходный код opencart, и код в этой стетье покажется вам идеальным.

Итак, поправим немного код в методе контроллера cart. Я не буду приводить полный код метода, только небольшой кусок:


application/controllers/cart.php

После добавления товара в корзину методом , получаем в массив данные корзины пользователя. Далее передаём этом пассив в шаблон. В итоге, весь HTML код корзины будет храниться в переменной . Впринципе, мы повторили обычные получение и вывод корзины, которые использователи в методе контроллера cart.

Поле этого в массив добавляем новый элемент , в котором будет весь HTML код корзины, и который мы возвратим вместе с сообщением о результате.

Теперь, если с помощью средств разработчка, мы посмотрим на результат, котоый сервер возвращает нам после добавления в корзину мы увидим HTML код корзины:

Далее, по плану — обновление корзины на странице. Вот изменённый js код добавления товара в корзину и её обновления:

jQuery методом replaceWith() (ссылка на документацию) мы заменяем блок на новый, который возвратил сервер. И так же выводим сообщение пользователю.

Всплывающие кнопки

Что касается кнопки «Быстрый просмотр», ее реализация сравнительно проста. Кнопка абсолютно позиционирована относительно блока с классом , скрыта с помощью и немного сдвинута вниз за счет . При наведении курсора на карточку товара стили кнопки меняются следующим образом.

Несколько сложнее дело обстоит с кнопками «В корзину» и «Купить в 1 клик». Здесь внешний контейнер абсолютно позиционирован в блоке и равен родителю по ширине и высоте.

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

Теперь можно добавить собственно контент — кнопки, размещенные в блоке .

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

Чтобы лучше разобраться с кнопками, можно посмотреть это демо.

Как удалить корзину?

  1. Чтобы удалить, нужно повторить способ 3 по восстановлению, только в параметре {645FF040-5081-101B-9F08-00AA002F954E} нужно поставить 1.
  2. В разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace удаляем раздел 645FF040-5081-101B-9F08-00AA002F954E

Перезагружаемся.

Способы переименования корзины

Первый

Самый простой выделить корзину и нажать F2

Второй

Заходим в реестре HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}

Там должен быть строковый параметр LocalizedString.

Нажимаем изменить и пишем свое имя.

Перезагружаемся.

Пример кнопки

<button 
  class="product__add-to-cart-button" 
  data-sb-id-or-vendor-code="0032pz" 
  data-sb-product-name="Iphone 10" 
  data-sb-product-price="80000" 
  data-sb-product-quantity="1" 
  data-sb-product-img="http://sprosigorod.online/img/iphone-10.png">
   <i class="fas fa-cart-plus"></i> В корзину
</button>

Обратите внимание, что все атрибуты обязательны для заполнения. Если у вас нет артикула, то просто задайте уникальный набор цифр

Следующим параметром, который мы настроим будет маска ввода номер телефона «countryCode». По умолчанию сейчас маска для Украины с первыми цифрами ‘+38‘, но вы можете поставить, ‘+7‘ или любые другие цифры.

Пока можно менять только их, но, если вы хотите иметь полный контроль над всеми цифрами, напишите мне и я сделаю.

$(function () {
  $('.smart-basket__wrapper').smbasket({
    productElement: 'product__element',
    buttonAddToBasket: 'product__add-to-cart-button',
    countryCode: '+7',
  });
});

Теперь укажем валюту, которую хотим использовать в корзине. Для этого есть параметр smartBasketCurrency, в который можно положить один из значков валют:

  • $
$(function () {
  $('.smart-basket__wrapper').smbasket({
    productElement: 'product__element',
    buttonAddToBasket: 'product__add-to-cart-button',
    countryCode: '+7',
    smartBasketCurrency: '₽',
  });
});

С этим читают