2021年5月9日 星期日

MacOS 無法啟動Mysql/MariaDB

上一篇 MacOS php 升級 7.2→7.4 做完後,發現Mysql/MariaDB重啟時會出現問題,查了一下網路找到這篇,照著做後就能夠正常的啟動嘍!

先停止Mysql/MariaDB

mysql.server stop

因為我的原本啟動就有問題,所以DB本來就沒在啟動的狀態…

接著我們找到資料夾 /usr/local/var/mysql,然後將 ib_logfile0 & ib_logfile1 這兩個檔案刪除,再次啟動DB。

mysql.server start

成功!


MacOS php 升級 7.2→7.4

 MacOS升級至Big Sur後發現brew update無法使用了。

查了網路上很多文章建議用brew update-reset來更新,但我下了指令後卻出現了其他問題,

==> Fetching /usr/local/Homebrew...
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
...

後來查了一下才發現要重装xcode command line

xcode-select --install

再執行

brew update-reset
brew list

接著就能安裝php7.4了

brew install php@7.4

結果出現錯誤

Removing: /usr/local/Cellar/nginx/1.17.9... (25 files, 2MB)
Error: Directory not empty @ dir_s_rmdir - /usr/local/Cellar/nginx/1.17.9

先執行

sudo rm -R /usr/local/Cellar/nginx/1.17.9

之後

brew cleanup

我們就可以開始指定使用php7.4了

sudo nginx -s reload
brew unlink php@7.2
brew link php@7.4
brew services start php@7.4
export PATH="/usr/local/opt/php@7.4/bin:$PATH"
export PATH="/usr/local/opt/php@7.4/sbin:$PATH"

最後我們在檢查一下php的版本

php -v

大功告成!


2021年5月1日 星期六

PHP laravel-admin 加入查看購物車鈕

上篇在這 PHP laravel-admin 載入商品至購物車內

選購完商品後我們要有一個可以觀看並修改購物數量及輸入相關折扣(客戶要求)的購物清單畫面,並在總價下方增加一個加總欄位。

根據 PHP laravel-admin 購物車清單 ,在addCart中加入查看購物車的按鈕,藍色那行。

protected function addCart() {
    $this->iScript();
    return '
    <div class="btn-group pull-right" style="margin-right: 10px;">
    <a class="btn btn-md btn-success" title="購物車"><i class="fa fa-shopping-cart"></i><span class="hidden-xs"> 購物車</span></a>
    <button type="button" class="btn btn-md btn-success dropdown-toggle" data-toggle="dropdown">
        <span class="caret"></span>
        <span class="sr-only">Toggle Dropdown</span>
    </button>
    <ul id="isale" class="dropdown-menu" role="menu" style="min-width:300px">
        <li id="total"><a class="btn btn-md btn-danger" style="color:#FFF" title="查看購物車" href="../carts?saleid='.$saleid.'"><i class="fa fa-shopping-basket"></i><span class="hidden-xs"> 查看購物車</span></a></li>
    </ul>
</div>';
}

請先建立好cart的controller跟model,然後打開controller。

進入查看購物車頁面後可以編輯購買的商品數量及設定相關折扣,我們直接在grid頁面使用行內編輯的功能進行商品的數量及扣折編輯。

※每個editable在form裡面一定要有一個相對應的欄位,不然怎麼儲存都會無效哦,特別是後來新增的欄位別忘了也加要到form中。

protected function grid()
{
    Admin::js('../vendor/laravel-admin/AdminLTE/dist/js/cart.js');
    $this->iScript();
    $grid = new Grid(new Cart());
    $grid->model()->where('sale_id', '=', request('saleid'));
    $grid->disableActions();
    $grid->disableCreateButton();
    $grid->disableFilter();
    $grid->tools(function ($tools) {
        $tools->append($this->prev(request('saleid')));
        $tools->append($this->createBill(request('saleid')));
    });

    $grid->number('序號');
    $grid->rows(function($row, $number){
        $row->column('number', $number + 1);
    });
    $grid->column('product.name', __('商品/療程名稱'));
    $grid->column('unit', __('單價'))->editable();
    $grid->column('sale_amount', __('數量'))->editable();
    $grid->column('discount', __('折扣'))->editable();
    $grid->column('total', __('總價'))->totalRow();

    return $grid;
}

總價我們採用js即時計算並更新至資料庫中,先在單價、數量、折扣加上異動時觸發的js。

protected function iScript() {
    $script = <<<EOT
    //數量
    $('.column-sale_amount').change(function () {
        saleinfo_list_edittable($(this), 'sale_amount');
    });
    //單價
    $('.column-unit').change(function () {
        cart_list_edittable($(this), 'unit_price');
    });
    //折扣
    $('.column-discount').change(function () {
        cart_list_edittable($(this), 'discount_price');
    });
EOT;
    Admin::script($script);
}

在頁面多增加兩個按鈕,一個是繼續購物、一個是前往結帳。

protected function prev($saleid) {
    return '
<a class="btn btn-md btn-success" title="繼續選購商品" href="../products?saleid='.$saleid.'"><i class="fa fa-cart-plus"></i><span class="hidden-xs"> 繼續選購商品</span></a>
';
}

protected function createBill($saleid) {
    return '
<a class="btn btn-md btn-danger" title="結帳" href="../bills/create?sale_id='.$saleid.'&type=1"><i class="fa fa-usd"></i><span class="hidden-xs"> 結帳</span></a>
';
}
cart.js主要是做即時的總價計算並將結果儲存至資料表中。
function cart_list_edittable(obj, name) {
    var amount, price, discount;
    var ele = obj.closest('tr');
    var url = '../carts/';
    switch (name) {
        case 'sale_amount':
            amount = obj.find('.form-control').val();
            price = parseInt(ele.children('.column-unit').text());
            discount = parseInt(ele.children('.column-discount').text());
        break;
        case 'unit':
            price = obj.find('.form-control').val();
            amount = parseInt(ele.children('.column-sale_amount').text());
            discount = parseInt(ele.children('.column-discount').text());
        break;
        case 'discount':
            discount = obj.find('.form-control').val();
            amount = parseInt(ele.children('.column-sale_amount').text());
            price = parseInt(ele.children('.column-unit').text());
        break;

    }
    /* 呼叫editable() begin */
    var pk = obj.children('a').data('pk');
    var sum = amount*price-discount;
    $.ajax({
        method: 'POST',
        url: url+pk,
        data: {name: 'total', value: sum, pk: pk, _token: $.admin.token, _editable: 1, _method: 'PUT'}
    });
    /* 呼叫editable() end */
    ele.children('.column-total').text(sum);
    var total = 0;
    $('.table tbody .column-total').each(function (i, val) {
        total += parseInt($(this).text());
    });
    $('.table tfoot .column-total').text(total);    
}

好嘍,查看購物車內容完成!

下一篇我們要來介接結帳。