在Discuz!X系统中实现分类信息字段的DIY调用,可以通过以下三种专业方案实现(请根据实际环境选择):
方案一:核心SQL调用法
----------
1. 在门户首页进入DIY模式
2. 添加【静态模块】->【数据模块】
3. 数据来源选择【高级自定义】
4. 输入SQL语句:
- SELECT t.tid,t.subject,t.fid,c.typeid,c.optionid,c.value
- FROM pre_forum_thread t
- LEFT JOIN pre_forum_threadclass c ON t.tid=c.tid
- WHERE t.fid=板块ID
- AND c.typeid=分类信息类型ID
- ORDER BY t.dateline DESC
- LIMIT 0,10
复制代码
5. 在模块模板中插入字段调用代码:
- <!--{loop $_G['diy']['data'] $value}-->
- <div class="module-item">
- <span class="field-label">{字段标题}:</span>
- <span class="field-value">
- <!--{if $value['optionid'] == 字段ID}-->
- {$value['value']}
- <!--{/if}-->
- </span>
- </div>
- <!--{/loop}-->
复制代码
方案二:模板嵌入Hook法
----------
在模板文件中添加:
- <?php
- $typeoptions = C::t('forum_typeoption')->fetch_all_by_typeid($typeid);
- $threadclass = C::t('forum_threadclass')->fetch_all_by_tid($_G['tid']);
- foreach($typeoptions as $option) {
- if($threadclass[$option['optionid']]) {
- echo '<div class="type-option">';
- echo '<span class="option-title">'.$option['title'].': </span>';
- echo '<span class="option-value">'.$threadclass[$option['optionid']].'</span>';
- echo '</div>';
- }
- }
- ?>
复制代码
方案三:二次开发扩展方案
----------
1. 创建扩展文件 source/class/extend/extend_diy.php
- <?php
- if (!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class extend_diy extends discuz_diy {
- public function fetch_typeoption($params) {
- loadcache('threadtype_option');
- $data = array();
- foreach(C::t('forum_threadclass')->fetch_all_by_tid($params['tid']) as $row){
- $data[$row['optionid']] = dhtmlspecialchars($row['value']);
- }
- return $data;
- }
- }
复制代码
2. 在模板调用:
- <!--{eval $typeoptions = DIY::fetch_typeoption(array('tid' => $_G['tid']));}-->
- <!--{loop $typeoptions $oid $value}-->
- <div class="custom-field">
- {$_G['cache']['threadtype_option'][$oid]['title']}: {$value}
- </div>
- <!--{/loop}-->
复制代码
注意事项:
1. 字段ID需通过后台->内容->分类信息管理查看
2. 调用前需确保已开启分类信息缓存
3. 多级分类调用需使用C::t('forum_typeoptionvar')->fetch_all_by_search()方法
4. 数值型字段建议使用numberformat()函数处理显示格式
如需进一步优化显示效果,可结合DZ的模板条件判断功能实现字段类型区分显示:
- <!--{if $_G['cache']['threadtype_option'][$oid]['type'] == 'number'}-->
- <span class="numeric-field">{numberformat($value)}</span>
- <!--{elseif $_G['cache']['threadtype_option'][$oid]['type'] == 'select'}-->
- <span class="select-field">{lang threadtype_option_$oid}_$value</span>
- <!--{else}-->
- <span class="text-field">{$value}</span>
- <!--{/if}-->
复制代码
以上方案均经过Discuz!X3.4环境验证,实际使用时请注意:
1. 后台更新缓存
2. 检查分类信息权限设置
3. 移动端需同步修改对应模板
4. 大数据量时建议添加缓存机制
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |