![]()
ActionColumn เป็น column ที่ใช้ใน yii\grid\GridView เพื่อแสดงปุ่มสำหรับควบคุมการทำงานใน column โดยจะแสดงผลในทุกๆ แถวของข้อมูล โดยมีปุ่ม default อยู่ 3 ปุ่มคือ view,update,delete
เราสามารถจัดการ เพิ่มปุ่มเอง,ซ่อน,แสดงปุ่มที่มีอยู่ได้ หรือปรับแต่งตามที่เราต้องการได้
Properties พื้นฐานที่ควรรู้
Optionsเป็นการกำหนดคำสั่ง html attribute เข้าไปใน column เฉพาะส่วนcolgroupของ table เช่น class,style หรือ attribute อื่นๆ ของ html ได้!ส่วนนี้ไม่เกี่ยวกับ content ที่แสดงผลcontentOptionsเป็นการกำหนดคำสั่ง html attribute เข้าไปใน column ที่แสดงผล เช่น class,style หรือ attribute อื่นๆ ของ html ได้templateกำหนด template การแสดงผลของค่าปุ่ม default หรือปุ่มที่สร้างขึ้นเอง ปกติ default จะเท่ากับ'{view} {update} {delete}'จะสลับตำแหน่ง เรียงใหม่,ลบ หรือเลือกแสดงเฉพาะปุ่มที่ต้องการได้ เช่นให้แสดงเฉพาะviewก็ลบอันที่เหลือออก ให้เหลือ'{view}'แบบนี้buttonsเป็นส่วนที่กำหนดการแสดงผลของปุ่มview,update,deleteหรือปุ่มอื่นๆ ที่เราสร้างขึ้นbuttonOptionsเป็นส่วนกำหนด class,css หรือ attribute ของ html ของbuttonsheaderเป็นส่วนกำหนดข้อความ header ของ columnheaderOptionsเป็นส่วนกำหนด class,css หรือ attribute ของ html ของheader
ดูรายละเอียดเพิ่มเติมได้ที่นี่ http://www.yiiframework.com/doc-2.0/yii-grid-actioncolumn.html
หลักๆ ในการจัดการ ActionColumn จะมีแค่ 2 Properties ที่จำเป็นต้องใช้งานคือ template,buttons
1.template
เป็น Properties ที่กำหนดว่าใน column นี้เราจะให้ปุ่มอะไรแสดงบ้าง ซึ่งปกติมันจะมี view,update,delete หากเราไม่ต้องการแสงดปุ่มใหนก็สามารถลบ ปุ่มที่ไม่ต้องการออกไปได้เลย เช่น หากคุณต้องการแสดงเฉพาะ view ก็สามารถตั้งค่าได้แบบนี้
[
'class' => 'yii\grid\ActionColumn',
'header'=>'Action',
'template'=>'{view}'
]
ก่อน

หลัง

หากใช้ทั้ง 3 ปุ่มอยู่แล้ว ไม่ต้องกำหนดอะไรเพิ่ม ยกเว้นเราต้องการเพิ่มอะไรบางอย่างเข้าไป
เราสามารถเพิ่ม tag html เข้าไปใน template ได้ ยกตัวอย่างการเพิ่ม style Button groups เข้าไป ดูรายละเอียด Button Groups ได้ที่นี่ ซึ่งโครงสร้าง html จะเป็นแบบนี้
<div class="btn-group" role="group" aria-label="...">
<button type="button" class="btn btn-default">Left</button>
<button type="button" class="btn btn-default">Middle</button>
<button type="button" class="btn btn-default">Right</button>
</div>

จะสังเกตได้ว่า Button Groups จะมี div ครอบอยู่ และใช้งาน class btn-group และในแต่ละปุ่มจะมี class = btn btn-default เราจึงสามารถปรับแต่งให้ ActionColumn ให้แสดงผลปุ่มแบบ Button Groups ได้แบบนี้
[
'class' => 'yii\grid\ActionColumn',
'buttonOptions'=>['class'=>'btn btn-default'],
'template'=>'<div class="btn-group btn-group-sm text-center" role="group"> {view} {update} {delete} </div>'
],
ก่อน

หลัง

2. buttons
เป็น Properties ที่เอาไว้กำหนดค่าต่างๆ ให้ปุ่มที่เรากำหนด อาจจะใส่เงื่อนไขต่างๆ ซ่อนแสดงปุ่ม,แสดงข้อความ เป็นต้น
การเพิ่มปุ่ม
ตัวอย่างนี้ เป็นการสร้างปุ่ม copy เพิ่มเข้าไปใน ActionColumn โดยเราจะต้องประกาศค่าปุ่มที่ template โดยเพิ่ม {copy} เข้าไปเพื่อให้มันรู้ว่ามีปุ่มนี้อยู่
'template'=>'{copy} {view} {update} {delete}',
จากนั้นไปกำหนดค่าต่างๆ ของปุ่มที่ Properties buttons โดยใช้ค่าที่เราตั้งไว้ใน template คือ copy และกำหนดค่าต่างๆ ได้เองเลย โดย buttons จะมีค่า params มาให้ใช้ 3 ตัวคือ
$urlระบบมันจะสร้างให้ตามชื่อปุ่มที่เราตั้งไว้ หาไม่ใช้ก็สามารถกำหนดเองได้$modelข้อมูลทั้งหมดของแถวนั้นๆ สามารถเรียกใช้งานได้ทุกฟิวด์ ที่มีในตาราง$model->fieldName$keyคือค่า pk ของตารางสามารถนำไปใช้ได้เลย
[
'class' => 'yii\grid\ActionColumn',
'template'=>'{copy} {view} {update} {delete}',
'buttons'=>[
'copy' => function($url,$model,$key){
return Html::a('<i class="glyphicon glyphicon-duplicate"></i>',$url);
}
]
],

ในส่วนของ url ระบบจะสร้างมาให้เองอัตโนมัติ โดยยึดจากชื่อ button ที่เราสร้าง เช่น ชื่อ button คือ copy ดังนั้นใน url จะเท่ากับ
r=employee/copy&id=1โดยจะมองชือ button เป็นชื่อ action ให้เลยและแนบค่า pk ของตารางที่ใช้ไปให้เลย ในกรณีที่เราไม่ต้องการใช้งาน default Url ก็ใส่เป็นค่า array เข้าไปได้เลย เช่นHtml::a('<i class="glyphicon glyphicon-duplicate"></i>',['controller/action','id'=>$model->id])
คอลัมน์แคบ
เมื่อดูตามรูปภาพด้านบนจะเห็นว่า ปุ่มยังไม่เรียงเป็นแนวนอนยังตกบรรทัดอยู่ สามารถเพิ่ม contentOptions และใส่ค่า 'noWrap' => true ได้ดังนี้
[
'class' => 'yii\grid\ActionColumn',
'template'=>'{copy} {view} {update} {delete}',
'contentOptions'=>[
'noWrap' => true
],
'buttons'=>[
'copy' => function($url,$model,$key){
return Html::a('<i class="glyphicon glyphicon-duplicate"></i>',$url);
}
]
],

หากลองใช้วิธีนี้แล้วยังไม่ได้อีกให้ลอง เพิ่มความกว้างให้ column เข้าไป ดังนี้
'options'=> [ 'style'=>'width:100px;']ตัวนี้ได้ชัวๆ
[
'class' => 'yii\grid\ActionColumn',
'template'=>'{copy} {view} {update} {delete}',
'options'=> ['style'=>'width:100px;'],
'contentOptions'=>[
'noWrap' => true
],
'buttons'=>[
'copy' => function($url,$model,$key){
return Html::a('<i class="glyphicon glyphicon-duplicate"></i>',$url);
}
]
],
การเพิ่มเงื่อนไขเพื่อซ่อนแสดงปุ่ม
เราสามารถเพิ่มเงื่อนไขเพื่อตรวจสอบค่าบางอย่าง แล้วซ่อนหรือแสดงได้ หรืออาจจะเป็นเงื่อนไขอื่นๆ ก็ได้ เช่นตัวอย่าง จะเช็คจากค่า status = 1 ให้แสดง, ถ้าไม่ใช้ให้ซ่อน
[
'class' => 'yii\grid\ActionColumn',
'template'=>'{copy} {view} {update} {delete}',
'buttons'=>[
'copy' => function($url,$model,$key){
return $model->status == 1 ? Html::a('<i class="glyphicon glyphicon-duplicate"></i>',$url) : null;
}
]
],
ถ้า status = 1 คือแสดงปุ่ม

ถ้า status ไม่เท่ากับ (!=) 1 คือซ่อนปุ่ม

โค้ดการเพิ่ม style Button Groups ให้กับปุ่มเดิมๆ ของเรา
เราสามารถเพิ่ม Button Groups เข้าไปได้ และจะทำให้ปุ่มของเราดูชัดเจนขึ้น, มองง่ายขึ้น, ดูสวยขึ้น
[
'class' => 'yii\grid\ActionColumn',
'buttonOptions'=>['class'=>'btn btn-default'],
'template'=>'<div class="btn-group btn-group-sm text-center" role="group">{copy} {view} {update} {delete} </div>',
'options'=> ['style'=>'width:150px;'],
'buttons'=>[
'copy' => function($url,$model,$key){
return Html::a('<i class="glyphicon glyphicon-duplicate"></i>',$url,['class'=>'btn btn-default']);
}
]
],

หากใช้ Pjax
ถ้าหากใช้ pjax ด้วยตรง link ต้องใส่ options 'data-pjax' => '0' ด้วยเพื่อให้ pjax ไม่ทำงานกับ link นี้ให้เป็น link url ปกติ
Html::a('<i class="glyphicon glyphicon-duplicate"></i>',['/search/index'],['data-pjax' => '0']);
สรุป ActionColumn
Yii 2 ค่อนข้างเปิดกว้างให้เราได้ปรับแต่งส่วนต่างๆ ได้เองทังหมด ในส่วน ActionColumn ก็เหมือนกัน ลองใช้งานและปรับแต่งดูครับ หากติดปัญหาก็คอมเม้นด้านล่างได้เลยครับ ^ ^