Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
systems:yii2:examples [2018/05/29 17:14]
smayr [Modal confirmation called from GridView]
systems:yii2:examples [2018/10/04 17:05] (current)
ajdavis [Copy to Clipboard using Javascript]
Line 989: Line 989:
 <code php> <code php>
 <?php  <?php 
-use yii\helpers\Url+    // Method 1: Button 
-... +    \yii\helpers\Html::button('Privacy Policy',
-    // Method 1 +        'id'    => 'btnPrivacyPolicy', 
-    echo Html::a('Privacy Policy', ['site/privacy']);+        'class' => 'btn btn-default btn-sm', 
 +    ])
 +                 
 +    // Method 2: Link styled as button 
 +    echo \yii\helpers\Html::a('Privacy Policy', ['site/privacy']);
  
-    // Method 2 +    // Method 3: Link styled as button 
-    $url = urldecode(Url::toRoute(['site/privacy'])); +    $url = urldecode(\yii\helpers\Url::toRoute(['site/privacy'])); 
-    echo Html::a('Privacy Policy', $url);+    echo \yii\helpers\Html::a('Privacy Policy', $url);
          
-    // Method 3 +    // Method 4: Link styled as button 
-    echo Url::to(['site/privacy']); +    echo \yii\helpers\Url::to(['site/privacy']); 
 ?> ?>
 </code> </code>
Line 1526: Line 1530:
  
 === Modal Window === === Modal Window ===
 +  * See: [[systems:yii2:Modal Window]]
  
-<code php> 
-<?php 
-    //------------------------ 
-    // Image 
-    //------------------------ 
-    $itemImage = (!empty($model->image_file) ?  
-        Yii::$app->homeUrl . 'img/data/' . Yii::$app->controller->id . "/{$model->image_file}" 
-        '' 
-    ); 
-     
-    //------------------------ 
-    // Image Thumbnail 
-    //------------------------ 
-    if(!empty($itemImage)) { 
-        echo "<img class='img-thumbnail' src='{$itemImage}' alt='Item Image'>"; 
-    } else { 
-        echo "<img class='img-thumbnail' src='data:image/png;base64," 
-            base64_encode(\app\models\Tool::generateEmptyPng()) . "'/>"; 
-    } 
  
- 
-    echo Html::a('<i class="fa fa-plus" aria-hidden="true"></i> ' . Yii::t('app', 'Add Image'),  
-        ['upload-image', 'id' => $model->id], ['class' => 'btn btn-default'] 
-    ); 
- 
-    //------------------------ 
-    // Modal to view image  
-    //------------------------ 
-    yii\bootstrap\Modal::begin([ 
-        'header' => '<h4>Item Image</h4>', 
-        'size'   => yii\bootstrap\Modal::SIZE_LARGE, 
-        'toggleButton' => [ 
-            'label' => '<i class="fa fa-image" aria-hidden="true"></i> ' . Yii::t('app', 'View Image'),  
-            'class' => 'btn btn-default' 
-        ], 
-    ]); 
- 
-    if(!empty($itemImage)) { 
-        echo "<img class='img-fluid' src='{$itemImage}' alt='Item Image'>"; 
-    } else { 
-        echo "<img class='img-fluid' src='data:image/png;base64," 
-            base64_encode(\app\models\Tool::generateEmptyPng()) . "'/>"; 
-    } 
-    echo '<div class="modal-footer">'; 
-    echo '    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>'; 
-    echo '</div>'; 
- 
-    yii\bootstrap\Modal::end();   
-?> 
-</code> 
- 
-==== Modal called from GridView ==== 
-Modal to view or update a record, called from a ''GridView'': 
-<code php> 
-<?= yii\grid\GridView::widget([ 
-    'dataProvider' => $dataProviderPrice, 
-    'filterModel'  => $searchModelPrice, 
-    'tableOptions' => ['class' => 'table table-striped table-bordered table-hover'], 
-    'columns' => [ 
-        // record number column 
-        ['class' => 'yii\grid\SerialColumn'],   
-        'id', 
-        'item_code', 
-        'description', 
-        //['class' => 'yii\grid\ActionColumn'], 
-        [ 
-            'class' => 'yii\grid\ActionColumn', 
-            //'template' => '{view} {update} {delete}', 
-            'buttons' => [ 
-                'view' => function ($url, $model) { 
-                     return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', $url , ['class' => 'view', 'data-pjax' => '1']); 
-                }, 
-                'update' => function ($url, $model) { 
-                     return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url , ['class' => 'update', 'data-pjax' => '0']); 
-                }, 
-            ], 
-        ],  
-    ], 
-]) ?> 
- 
-<?php 
-    // Attach click events to buttons 'View' and 'Update' 
-    $this->registerJs( 
-        "$(document).ready(function() { 
-            $('.view').click(function(e){ 
-               e.preventDefault(); 
-               $('#modalView').modal('show') 
-                   .find('.modal-content') 
-                   .load($(this).attr('href')); 
-           }); 
-           $('.update').click(function(e){ 
-               e.preventDefault();       
-               $('#modalUpdate').modal('show') 
-                   .find('.modal-content') 
-                   .load($(this).attr('href')); 
-           }); 
-       }); 
-    "); 
-?> 
- 
-<?php 
-    // Modal for VIEW 
-    yii\bootstrap\Modal::begin([ 
-        'id'           => 'modalView', 
-        'header'       => '<b>' . Yii::t('app', 'View') . '</b>', 
-        'footer'       => Html::submitButton(Yii::t('app', 'Close')), 
-        //'toggleButton' => ['label' => '<span class="glyphicon glyphicon-eye-open"></span>', 'href' => yii\helpers\Url::to(['view'])], 
-        'size' => yii\bootstrap\Modal::SIZE_LARGE, 
-    ]); 
-    echo "<div id='modal-content'></div>"; 
-    yii\bootstrap\Modal::end(); 
-?> 
- 
-<?php 
-    // Modal for UPDATE 
-    yii\bootstrap\Modal::begin([ 
-        'id'           => 'modalUpdate', 
-        'header'       => '<b>' . Yii::t('app', 'Update') . '</b>', 
-        'footer'       => Html::submitButton(Yii::t('app', 'Close')), 
-        //'toggleButton' => ['label' => '<span class="glyphicon glyphicon-pencil"></span>', 'href' => yii\helpers\Url::to(['update'])], 
-        'size' => yii\bootstrap\Modal::SIZE_LARGE, 
-    ]); 
-    echo "<div id='modal-content'></div>"; 
-    yii\bootstrap\Modal::end(); 
-?> 
-</code> 
- 
-See also: [[http://techbloghunting.com/2017/05/17/yii2-bootstrap-modal/|Yii2 Bootstrap Modal]] 
- 
-==== Modal confirmation called from GridView ==== 
-Example of confirmation dialog in a view: 
-<code php> 
-<?php 
-<?= yii\grid\GridView::widget([ 
-    'dataProvider' => $dataProviderPrice, 
-    'filterModel'  => $searchModelPrice, 
-    'tableOptions' => ['class' => 'table table-striped table-bordered table-hover'], 
-    'columns' => [ 
-        // record number column 
-        ['class' => 'yii\grid\SerialColumn'],   
-        'id', 
-        'item_code', 
-        'description', 
-        ['class' => 'yii\grid\ActionColumn'], 
-        [   // Checkboxes to delete selection 
-            'class' => 'yii\grid\CheckboxColumn', 
-           'footer' => getDeleteConfirmationDialog(),  // Call Modal dialog 
-        ],   
-    ], 
-    'showFooter' => true, 
-]) ?> 
- 
-<?php 
-    // Add Javascript code to perform AJAX call (using JQuery) 
-    $this->registerJs( 
-        "$(document).ready(function() { 
-             
-            $('#modalConfirmDelete').on('hide.bs.modal', function (event) { 
-                var activeElement = $(document.activeElement); 
-                if (activeElement.is('[data-toggle], [data-dismiss]')) { 
-                    console.log(activeElement); 
-                    console.log('Button : ' + activeElement[0].textContent); 
-                    var action = activeElement[0].textContent; 
-                    switch(action) { 
-                        case 'Delete': console.log('Deleting selected records. Action: ' + action); delSelected(); break; 
-                        case 'Cancel': console.log('Canceled deletion. Action: ' + action); break; 
-                        default:       console.log('Nothing to be deleted. Action: ' + action); break; 
-                    } 
-                } 
-            }); 
-             
-        }); 
-     
-        function delSelected() 
-        { 
-            if ( $( '#w5' ).length ) { 
-                var keys = $('#w5').yiiGridView('getSelectedRows'); // #w5 = col 5 in GridView for checkboxes 
-                console.log('Keys selected for deletion: ' + keys); 
-                $.post({  
-                    url:'". Yii::$app->homeUrl ."price/delete-selected',  
-                    dataType: 'json', 
-                    data: {keylist: keys}, 
-                    success: function( data ) { 
-                        console.log('Data Received: '); 
-                        console.log(data.status); 
-                        console.log(data.details); 
-                        console.log(data.data_post); 
-                        console.log(data.data_get); 
-                    } 
-                }); 
-            } else { 
-                alert('No items available/selected for deletion.'); 
-            } 
-        } 
-    ", \yii\web\View::POS_END); 
-?> 
- 
-<?php 
-function getDeleteConfirmationDialog() 
-{ 
-    $str = ''; 
-    $str .= '<!-- Button trigger modal -->'; 
-    $str .= '<button type="button" class="btn btn-default btn-sm" data-toggle="modal" data-target="#modalConfirmDelete">'; 
-    $str .= '  <span class="fa fa-trash-o" aria-hidden="true"></span>'; 
-    $str .= '</button>'; 
-    $str .= ''; 
-     
-    $str .= '<!-- Modal -->'; 
-    $str .= '<div class="modal fade" id="modalConfirmDelete" tabindex="-1" role="dialog" aria-labelledby="modalLabelConfirmDelete">'; 
-    $str .= '  <div class="modal-dialog modal-sm" role="document">'; 
-    $str .= '    <div class="modal-content">'; 
-    $str .= '      <div class="modal-header">'; 
-    $str .= '        <button type="button" class="close" data-dismiss="modal" aria-label="Close">'; 
-    $str .= '          <span aria-hidden="true">&times;</span>'; 
-    $str .= '        </button>'; 
-    $str .= '        <h4 class="modal-title" id="modalLabelConfirmDelete">Delete</h4>'; 
-    $str .= '      </div>'; 
-    $str .= '      <div class="modal-body"><p>Delete selected records?</p></div>'; 
-    $str .= '      <div class="modal-footer">'; 
-    $str .= '          <button type="button" class="btn btn-alert" data-dismiss="modal">Delete</button>'; 
-    $str .= '          <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>'; 
-    $str .= '      </div>'; 
-    $str .= '    </div>'; 
-    $str .= '  </div>'; 
-    $str .= '</div>'; 
- 
-    return $str; 
-} 
-?> 
-</code> 
- 
-In controller, add the action to call.  Eg: ''actionDeleteSelected()'' 
-<code php> 
-//... 
-class PriceController extends Controller 
-{ 
-    public function behaviors() 
-    { 
-        return [ 
-            'access' => [ 
-                'class' => AccessControl::className(), 
-                'rules' => [ 
-                    [ 
-                        'actions' => [ 
-                            'index', 'delete-selected', //...  
-                        ], 
-                        'allow' => true, 
-                        'roles' => ['@'],  // @ = Authenticated users 
-                    ], 
-                    //... 
-                ], 
-            ], 
-            //... 
-        ]; 
-    } 
-     
-    //... 
-     
-    /** 
-     * Deletes selected Price models for specified customer. 
-     * @return mixed 
-     */ 
-    public function actionDeleteSelected() 
-    { 
-        if (Yii::$app->request->post('keylist')) { 
-            $keys = Yii::$app->request->post('keylist'); 
-            if (!is_array($keys)) { 
-                return \yii\helpers\Json::encode([ 
-                    'status'  => 'error', 
-                    'details' => 'Not an array', 
-                ]); 
-            } 
-             
-            if (count($keys) > 0) { 
-                $model = $this->findModel($keys[0]); 
-                $customer_id = $model->customer_id; 
-                 
-                // Method 1: Delete each record (using a loop) 
-                //foreach ($keys as $key => $id) { 
-                //    $model = $this->findModel($id); 
-                //    $model->delete(); 
-                //} 
-                 
-                // Method 2: Delete each record (using single query) 
-                $result = (new \yii\db\Query) 
-                    ->createCommand() 
-                    ->delete('price', ['in', 'id', $keys]) 
-                    ->execute(); 
-                 
-                // Return Method 1: JSON 
-                //return \yii\helpers\Json::encode([ 
-                //    'status'    => 'success', 
-                //    'details'   => "Deleted items:\n" . implode(", ", $keys), 
-                //]); 
-                 
-                // Return Method 2: Redirect 
-                return $this->redirect(['customer/view', 'id' => $customer_id, 'tab'=>'price']); 
-            } 
-        } 
-        return \yii\helpers\Json::encode([ 
-            'status'    => 'error', 
-            'details'   => 'Not POST data', 
-        ]); 
-    } 
-</code> 
- 
-See also: 
-  * [[https://stackoverflow.com/questions/37473895/how-i-can-process-a-checkbox-column-from-yii2-gridview|Process checkbox column from Yii2 GridView]] 
 == Events == == Events ==
  
Line 1960: Line 1658:
             'createdAtAttribute' => 'created_at', // OR 'create_time', to override default field name             'createdAtAttribute' => 'created_at', // OR 'create_time', to override default field name
             'updatedAtAttribute' => 'updated_at', // OR 'update_time', to override default field name             'updatedAtAttribute' => 'updated_at', // OR 'update_time', to override default field name
-            'value' => new \yii\db\Expression('NOW()'),+            'value' => new \yii\db\Expression('NOW()'),  // for PHP/SQL datetime field 
 +            //'value' => time(),                         // for epoch time (unix) field
         ],         ],
         [         [
Line 3260: Line 2959:
 $dataProviderPrice->pagination->pageSizeLimit   = false; $dataProviderPrice->pagination->pageSizeLimit   = false;
 </code>         </code>        
 +
 +== Copy to Clipboard using Javascript ==
 +
 + # Add a reference to the //ClipboardJS// library either by using Yii2 registerJsFile or adding the file to ''assets\AppAsset.php''
 + # Add javascript to your page that creates an instance of ClipboardJS:
 +<code php>$this->registerJs("var clipboard = new ClipboardJS('.btn-clip');", \yii\web\View::POS_END);</code>
 + # Add a button that follows this logic:
 +<code html>
 +<i class="fa fa-copy btn btn-default btn-clip" data-clipboard-text="value-to-copy"></i>
 +</code>