---
tags: laravel,voyager
---
# Voyager實作
![](https://i.imgur.com/UpiI5pM.png)
## 可用指令
安裝Voyager套件(針對Laravel5)
composer require tcg/voyager:"1.2.7"
安裝Voyager套件(針對Laravel6~8)
composer require tcg/voyager
賦予現有使用者admin@admin.com管理員權限
php artisan voyager:admin admin@admin.com
建立新使用者admin@admin.com並賦予管理員權限
php artisan voyager:admin admin@admin.com --create
安裝Voyager資料
php artisan voyager:install
## Helper Function
```
//從public資料夾取出1.jpg
asset('1.jpg');
//從storage/app/public資料夾取出1.jpg
Voyager::image('1.jpg');
```
### 開發自己的Widgets
Step 1.從vendor/tcg/voyager/src/Widgets複製Widget範本
Step 2.在App/Http/Widgets用範本新增一個Widget
Step 3.編輯Widget類別的run()與shouldBeDisplayed(),範例如下
```
public function run()
{
$count = Voyager::model('User')->count();
$string = "共計使用者{$count}位";
return view('voyager::dimmer', array_merge($this->config, [
'icon' => 'voyager-backpack',
'title' => "{$count} 個使用者",
'text' => $string,
'button' => [
'text' => "查詢使用者",
'link' => route('voyager.users.index'),
],
'image' => Voyager::image('people.png'),
]));
}
/**
* Determine if the widget should be displayed.
*
* @return bool
*/
public function shouldBeDisplayed()
{
//return Auth::user()->can('browse', Voyager::model('User'));
//不論登入者是誰,總是要顯示Widget
return true;
}
```
Step 4.編輯config/voyager.php,加入Widget設定
```
'widgets' => [
'App\Http\Widgets\UserWidget',
],
```
## 複寫users使用者的編輯視圖
Voyager的使用者編輯視圖所在路徑
vendor/tcg/voyager/resources/views/users/edit-add.blade.php
Step 1.將上面的檔案複製到resources/views/vendor/voyager/users
Step 2.編輯edit-add.blade.php,加入所需要新增的欄位,如下例:
```
<div class="form-group">
<label for="age">年紀</label>
<input type="number" class="form-control" id="age" name="age" value="{{ old('age', $dataTypeContent->age ?? '') }}">
</div>
<div class="form-group">
<label for="pic">圖片網址</label>
<input type="text" class="form-control" id="pic" name="pic" value="{{ old('pic', $dataTypeContent->pic ?? '') }}">
</div>
```
Step 3.確保該表格的BREAD有更新
## 媒體管理員
PS:如果出現上傳檔案過大的問題,你可以變更php.ini裏頭的max_file_upload和file_upload_size設定
## menu builder
### 取用menu資料語法
```
menu(菜單名稱)
menu(菜單名稱,樣式檔名)
menu(菜單名稱,"bootstrap") 以bootstrap作為樣式
menu(菜單名稱,"_json") 以JSON格式作為樣式
```
### menu菜單樣式範例
菜單樣式的視圖檔存放於 resources/views資料夾內
```
<ul class="myclass menuclass">
@foreach($items as $menu_item)
<li class="liclass"><a href="{{ $menu_item->link() }}">{{ $menu_item->title }}</a></li>
@if(count($menu_item->children)>0)
@foreach($menu_item->children as $menu_sub_item)
<li class="liclass"><a href="{{ $menu_sub_item->link() }}">{{ $menu_sub_item->title }}</a></li>
@endforeach
@endif
@endforeach
</ul>
```
### Database
當用資料庫頁面生成生成/變更結構,如何轉換成Migration檔案
Laravel 5版本 透過套件 [Migrations-generator](https://github.com/Xethron/migrations-generator)
Laravel 6以上版本 [透過網頁服務](https://laravelarticle.com/laravel-migration-generator-online)
### 指南針
提供Voyager教學資源.Icon類別.CLi呼叫面板.Log檢視
在正式環境開啟Compass指南針頁面
```
//config/voyager.php
// Activate compass when environment is NOT local
'compass_in_production' => true,
```
### BREAD
提供各表格的後台新增.刪除.修改與查詢功能,可說是Voyager套件的核心
BREAD基礎設定
顯示名稱單複數 作為頁面所呈現的文字
URL Slug 用於生成BREAD的路徑,一般與表格名稱相同
使用圖標 於後台選單項目所顯示的ICON
模型名稱 該表格的模型類別,包含命名空間
控制器名稱 BREAD所使用的功能,如無須複寫預設功能可留空白
Policy名稱 BREAD所使用的政策,一般用於資料層級的權限設計
權限生成 一併生成該表格相關的權限,必須有權限才能使用該表的BREAD,一般都設為"是"
伺服器端分頁 Browse頁面的分頁功能是否由後台提供,是的話功能較完整,建議選"是"
順序欄位 設定該表格用於儲存順序的數字欄位
顯示順序欄位 用於編輯順序功能頁面,各資料所顯示的欄位內容
order direction 排序方式
Default server-side search field Browse頁面的搜尋欄預設針對哪個欄位
欄位列表區域
欄位字段順序 會影響Browse.Read等所有BREAD頁面的欄位呈現的順序。設為必塡的欄位同樣會在表單被驗證必須填入
可見性 決定該欄位在各BREAD頁面是否出現,也會影響到能否儲存與更新
輸入類型 決定該欄位的輸入項類型
顯示名稱 決定該欄位的標頭名稱
可選細項 用以加入該欄位的參數,作為自定義的主要手段
#### 可選細項列表
> 重要事項
*輸入的最後一項不可以加逗號,會出錯
*不可以使用單引號,須改用雙引號
一般類
* description 輸入項下方問號提示
* default 預設內容
* validation 驗證
* rules 要驗證的規則
* validation 當驗證不過時要顯示的自定義文字
* null 空值的處理
* diplay 顯示
* id 在外圍的div標籤加入id屬性
* width 設定輸入項的寬度,最大為12,最小為1
Checkbox
* on 開啟的文字提示
* off 關閉的文字提示
* checked 預設的狀態
Select Dropdown
* options 選項
* default 預設選項
Media Picker
* min 最少圖片數
* max 最多圖片數
* resize 進行縮圖
* quality 壓縮品質
* upsize 是否支援放大
* thumbnais 縮圖定義
* watermark
* source 浮水印圖片所在位置,根目錄為storage/app/public
* position 浮水印的位置
* x X軸位移
* y Y軸位移
* size 相對於圖片的大小,預設為15
* base_path 預設開啟路徑,如不設定則為與表格名稱相同的資料夾
* allowed 可上傳的類型,例如:["image", "audio", "video"]
### Role 角色
用來設定使用者的權限
Name 寫英文,用於程式
Display Name 可寫中文,用於顯示
權限 要給該角色的權限就打勾
權限術語:
* browse 瀏覽多筆資料
* read 瀏覽單筆資料
* edit 編輯資料
* add 新增資料
* delete 刪除資料
權限關鍵字: 權限術語 + _ + slugs
如果某個菜單項目和BREAD有關,它將會檢查其Browse權限,需要有Browse權限該菜單項目才會顯示
### Settings 設定
管理可於專案內使用的設定常數,可支援多種欄位
新增設定欄位說明
* 命名 讓管理員能理解該設定的功用,可輸入中文
* 鍵 存取該設定時所用的關鍵字
* 類型 該設定於編輯時所使用的輸入項
* 組 該設定所屬群組,可選擇既有群組,也可輸入新的群組名來新增
* 選項 如類型為下拉選單,可在此編輯選單的項目,如下例
```
{
"options" : {
"key1" : "選項1",
"key2" : "選項2"
},
"default" : "key1"
}
```
### Helper Function
//取用設定
setting('群組名.鍵')
//生成storage/app/public裡頭圖片的完整網址
Voyager::image('圖片路徑')
### 縮圖使用
需有縮圖欄位的表格Model加入Resizable traits才能用此功能。
//app/Post.php
**use TCG\Voyager\Traits\Resizable;**
class Post extends Model{
**use Resizable;**
}
顯示單一圖片範例
```
@foreach($posts as $post)
//顯示image欄位的小圖
<img src="{{Voyager::image($post->thumbnail('small'))}}" />
//顯示photo欄位的小圖
<img src="{{Voyager::image($post->thumbnail('small', 'photo'))}}" />
@endforeach
```
顯示多張圖片範例
```
@foreach($posts as $post)
$images = json_decode($post->images);
@foreach($images as $image)
<img src="{{ Voyager::image($post->getThumbnail($image, 'small')) }}" />
@endforeach
@endforeach
```
### 取用Browse頁面所選擇的項目
Step 1.將連結或按鈕改成以下寫法
```
<form action="{{ route(路由名稱) }}" id="表單ID" method="POST" style="display:none">
{{ csrf_field() }}
<input type="hidden" name="ids" id="參數ID" value="">
</form>
<a onclick="event.preventDefault();document.getElementById('表單ID').submit();" class="btn btn-success">
<i class="voyager-polaroid"></i> <span>按鈕文字</span>
</a>
```
Step 2.加入以下的script
```
<script>
$('input[name="row_id"]').on('change', function () {
var ids = [];
$('input[name="row_id"]').each(function() {
if ($(this).is(':checked')) {
ids.push($(this).val());
}
});
$('#參數ID').val(ids);
});
</script>
```
Step 3.在Controller取用ids的作法
```
$ids = [];
if (empty($id)) {
// Bulk action, get IDs from POST
$ids = explode(',', $request->ids);
} else {
// Single item action, get ID from URL
$ids[] = $id;
}
```