如何为Yii的DetailView添加非数据库属性并嵌入audio标签?
Yii2 DetailView 自定义音频播放属性实现方案
关于空白attribute或删除该字段的问题
- 完全可以直接删掉
'attribute' => '',这一行,DetailView支持自定义属性配置项,不需要绑定Model的现有属性,这么做更简洁。 - 用空白
attribute虽然能正常运行,但属于冗余代码,没必要保留。
实现表头显示“Play this”的两种方式
方式一:直接在配置里指定label(推荐,无需修改Model)
不需要改动Model的attributeLabels,直接在自定义属性项里添加label字段即可,代码示例:
[ 'label' => 'Play this', 'format' => 'raw', 'value' => function ($model) { // 根据你的文件存储路径生成音频URL,这里只是示例 $audioUrl = Yii::$app->request->baseUrl . '/audio-files/' . $model->filename; return "<audio controls src='{$audioUrl}'>你的浏览器不支持音频播放功能</audio>"; }, ],
方式二:通过Model的attributeLabels管理标签
如果想统一管理所有标签,可以给自定义项加一个虚拟属性名,比如audioPlayer,然后在Model的attributeLabels()方法里添加对应标签:
首先修改DetailView的属性配置:
[ 'attribute' => 'audioPlayer', 'format' => 'raw', 'value' => function ($model) { $audioUrl = Yii::$app->request->baseUrl . '/audio-files/' . $model->filename; return "<audio controls src='{$audioUrl}'>你的浏览器不支持音频播放功能</audio>"; }, ],
然后在Model类的attributeLabels()方法中添加:
public function attributeLabels() { return array_merge(parent::attributeLabels(), [ 'audioPlayer' => 'Play this', ]); }
完整示例代码
修改后的DetailView完整代码如下:
DetailView::widget([ 'model' => $model, 'attributes' => [ 'feed', 'feedname', // ...这里保留你原有的其他属性 'filename', // 新增的音频播放项 [ 'label' => 'Play this', 'format' => 'raw', 'value' => function ($model) { $audioUrl = Yii::$app->request->baseUrl . '/audio-files/' . $model->filename; return "<audio controls src='{$audioUrl}'>你的浏览器不支持音频播放功能</audio>"; }, ], ], ])
内容的提问来源于stack exchange,提问作者JKofsky
相关产品推荐
相关产品推荐

