Skip to content

Latest commit

 

History

History
626 lines (426 loc) · 32.9 KB

README_uk-UA.md

File metadata and controls

626 lines (426 loc) · 32.9 KB

LaravelShoppingcart

CI Code Checks codecov StyleCI Total Downloads Latest Stable Version Latest Unstable Version License

Цей репозиторій є відгалуженням Crinsane's LaravelShoppingcart та містить додаткові незначні доповнення, сумісні з Laravel 6.

Встановлення

Встановіть пакет скориставшись Завантажувачем.

Для запуску Завантажувача, скористайтеся командою у Терміналі:

composer require bumbummen99/shoppingcart

Тепер ви готові розпочати користуватися кошиком у вашому застосунку.

Починаючи з версії 2 даного пакету з'явилася можливість впровадження залежності для впровадження екземпляра класу Кошик (Cart) до вашого контролера або іншого класу

Огляд

Щоб детальніше ознайомитися LaravelShoppingcart, можете пройти за посиланнями

Застосування

Кошик (Cart) дозволяє вам скористатися наступними методами:

Cart::add()

Додавати покупки у кошик дуже зручно - достатньо скористатися методом add(), який приймає різноманітні параметри.

У найпростішій формі метода достатньо вказати ідентифікатор товару, назву, кількість, ціну та вагу товару, який ви хочете додати у кошик.

Cart::add('293ad', 'Product 1', 1, 9.99, 550);

У якості додаткового п'ятого параметра можна задати додаткові опції, наприклад, щоб додати декілька одиниць з однаковим ідентифікатором, але, наприклад, різного розміру.

Cart::add('293ad', 'Product 1', 1, 9.99, 550, ['size' => 'large']);

Метод add() повертає екземпляр CartItems того товару, який ви щойно додали у кошик.

Можливо, вам більше до вподоби додавати товари, використовуючи масив? Якщо масив містить усі необхідні поля, ви можете передавати масив у цей метод. Поле із додатковими опціями є необов'язковим.

Cart::add(['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 9.99, 'weight' => 550, 'options' => ['size' => 'large']]);

У версії 2 пакета з'явилася нова можливість для роботи з інтерфейсом Buyable. Такий функціонал з'являється за рахунок того, що модель запускає інтерфейс Buyable, який дозволить імплементувати декілька методів, з яких пакет знатиме як отримати ідентифікатор, назву та ціну з вашої моделі. Таким чином, ви можете передати метод add() та кількість одиниць товару до моделі, а вона автоматично додасть їх до кошика.

Додатковий бонус інтерфейсу - автоматичне об'єднання моделі з CartItems

Cart::add($product, 1, ['size' => 'large']);

У якості додаткового параметра, ви можете внести опції.

Cart::add($product, 1, ['size' => 'large']);

Нарешті, ви також можете додавати до кошика декілька одиниць водночас. Для цього потрібно передати у add() масив масивів або масив Buyables, і їх буде додано в кошик.

Під час додавання декількох одиниць товару в кошик, метод add() повертає масив CartItems.

Cart::add([
  ['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 10.00, 'weight' => 550],
  ['id' => '4832k', 'name' => 'Product 2', 'qty' => 1, 'price' => 10.00, 'weight' => 550, 'options' => ['size' => 'large']]
]);

Cart::add([$product1, $product2]);

Cart::update()

Щоб оновити товар у кошику, вам знадобиться ідентифікатор рядка (rowId) даного товару. Далі ви можете скористатися методом update() для того, щоб оновити його.

Якщо ви просто хочете оновити кількість товару, вам необхідно передати у метод update() rowId і оновлену кількість:

$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';

Cart::update($rowId, 2); // Will update the quantity

Якщо ви хочете оновити більше атрибутів товару, вам потрібно або передати у метод update() масив або Buyable у якості другого параметра. Таким чином, ви можете оновити всю інформацію про товар за заданим rowId.

Cart::update($rowId, ['name' => 'Product 1']); // Will update the name

Cart::update($rowId, $product); // Will update the id, name and price

Cart::remove()

Щоб вилучити товар з кошика, вам знову знадобиться rowId. Такий rowId потрібно передати у метод remove(), який автоматично вилучить товар із кошика.

$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';

Cart::remove($rowId);

Cart::get()

Якщо ви хочете отримати товар із кошика, використовуючи його rowId, вам потрібно застосувати метод get() щодо кошика і передати в нього rowId.

$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';

Cart::get($rowId);

Cart::content()

Вам також може знадобитися можливість отримати інформацію про вміст кошика. Для цього вам потрібно скористатися методом content. Такий метод повертає колекцію CartItems, ви можете перебирати вміст такої колекції і відобразити вміст кошика для ваших клієнтів.

Cart::content();

Даний метод повертає вміст поточного екземпляра кошика, якщо ви хочете вміст іншого екземпляра, вам потрібно зв'язати виклики.

Cart::instance('wishlist')->content();

Cart::destroy()

Якщо ви хочете остаточно вилучити вміст кошика, ви можете застосувати метод destroy() щодо кошика. Даний метод вилучить всі CartItems з кошика для поточного екземпляра кошика.

Cart::destroy();

Cart::weight()

Метод weight() можна застосувати, щоб отримати розрахунок ваги усіх товарів у кошику, за умови, що задано вагу і кількість одиниць.

Cart::weight();

Даний метод автоматично відформатує результат, який ви можете поправити за допомогою трьох додаткових параметрів.

Cart::weight($decimals, $decimalSeperator, $thousandSeperator);

Ви можете задати формат чисел за замовчуванням у файлі з конфігураціями.

Якщо ви не використовуєте Фасад, але застосовуєте впровадження залежності, наприклад, у вашому Контролері, ви також можете отримати інформацію про вагу товарів через $cart->weight

Cart::total()

Метод total() можна застосовувати, щоб отримати розрахунок вартості усіх товарів у кошику, за умови, що задані ціна і кількість одиниць.

Cart::total();

Даний метод автоматично відформатує результат, який ви можете поправити за допомогою трьох додаткових параметрів.

Cart::total($decimals, $decimalSeparator, $thousandSeparator);

Ви можете задати формат чисел за замовчуванням у файлі з конфігураціями.

Якщо ви не використовуєте Фасад, але застосовуєте впровадження залежності, наприклад, у вашому Контролері, ви також можете отримати інформацію про вартість товарів через $cart->total

Cart::tax()

Метод tax() можна застосовувати, щоб отримати розрахунок суми податків для усіх товарів у кошику, за умови, що задані ціна і кількість одиниць.

Cart::tax();

Даний метод автоматично відформатує результат, який ви можете поправити за допомогою трьох додаткових параметрів.

Cart::tax($decimals, $decimalSeparator, $thousandSeparator);

Ви можете задати формат чисел за замовчуванням у файлі з конфігураціями.

Якщо ви не використовуєте Фасад, але застосовуєте впровадження залежності, наприклад, у вашому Контролері, ви також можете отримати інформацію про суму податку на товари через $cart->tax

Cart::subtotal()

Метод subtotal() можна застосовувати, щоб отримати розрахунок вартості усіх товарів у кошику, без урахування суми податку.

Cart::subtotal();

Даний метод автоматично відформатує результат, який ви можете поправити за допомогою трьох додаткових параметрів.

Cart::subtotal($decimals, $decimalSeparator, $thousandSeparator);

Ви можете задати формат чисел за замовчуванням у файлі з конфігураціями.

Якщо ви не використовуєте Фасад, але застосовуєте впровадження залежності, наприклад, у вашому Контролері, ви також можете отримати інформацію про вартість усіх товарів без урахування суми податків через $cart->subtotal

Cart::discount()

Метод discount() можна застосовувати, щоб отримати розрахунок знижки на усі товари у кошику.

Cart::discount();

Даний метод автоматично відформатує результат, який ви можете поправити за допомогою трьох додаткових параметрів.

Cart::discount($decimals, $decimalSeparator, $thousandSeparator);

Ви можете задати формат чисел за замовчуванням у файлі з конфігураціями.

Якщо ви не використовуєте Фасад, але застосовуєте впровадження залежності, наприклад, у вашому Контролері, ви також можете отримати інформацію про вартість усіх товарів з урахуванням знижки $cart->discount

Cart::initial()

Метод initial() можна застосовувати, щоб отримати розрахунок вартості усіх товарів до застосування знижки.

Cart::initial();

Даний метод автоматично відформатує результат, який ви можете поправити за допомогою трьох додаткових параметрів.

Cart::initial($decimals, $decimalSeparator, $thousandSeparator);

Ви можете задати формат чисел за замовчуванням у файлі з конфігураціями.

Якщо ви не використовуєте Фасад, але застосовуєте впровадження залежності, наприклад, у вашому Контролері, ви також можете отримати інформацію про вартість усіх товарів до застосування знижки $cart->initial

Cart::count()

Метод count() можна застосовувати, щоб дізнатися кількість одиниць товарів у кошику. Даний метод повертає загальну кількість одиниць товарів у кошику. Тобто якщо ви додали 2 книжки і 1 сорочку, цей метод поверне 3 одиниці.

Cart::count();
$cart->count();

Cart::search()

Метод search() можна застосовувати, щоб знайти одиницю товару у кошику.

Даний метод було змінено у версії 2

У своїй імплементації, цей метод застосовує метод фільтрування з класу Laravel Collection. Це означає, що вам потрібно передати замикання (Closure) для даного методу, де ви зазначите умови для пошуку.

Наприклад, якщо ви хочете знайти всі одиниці товару з ідентифікатором 1:

$cart->search(function ($cartItem, $rowId) {
	return $cartItem->id === 1;
});

Як ви можете побачити, замикання отримає 2 параметра. Перший - CartItem для здійснення перевірки щодо нього. Другий параметр - rowId даного CartItem.

Даний метод повертає колекцію, яка вміщує всі CartItems, які було знайдено

Такий спосіб пошуку надає вам повний контроль над процесом пошуку та дозволяє здійснювати дуже точні та конкретні пошуки.

Cart::setTax($rowId, $taxRate)

Метод setTax() можна застосовувати, щоб змінювати ставку оподаткування, яка застосовується до CartItem. Така операція перезапише значення встановлене у файлі з конфігураціями.

Cart::setTax($rowId, 21);
$cart->setTax($rowId, 21);

Cart::setGlobalTax($taxRate)

Метод setGlobalTax() можна застосовувати, щоб змінити ставку оподаткування для усіх найменувать у кошику. Нові найменування отримають значення setGlobalTax також.

Cart::setGlobalTax(21);
$cart->setGlobalTax(21);

Cart::setGlobalDiscount($discountRate)

Метод setGlobalDiscount() можна застосовувати для заміни ставки знижки щодо усіх найменувань у кошику. Нові найменування також отримуватимуть таку знижку.

Cart::setGlobalDiscount(50);
$cart->setGlobalDiscount(50);

Cart::setDiscount($rowId, $taxRate)

Застосування методу setDiscount() полягає у заміні ставки знижки, яка застосовується до CartItem. Зверніть увагу, що дане значення ставки знижки буде змінено, якщо ви згодом встановите глобальну знижку для Кошика (Cart).

Cart::setDiscount($rowId, 21);
$cart->setDiscount($rowId, 21);

Buyable

Для зручного швидкого додавання товарів до кошика та їхнього автоматичного об'єднання, ваша модель повинна запустити інтерфейс Buyable. Ви можете застосовувати CanBeBought трейт для імплементації необхідних методів, але зверніть увагу, що такі методи застосовуватимуть попередньо визначені поля у вашій моделі для необхідних значень.

<?php
namespace App\Models;

use Gloudemans\Shoppingcart\Contracts\Buyable;
use Illuminate\Database\Eloquent\Model;

class Product extends Model implements Buyable {
    use Gloudemans\Shoppingcart\CanBeBought;
}

Якщо трейт не працює на вашій моделі або ви хочете вручну перенести (мапувати) поля, модель повинна запустити методи інтерфейсу Buyable. Для цього, модель повинна імплементувати наступні функції:

    public function getBuyableIdentifier(){
        return $this->id;
    }
    public function getBuyableDescription(){
        return $this->name;
    }
    public function getBuyablePrice(){
        return $this->price;
    }
    public function getBuyableWeight(){
        return $this->weight;
    }

Приклад:

<?php
namespace App\Models;

use Gloudemans\Shoppingcart\Contracts\Buyable;
use Illuminate\Database\Eloquent\Model;

class Product extends Model implements Buyable {
    public function getBuyableIdentifier($options = null) {
        return $this->id;
    }
    public function getBuyableDescription($options = null) {
        return $this->name;
    }
    public function getBuyablePrice($options = null) {
        return $this->price;
    }
}

Колекції

Щодо багатьох екземплярів Кошик (Cart) повертає Колекцію, яка є простим видом Laravel Collection. Таким чином усі методи, які ви можете застосовувати щодо Laravel Collection, є також доступними у результаті операції.

Наприклад, ви можете швидко отримати кількість унікальних товарів у кошику:

Cart::content()->count();

Або групувати вміст за ідентифікатором товару:

Cart::content()->groupBy('id');

Екземпляри

Пакет підтримує декілька екземплярів кошика. Як це працює:

Ви можете встановити поточний екземпляр кошика через виклик Cart::instance('newInstance'). З цього моменту, активний екземляр кошика буде newInstance, тому коли ви додаєте, вилучаєте або отримуєте інформацію щодо вмісту кошика, ви працюєте з екземпляром newInstance кошика. Якщо ви хочете переключитися між екзмеплярами, ви можете викликати Cart::instance('otherInstance') ще раз, і ви знову працюватимете з otherInstance.

Короткий приклад:

Cart::instance('shopping')->add('192ao12', 'Product 1', 1, 9.99, 550);

// Get the content of the 'shopping' cart
Cart::content();

Cart::instance('wishlist')->add('sdjk922', 'Product 2', 1, 19.95, 550, ['size' => 'medium']);

// Get the content of the 'wishlist' cart
Cart::content();

// If you want to get the content of the 'shopping' cart again
Cart::instance('shopping')->content();

// And the count of the 'wishlist' cart again
Cart::instance('wishlist')->count();

Ви також можете застосувати Контракт InstanceIdentifier для розширення бажаної моделі через призначення / створення екземпляру Кошика (Cart) для неї. Така дія також дозволить напряму встановлювати глобальну знижку.

<?php

namespace App;
...
use Illuminate\Foundation\Auth\User as Authenticatable;
use Gloudemans\Shoppingcart\Contracts\InstanceIdentifier;

class User extends Authenticatable implements InstanceIdentifier
{
	...

	/**
     * Get the unique identifier to load the Cart from
     *
     * @return int|string
     */
    public function getInstanceIdentifier($options = null)
    {
        return $this->email;
    }

    /**
     * Get the unique identifier to load the Cart from
     *
     * @return int|string
     */
    public function getInstanceGlobalDiscount($options = null)
    {
        return $this->discountRate ?: 0;
    }
}

// Inside Controller
$user = \Auth::user();
$cart = Cart::instance($user);



N.B. Зверніть увагу, що кошик залишається у стані останнього призначеного екземпляра, доки ви не встановите інший екземпляр протягом виконання скрипта.

N.B.2 За замовчуванням екземпляр кошика називається default, тому коли ви не використовуєте екземпляри, Cart::content(); залишається таким самим як і Cart::instance('default')->content().

Моделі

Через те, що можливість прямого доступу до моделі з CartItem може бути дуже зручною, виникає питання чи можливо об'єднати модель із товарами у кошику. Скажімо, у вашому застосунку є модель Product. Завдяки методу associate() ви можете вказати кошику, що товар у кошику об'єднаний з моделлю Product.

Таким чином ви можете отримати доступ до вашої моделі одразу з CartItem!

Доступ до моделі також можна отримати через властивість CartItem model.

Якщо ваша модель запускає інтерфейс Buyable і ви використовували вашу модель для додавання товару до кошика, вони будуть об'єднані автоматично.

Ось приклад:

// First we'll add the item to the cart.
$cartItem = Cart::add('293ad', 'Product 1', 1, 9.99, 550, ['size' => 'large']);

// Next we associate a model with the item.
Cart::associate($cartItem->rowId, 'Product');

// Or even easier, call the associate method on the CartItem!
$cartItem->associate('Product');

// You can even make it a one-liner
Cart::add('293ad', 'Product 1', 1, 9.99, 550, ['size' => 'large'])->associate('Product');

// Now, when iterating over the content of the cart, you can access the model.
foreach(Cart::content() as $row) {
	echo 'You have ' . $row->qty . ' items of ' . $row->model->name . ' with description: "' . $row->model->description . '" in your cart.';
}

База даних

Конфігурації

Для збереження кошика до бази даних, щоб ви могли отримати його пізніше, пакет повинен знати яке підключення до бази даних використовувати і яка назва окремої таблиці. За замовчуванням, пакет використовуватиме підключення до бази даних, яке вказане за замовчуванням, та використовуватиме таблицію shoppingcart. Якщо ви хочете змінити ці значення, вам потрібно буде опублікувати файл з конфігураціями config.

php artisan vendor:publish --provider="Gloudemans\Shoppingcart\ShoppingcartServiceProvider" --tag="config"

Така дія створить вам файл з конфігураціями cart.php, в якому ви можете внести бажані зміни.

Щоб спростити ваше життя, пакет також включає готову до вжитку migration, яку можна опублікувати через запуск наступної команди:

php artisan vendor:publish --provider="Gloudemans\Shoppingcart\ShoppingcartServiceProvider" --tag="migrations"

Така дія розмістить файл з міграцією таблиці shoppingcart в директорію database/migrations. Все що вам залишається зробити, це запустити php artisan migrate для міграції вашої бази даних.

Збереження кошика

Для збереження екземпляра кошика до бази даних, вам потрібно викликати метод store($identifier) . Де $identifier є випадковим ключем, наприклад, ідентифікатор або ім'я користувача.

Cart::store('username');

// To store a cart instance named 'wishlist'
Cart::instance('wishlist')->store('username');

Відновлення кошика

Якщо ви хочете отримати кошик із бази даних і відновити його, вам знадобиться викликати метод restore($identifier), де $identifier - це ключ, який ви зазначили у методі store.

Cart::restore('username');

// To restore a cart instance named 'wishlist'
Cart::instance('wishlist')->restore('username');

Злиття кошиків

Якщо ви хочете злити кошик із іншим кошиком, збереженим у базі даних, вам знадобиться викликати метод merge($identifier), де $identifier - це ключ, який ви зазначили у методіstore. Ви також можете визначити чи хочете ви зберегти знижку і ставку оподаткування для товарів.

// Merge the contents of 'savedcart' into 'username'.
Cart::instance('username')->merge('savedcart', $keepDiscount, $keepTaxrate, 'savedcartinstance');

Перехоплення

Пакет Кошик (Cart) видаватиме винятки/перехоплення у разі, якщо щось йде не за планом. Таким чином, вам буде простіше відлагоджувати (debug) ваш код, використовуючи пакет Кошик, або обробляти помилку за типом перехоплення. Пакети Кошика можуть видавати наступні перехоплення:

Перехоплення Пояснення
CartAlreadyStoredException ПерехопленняКошикВжеЗбережено Коли ви намагаєтеся зберегти кошик, який вже було збережено, застосовуючи вказаний ідентифікатор
InvalidRowIDException ПерехопленняНеправильнийІдРядка Коли rowId, який було передано, не існує у поточному екземплярі кошика
UnknownModelException ПерехопленняНевідомаМодель Коли ви намагаєтеся об'єднати неіснуючу модель з CartItem.

Події

Кошик також має вбудовані події. Існує п'ять подій, які можна очікувати.

Подія Видано Параметр
cart.added Коли товар додано до кошика. CartItem, який було додано.
cart.updated Коли товар оновлено у кошику. CartItem, який було оновлено.
cart.removed Коли товар вилучено з кошика. CartItem, який було вилучено.
cart.stored Коли вміст кошика було збережено. -
cart.restored Коли вміст кошика було відновлено. -

Приклад

Нижче наведено приклад як відобразити вміст кошика у таблиці:

// Add some items in your Controller.
Cart::add('192ao12', 'Product 1', 1, 9.99);
Cart::add('1239ad0', 'Product 2', 2, 5.95, ['size' => 'large']);

// Display the content in a View.
<table>
   	<thead>
       	<tr>
           	<th>Product</th>
           	<th>Qty</th>
           	<th>Price</th>
           	<th>Subtotal</th>
       	</tr>
   	</thead>

   	<tbody>

   		<?php foreach(Cart::content() as $row) :?>

       		<tr>
           		<td>
               		<p><strong><?php echo $row->name; ?></strong></p>
               		<p><?php echo ($row->options->has('size') ? $row->options->size : ''); ?></p>
           		</td>
           		<td><input type="text" value="<?php echo $row->qty; ?>"></td>
           		<td>$<?php echo $row->price; ?></td>
           		<td>$<?php echo $row->total; ?></td>
       		</tr>

	   	<?php endforeach;?>

   	</tbody>
   	
   	<tfoot>
   		<tr>
   			<td colspan="2">&nbsp;</td>
   			<td>Subtotal</td>
   			<td><?php echo Cart::subtotal(); ?></td>
   		</tr>
   		<tr>
   			<td colspan="2">&nbsp;</td>
   			<td>Tax</td>
   			<td><?php echo Cart::tax(); ?></td>
   		</tr>
   		<tr>
   			<td colspan="2">&nbsp;</td>
   			<td>Total</td>
   			<td><?php echo Cart::total(); ?></td>
   		</tr>
   	</tfoot>
</table>