在 Yii2 中使用 clipboard.js
Using clipboard.js with Yii2
我已经安装了扩展
\supplyhog\ClipboardJs\ClipboardJsWidget
看起来工作正常。
但我正在努力让它在 gridview 中工作。
因为扩展代码已经在使用一个小部件,而 gridview 本身就是一个小部件,所以我认为这会造成冲突。
建议在gridview之外的代码是这样的:
//Button to copy text
<?= \supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => "Hello World",
// 'label' => 'Copy to clipboard',
// 'htmlOptions' => ['class' => 'btn'],
// 'tag' => 'button',
]) ?>
//Button to copy text from input id
<?= \supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'inputId' => "#input-url",
// 'cut' => false, // Cut the text out of the input instead of copy?
// 'label' => 'Copy to clipboard',
// 'htmlOptions' => ['class' => 'btn'],
// 'tag' => 'button',
]) ?>
如何将它集成到 Gridview 中?
例子-
它就是这样显示的——第三个单元格是剪贴板代码的结果。
隐藏文本的示例
在@Omer 的帮助下,我尝试修改代码如下:
.mycopy{
position:absolute;
right:-10px;
top:-10px;
}
.mycopy .btn{
padding:2px !important;
}
[
'attribute' => 'title',
'format' => 'raw',
'value' => function($model){
$button=\supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => $model->title,
'label' =>'<i class="far fa-copy" aria-hidden="true"></i>',
]);
return "<div style='position:relative'><div style='margin-right:10px;'>".$model->title."</div><div class='mycopy'>".$button."</div></div>";
}
],
结果如下所示:
我的理解是,您正在尝试针对每一行填充 gridview 内的按钮,并且在单击时,您希望将该行中的特定文本复制到剪贴板中。
如果这是正确的,那么您可以执行以下操作,我将创建示例代码,假设 user
模型在 GridView
中使用,并且当单击按钮时 Bio
将被复制到剪贴板。
<?=
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'username',
'active',
'password',
'bio',
[
'class' => 'yii\grid\ActionColumn',
'template' => '{view}{update}{delete}{copy}',
'buttons' => [
'copy' => function($url, $model, $key){
return \supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => $model->bio
]);
},
]
],
],
]);
?>
注意:您可以将 $model->description
更改为您要复制的任何列名称 'text' => $model->description
。
如果您打算在 DataColumn
而不是 ActionColumn
中显示它,您可以使用以下代码,它将显示列文本和下面的按钮以进行复制剪贴板中的文本。
[
'attribute' => 'bio',
'format' => 'raw',
'value' => function($model){
$button=\supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => $model->bio,
]);
return $model->bio."<br/>".$button;
}
],
更新
要复制图像中提到的相同 css,您应该执行以下操作
将此 css 添加到您的视图
$css = <<< CSS
.clip-input-group{
width:100%;
float:left;
}
.input-group-button {
width: 14%;
vertical-align: middle;
display: inline-block;
border: 1px solid #ccc;
border-radius: 3px;
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
float: left;
border-top-left-radius: 0px;
border-bottom-left-radius: 0px;
padding: 5px;
text-align: center;
cursor: pointer;
}
.input-group-button i{
font-size:12px;
}
.clip-input{
width: 85%;
display: inline-block;
float: left;
border-radius: 3px;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
border: 1px solid #ccc;
border-right-color: rgb(204, 204, 204);
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
padding: 5px;
border-right-color: transparent;
}
CSS;
$this->registerCss($css);
然后将您的列定义更改为以下内容,我使用的是 fontawesome 剪贴板图标而不是图像,
注意:我不是 css 专家,但设法创建了相同的专家,如果有人可以提出更好的建议 类 我愿意接受建议
[
'attribute' => 'bio',
'format' => 'raw',
'value' => function ($model) {
$button = \supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => $model->bio,
'label' => '<i class="fa fa-clipboard" aria-hidden="true"></i>',
'htmlOptions' => ['class' => ''],
'tag' => 'a',
]);
$text = $model->bio;
$html = <<< HTML
<div class="clip-input-group">
<input type="text" disabled value="{$text}" class="clip-input">
<span class="input-group-button">
$button
</span>
</div>
HTML;
return $html;
},
],
我已经安装了扩展
\supplyhog\ClipboardJs\ClipboardJsWidget
看起来工作正常。
但我正在努力让它在 gridview 中工作。
因为扩展代码已经在使用一个小部件,而 gridview 本身就是一个小部件,所以我认为这会造成冲突。
建议在gridview之外的代码是这样的:
//Button to copy text
<?= \supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => "Hello World",
// 'label' => 'Copy to clipboard',
// 'htmlOptions' => ['class' => 'btn'],
// 'tag' => 'button',
]) ?>
//Button to copy text from input id
<?= \supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'inputId' => "#input-url",
// 'cut' => false, // Cut the text out of the input instead of copy?
// 'label' => 'Copy to clipboard',
// 'htmlOptions' => ['class' => 'btn'],
// 'tag' => 'button',
]) ?>
如何将它集成到 Gridview 中?
例子-
它就是这样显示的——第三个单元格是剪贴板代码的结果。
隐藏文本的示例
在@Omer 的帮助下,我尝试修改代码如下:
.mycopy{
position:absolute;
right:-10px;
top:-10px;
}
.mycopy .btn{
padding:2px !important;
}
[
'attribute' => 'title',
'format' => 'raw',
'value' => function($model){
$button=\supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => $model->title,
'label' =>'<i class="far fa-copy" aria-hidden="true"></i>',
]);
return "<div style='position:relative'><div style='margin-right:10px;'>".$model->title."</div><div class='mycopy'>".$button."</div></div>";
}
],
结果如下所示:
我的理解是,您正在尝试针对每一行填充 gridview 内的按钮,并且在单击时,您希望将该行中的特定文本复制到剪贴板中。
如果这是正确的,那么您可以执行以下操作,我将创建示例代码,假设 user
模型在 GridView
中使用,并且当单击按钮时 Bio
将被复制到剪贴板。
<?=
GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'username',
'active',
'password',
'bio',
[
'class' => 'yii\grid\ActionColumn',
'template' => '{view}{update}{delete}{copy}',
'buttons' => [
'copy' => function($url, $model, $key){
return \supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => $model->bio
]);
},
]
],
],
]);
?>
注意:您可以将 $model->description
更改为您要复制的任何列名称 'text' => $model->description
。
如果您打算在 DataColumn
而不是 ActionColumn
中显示它,您可以使用以下代码,它将显示列文本和下面的按钮以进行复制剪贴板中的文本。
[
'attribute' => 'bio',
'format' => 'raw',
'value' => function($model){
$button=\supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => $model->bio,
]);
return $model->bio."<br/>".$button;
}
],
更新
要复制图像中提到的相同 css,您应该执行以下操作
将此 css 添加到您的视图
$css = <<< CSS
.clip-input-group{
width:100%;
float:left;
}
.input-group-button {
width: 14%;
vertical-align: middle;
display: inline-block;
border: 1px solid #ccc;
border-radius: 3px;
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
float: left;
border-top-left-radius: 0px;
border-bottom-left-radius: 0px;
padding: 5px;
text-align: center;
cursor: pointer;
}
.input-group-button i{
font-size:12px;
}
.clip-input{
width: 85%;
display: inline-block;
float: left;
border-radius: 3px;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
border: 1px solid #ccc;
border-right-color: rgb(204, 204, 204);
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
padding: 5px;
border-right-color: transparent;
}
CSS;
$this->registerCss($css);
然后将您的列定义更改为以下内容,我使用的是 fontawesome 剪贴板图标而不是图像,
注意:我不是 css 专家,但设法创建了相同的专家,如果有人可以提出更好的建议 类 我愿意接受建议
[
'attribute' => 'bio',
'format' => 'raw',
'value' => function ($model) {
$button = \supplyhog\ClipboardJs\ClipboardJsWidget::widget([
'text' => $model->bio,
'label' => '<i class="fa fa-clipboard" aria-hidden="true"></i>',
'htmlOptions' => ['class' => ''],
'tag' => 'a',
]);
$text = $model->bio;
$html = <<< HTML
<div class="clip-input-group">
<input type="text" disabled value="{$text}" class="clip-input">
<span class="input-group-button">
$button
</span>
</div>
HTML;
return $html;
},
],