求助 版主:官方研发技术组
问题背景我现在的业务需要涉及修改中的文件我现在想通过继承的方
类型:迅睿CMS 更新时间:2020-03-30 11:29:46



问题背景:

我现在的业务需要涉及修改,dayrui/Fcms/Core中的文件,我现在想通过继承的方式来完成修改,我该如何操作。

回帖
  • ericwolf
    #1楼    ericwolf
    2020-03-29 18:21:27
    Chrome 0
    有知道如何操作的或者官方能否给出个解决方案
  • #2楼    迅睿框架创始人
    2020-03-29 21:26:48
    Google Pixel 手机 0
    dayrui/Fcms/Core里面的文件只phpcmf.php和model.php里面的方法可以继承,其他文件不能继承
  • eric
    #3楼    eric
    2020-03-29 22:24:26
    Chrome 0
    回复迅睿框架创始人我现在的业务背景是我要启动伪静态的功能但是我的数据量非常大,用咱们系统自带的生成功能是无法实现的我需要实现的功能是在 View模板层面通过标签读取数据的时候,通过规则,修改数据中的url字段,来完成列表的url其次 在_call_show功能中也要重新变更url的值防止301重定向到原来的页面如果这样的业务背景,有没有其他的方案或者更好的方案。
  • eric
    #4楼    eric
    2020-03-29 22:26:19
    Chrome 0
    我现在的做法是破坏了系统的规则我更改了下面的代码
    public static function V() {

    if (!is_object(static::$view)) {
    static::$view = new View();
    }

    return static::$view;
    }
    我把原来系统VIew变成我的View
  • #5楼    迅睿框架创始人
    2020-03-29 22:57:12
    Google Pixel 手机 0
    没有看明白这个业务是什么逻辑,我感觉没必要改view
  • 五金冲压件
    #6楼    五金冲压件
    2020-03-30 00:48:10
    Chrome 0
    你说的这么专业,发帖子还要匿名,建议你买个授权,支持下老大的业务,不然以后咋给你维护升级。你买个授权,你开发,然后动到核心东西了,老大会给你单独挂钩的。建议你买一套SVIP。支持支持技术开发者eric
  • eric
    #7楼    eric
    2020-03-30 08:33:46
    Chrome 0
    五金冲压件我对这套系统框架是很认可的,现在由于项目还没有上线,等上线稳定运转了,一定会支持技术开发者的
  • eric
    #8楼    eric
    2020-03-30 08:41:45
    Chrome 0
    回复迅睿框架创始人感谢跟进回复问题,等项目上线,稳定一段时间,我一定会再支持一个SVIP目前的情况是这样的现在这个项目有6个模块每个模块都有百万数据,现在要启动伪静态功能,首先咱们这套框架自带的URL规则是可以实现的。通过配置URL规则,然后修改rewrite.php文件,但是这个流程是需要在修改后,通过内容维护->指定模块->更新内容URL才可以实现。我这6个模块中的前端模板中有通过 {module},{table}{mform},等咱们系统支持的模板标签进行数据的读取,我看了这些数据源都是通过核心Core/View.php 来进行解析和实现的,我想要实现的是修改一下代码
    /**
    * 查询缓存
    */
    public function _query($sql, $db, $cache, $all = TRUE)
    {

    // 缓存存在时读取缓存文件
    $cname = md5($db . $sql . dr_now_url());
    if (SYS_CACHE && $cache && $data = \Phpcmf\Service::L('cache')->get_data($cname)) {
    return $data;
    }

    $mysql = \Phpcmf\Service::M()->db;
    if ($db) {
    $mysql = \Config\Database::connect($db, false);
    }
    // 执行SQL
    $query = $mysql->query($sql);

    if (!$query) {
    return 'SQL查询解析不正确:' . $sql;
    }

    // 查询结果
    $data = $all ? $query->getResultArray() : $query->getRowArray();

    // 开启缓存时,重新存储缓存数据
    $cache && \Phpcmf\Service::L('cache')->set_data($cname, $data, $cache);

    return $data;
    }
    在这个data读取的根源部分,处理项目的伪静态规则
  • eric
    #9楼    eric
    2020-03-30 08:45:13
    Chrome 0
    回复迅睿框架创始人以下是目前改动的代码
    <?php namespace Jqx\Core;

    use Phpcmf\Service;

    class View extends \Phpcmf\View
    {

    public $_jqx_module = "";

    public function rewrite_url($url)
    {
    //TODO 此处通过调用标签所在的Module进行url的伪静态


    return $this->_jqx_module;

    }


    public function list_tag($_params)
    {

    $params = explode(' ', $_params);
    foreach ($params as $param) {
    $mapArray = explode("=", $param);
    if ($mapArray[0] == 'module') {
    $this->_jqx_module = $mapArray[1];
    break;
    }
    }

    if ($this->_jqx_module == "MOD_DIR") {
    $this->_jqx_module = MOD_DIR;
    } elseif ($this->_jqx_module == "APP_DIR") {
    $this->_jqx_module = APP_DIR;
    }

    return parent::list_tag($_params); // TODO: Change the autogenerated stub
    }


    public function _query($sql, $db, $cache, $all = TRUE)
    {
    $return_data = [];
    // 缓存存在时读取缓存文件
    $cname = md5($db . $sql . dr_now_url());
    if (SYS_CACHE && $cache && $data = \Phpcmf\Service::L('cache')->get_data($cname)) {
    $return_data = $data;
    }
    if (empty($return_data)) {
    $mysql = \Phpcmf\Service::M()->db;
    if ($db) {
    $mysql = \Config\Database::connect($db, false);
    }
    // 执行SQL
    $query = $mysql->query($sql);

    if (!$query) {
    return 'SQL查询解析不正确:' . $sql;
    }

    // 查询结果
    $data = $all ? $query->getResultArray() : $query->getRowArray();

    // 开启缓存时,重新存储缓存数据
    $cache && \Phpcmf\Service::L('cache')->set_data($cname, $data, $cache);
    $return_data = $data;
    }

    $new_return_data = [];

    if (!empty($return_data)) {

    foreach ($return_data as $k => $v) {
    if (!empty($v['url'])) {
    $v['url'] = $this->rewrite_url($v['url']);
    $new_return_data[$k] = $v;
    } else {
    $new_return_data[$k] = $v;
    }
    }
    return $new_return_data;
    }
    return $return_data;
    }


    }
    系统的:
    class Service
    /**
    * 模板视图对象实例
    *
    * @var object
    */
    public static function V() {

    if (!is_object(static::$view)) {
    static::$view = new View();//这个View,是上面的那个View
    }

    return static::$view;
    }
  • #10楼    迅睿框架创始人
    2020-03-30 08:54:55
    Chrome 0
    我觉得你走远了,思路没对,循环标签中的url你完全可以使用自定义函数来完成,比如先定义一个函数
    function rewrite_url($_jqx_module, $url)
        {
            //TODO 此处通过调用标签所在的Module进行url的伪静态
            
            return $_jqx_module;
    
        }
    然后通过module等等的循环标签调用函数就行了----------------------------------还可以使用自定义模板标签实现参考文档:《自定义模板解析标签》
    本部分内容设定了隐藏,需要楼主本人才能看到
    1
  • eric
    #11楼    eric
    2020-03-30 09:06:08
    Chrome 0
    本部分内容设定了隐藏,需要楼主本人才能看到
    感谢再次跟进回复
    
    {module module=MOD_DIR page=1 pagesize=20 urlrule=index.php?s=zixun&c=search&catid=1&page=[page] return=zixun}
    {$zixun[url]=rewrite_url(MOD_DIR,$zixun.url)}
    这个做法我已经实现了
    
    我现在想要修改的原因是,想从数据根源通过直接处理,完成url的重写解析
    
    其次还想在和您交流一下,面对独立模块千万数据的时候,如果想要完成伪静态的内容url,该如何更新
    回复迅睿框架创始人
  • #12楼    迅睿框架创始人
    2020-03-30 09:18:11
    Chrome 0
    用自定义函数效率才是最高的
    本部分内容设定了隐藏,需要楼主本人才能看到
    2
  • eric
    #13楼    eric
    2020-03-30 09:19:44
    Chrome 0
    回复迅睿框架创始人
    本部分内容设定了隐藏,需要楼主本人才能看到
    好,那就听您的建议,感谢您的回复和指导。
  • 阿赖耶识
    #14楼    阿赖耶识
    2020-03-30 09:21:10
    Chrome 0
    肯定不要改不能修改的文件,影响性能
  • 五金冲压件
    #15楼    五金冲压件
    2020-03-30 10:45:48
    Chrome 0
    这种教材性回复 为什么都不公开查看呢。不然后续有人遇到问题了,还是要重新提问多麻烦,
  • 小黄人 18html.com
    #16楼    小黄人 18html.com
    2020-03-30 11:23:45
    Chrome 0
    看着蛋疼
    image
  • 二开/定制/使用解答专家
    #17楼    二开/定制/使用解答专家
    2020-03-30 11:29:46
    Chrome 0
    好像匿名贴就是这样,哈哈小黄人 18html.com