tt_news: 修改图片src

发布于 2024-12-17 05:36:40 字数 708 浏览 2 评论 0原文

为了能够使用延迟加载,我需要修改src tt_news 图像输出的属性如下所示:

<img src="/foo/bar/baz.png" … /> // <-- before
<img data-original="/foo/bar/baz.png" … /> // <-- after, no src!

我已经尝试过:

plugin.tt_news.displayList.content_stdWrap {
    parseFunc < lib.parseFunc_RTE
    HTMLparser = 1
    HTMLparser.keepNonMatchedTags = 1
    HTMLparser.tags.img.fixAttrib.src.unset = 1
}

但无济于事,因为

  • 有问题的图像不是通过 RTE 插入的,而是通过“正常”媒体集成插入的。
  • 在取消设置之前,这不会将 src 属性复制到 data-original

那么,除了拔头发之外,我还应该做什么呢?

In order to be able to use lazy loading, I need to modify the src attribute of tt_news' image output like so:

<img src="/foo/bar/baz.png" … /> // <-- before
<img data-original="/foo/bar/baz.png" … /> // <-- after, no src!

I have tried:

plugin.tt_news.displayList.content_stdWrap {
    parseFunc < lib.parseFunc_RTE
    HTMLparser = 1
    HTMLparser.keepNonMatchedTags = 1
    HTMLparser.tags.img.fixAttrib.src.unset = 1
}

but to no avail, since

  • The image in question is not being inserted via RTE, but the "normal" media integration.
  • That wouldn't copy the src attribute over to data-original before unsetting.

So, what should I do aside from pulling my hair out?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

扭转时空 2024-12-24 05:36:40

这无法通过打字稿解决,因为 src 属性是硬编码在 cImage 函数中:

$theValue = '<img src="' . htmlspecialchars($GLOBALS['TSFE']->absRefPrefix .
t3lib_div::rawUrlEncodeFP($info[3])) . '" width="' . $info[0] . '" height="' . $info[1] . '"' .
$this->getBorderAttr(' border="' . intval($conf['border']) . '"') .
$params .
($altParam) . ' />';

我看到修改 src 属性的唯一方法是通过用户函数。 tt_news 为用户函数提供了一个钩子,允许自定义处理图像(参见 class.tx_ttnews.php 的第 2150 行)。

示例:

插入以下拼写错误:

includeLibs.user_ttnewsImageMarkerFunc = fileadmin/templates/php/user_ttnewsImageMarkerFunc.php
plugin.tt_news.imageMarkerFunc = user_ttnewsImageMarkerFunc->ttnewsImageMarkerFunc

而文件 user_ttnewsImageMarkerFunc.php 包含:

<?php

    class user_ttnewsImageMarkerFunc {

        /**
        * Fills the image markers with data.
        *
        * @param    array        $paramArray: $markerArray and $config of the current news item in an array
        * @param    [type]        $conf: ...
        * @return    array        the processed markerArray
        */
        function ttnewsImageMarkerFunc($paramArray, $conf) {
            $markerArray = $paramArray[0];
            $lConf = $paramArray[1];
            $pObj = &$conf['parentObj'];
            $row = $pObj->local_cObj->data;

            $imageNum = isset($lConf['imageCount']) ? $lConf['imageCount'] : 1;
            $imageNum = t3lib_div::intInRange($imageNum, 0, 100);
            $theImgCode = '';
            $imgs = t3lib_div::trimExplode(',', $row['image'], 1);
            $imgsCaptions = explode(chr(10), $row['imagecaption']);
            $imgsAltTexts = explode(chr(10), $row['imagealttext']);
            $imgsTitleTexts = explode(chr(10), $row['imagetitletext']);

            reset($imgs);

            if ($pObj->config['code'] == 'SINGLE') {
                $markerArray = $this->getSingleViewImages($lConf, $imgs, $imgsCaptions, $imgsAltTexts, $imgsTitleTexts, $imageNum, $markerArray, $pObj);
            } else {

                $imageMode = (strpos($textRenderObj, 'LATEST') ? $lConf['latestImageMode'] : $lConf['listImageMode']);

                $suf = '';
                if (is_numeric(substr($lConf['image.']['file.']['maxW'], - 1))) { // 'm' or 'c' not set by TS
                    if ($imageMode) {
                        switch ($imageMode) {
                            case 'resize2max' :
                                $suf = 'm';
                                break;
                            case 'crop' :
                                $suf = 'c';
                                break;
                            case 'resize' :
                                $suf = '';
                                break;
                        }
                    }
                }

                // only insert width/height if it is not given by TS and width/height is empty
                if ($lConf['image.']['file.']['maxW'] && ! $lConf['image.']['file.']['width']) {
                    $lConf['image.']['file.']['width'] = $lConf['image.']['file.']['maxW'] . $suf;
                    unset($lConf['image.']['file.']['maxW']);
                }
                if ($lConf['image.']['file.']['maxH'] && ! $lConf['image.']['file.']['height']) {
                    $lConf['image.']['file.']['height'] = $lConf['image.']['file.']['maxH'] . $suf;
                    unset($lConf['image.']['file.']['maxH']);
                }

                $cc = 0;
                foreach ($imgs as $val) {
                    if ($cc == $imageNum)
                        break;
                    if ($val) {
                        $lConf['image.']['altText'] = $imgsAltTexts[$cc];
                        $lConf['image.']['titleText'] = $imgsTitleTexts[$cc];
                        $lConf['image.']['file'] = 'uploads/pics/' . $val;

                        $theImgCode .= str_replace('src="', 'class="lazy" data-original="', $pObj->local_cObj->IMAGE($lConf['image.'])) . $pObj->local_cObj->stdWrap($imgsCaptions[$cc], $lConf['caption_stdWrap.']);
                    }
                    $cc++;
                }

                if ($cc) {
                    $markerArray['###NEWS_IMAGE###'] = $pObj->local_cObj->wrap($theImgCode, $lConf['imageWrapIfAny']);
                } else {
                    $markerArray['###NEWS_IMAGE###'] = $pObj->local_cObj->stdWrap($markerArray['###NEWS_IMAGE###'], $lConf['image.']['noImage_stdWrap.']);
                }
            }
            if ($pObj->debugTimes) {
                $pObj->hObj->getParsetime(__METHOD__);
            }
            //        debug($markerArray, '$markerArray ('.__CLASS__.'::'.__FUNCTION__.')', __LINE__, __FILE__, 2);


            return $markerArray;
        }



        /**
        * Fills the image markers for the SINGLE view with data. Supports Optionssplit for some parameters
        *
        * @param    [type]        $lConf: ...
        * @param    [type]        $imgs: ...
        * @param    [type]        $imgsCaptions: ...
        * @param    [type]        $imgsAltTexts: ...
        * @param    [type]        $imgsTitleTexts: ...
        * @param    [type]        $imageNum: ...
        * @return    array        $markerArray: filled markerarray
        */
        function getSingleViewImages($lConf, $imgs, $imgsCaptions, $imgsAltTexts, $imgsTitleTexts, $imageNum, $markerArray, $pObj) {
            $marker = 'NEWS_IMAGE';
            $sViewSplitLConf = array();
            $tmpMarkers = array();
            $iC = count($imgs);

            // remove first img from image array in single view if the TSvar firstImageIsPreview is set
            if (($iC > 1 && $pObj->config['firstImageIsPreview']) || ($iC >= 1 && $pObj->config['forceFirstImageIsPreview'])) {
                array_shift($imgs);
                array_shift($imgsCaptions);
                array_shift($imgsAltTexts);
                array_shift($imgsTitleTexts);
                $iC--;
            }

            if ($iC > $imageNum) {
                $iC = $imageNum;
            }

            // get img array parts for single view pages
            if ($pObj->piVars[$pObj->config['singleViewPointerName']]) {

                /**
                * TODO
                * does this work with optionsplit ?
                */
                $spage = $pObj->piVars[$pObj->config['singleViewPointerName']];
                $astart = $imageNum * $spage;
                $imgs = array_slice($imgs, $astart, $imageNum);
                $imgsCaptions = array_slice($imgsCaptions, $astart, $imageNum);
                $imgsAltTexts = array_slice($imgsAltTexts, $astart, $imageNum);
                $imgsTitleTexts = array_slice($imgsTitleTexts, $astart, $imageNum);
            }

            if ($pObj->conf['enableOptionSplit']) {
                if ($lConf['imageMarkerOptionSplit']) {
                    $ostmp = explode('|*|', $lConf['imageMarkerOptionSplit']);
                    $osCount = count($ostmp);
                }
                $sViewSplitLConf = $pObj->processOptionSplit($lConf, $iC);
            }
            // reset markers for optionSplitted images
            for ($m = 1; $m <= $imageNum; $m++) {
                $markerArray['###' . $marker . '_' . $m . '###'] = '';
            }

            $cc = 0;
            foreach ($imgs as $val) {
                if ($cc == $imageNum)
                    break;
                if ($val) {
                    if (! empty($sViewSplitLConf[$cc])) {
                        $lConf = $sViewSplitLConf[$cc];
                    }

                    //                if (1) {
                    //                    $lConf['image.']['imgList.'] = '';
                    //                    $lConf['image.']['imgList'] = $val;
                    //                    $lConf['image.']['imgPath'] = 'uploads/pics/';
                    //    debug($lConf['image.'], ' ('.__CLASS__.'::'.__FUNCTION__.')', __LINE__, __FILE__, 3);
                    //
                    //                    $imgHtml = $pObj->local_cObj->IMGTEXT($lConf['image.']);
                    //
                    //                } else {
                    $lConf['image.']['altText'] = $imgsAltTexts[$cc];
                    $lConf['image.']['titleText'] = $imgsTitleTexts[$cc];
                    $lConf['image.']['file'] = 'uploads/pics/' . $val;


                    $imgHtml = str_replace('src="', 'class="lazy" data-original="', $pObj->local_cObj->IMAGE($lConf['image.'])) . $pObj->local_cObj->stdWrap($imgsCaptions[$cc], $lConf['caption_stdWrap.']);

                    //                }


                    //debug($imgHtml, '$imgHtml ('.__CLASS__.'::'.__FUNCTION__.')', __LINE__, __FILE__, 3);


                    if ($osCount) {
                        if ($iC > 1) {
                            $mName = '###' . $marker . '_' . $lConf['imageMarkerOptionSplit'] . '###';
                        } else { // fall back to the first image marker if only one image has been found
                            $mName = '###' . $marker . '_1###';
                        }
                        $tmpMarkers[$mName]['html'] .= $imgHtml;
                        $tmpMarkers[$mName]['wrap'] = $lConf['imageWrapIfAny'];
                    } else {
                        $theImgCode .= $imgHtml;
                    }
                }
                $cc++;
            }

            if ($cc) {
                if ($osCount) {
                    foreach ($tmpMarkers as $mName => $res) {
                        $markerArray[$mName] = $pObj->local_cObj->wrap($res['html'], $res['wrap']);
                    }
                } else {
                    $markerArray['###' . $marker . '###'] = $pObj->local_cObj->wrap($theImgCode, $lConf['imageWrapIfAny']);
                }
            } else {
                if ($lConf['imageMarkerOptionSplit']) {
                    $m = '_1';
                }
                $markerArray['###' . $marker . $m . '###'] = $pObj->local_cObj->stdWrap($markerArray['###' . $marker . $m . '###'], $lConf['image.']['noImage_stdWrap.']);
            }
            //        debug($sViewSplitLConf, '$sViewSplitLConf ('.__CLASS__.'::'.__FUNCTION__.')', __LINE__, __FILE__, 2);


            return $markerArray;
        }



    }

?>

大部分代码是从 class.tx_ttnews.php 复制的。重要的一行如下(在两个函数中):

str_replace('src="', 'class="lazy" data-original="', $pObj->local_cObj->IMAGE($lConf['image.']))

然后您将获得以下图像标签:

<img class="lazy" data-original="uploads/pics/myimage.jpg" width="110" height="70" border="0" alt="" />

This cannot be solved via typoscript, because the src attribute is hard coded in the cImage function:

$theValue = '<img src="' . htmlspecialchars($GLOBALS['TSFE']->absRefPrefix .
t3lib_div::rawUrlEncodeFP($info[3])) . '" width="' . $info[0] . '" height="' . $info[1] . '"' .
$this->getBorderAttr(' border="' . intval($conf['border']) . '"') .
$params .
($altParam) . ' />';

The only way I see to modify the src attribute is through a user function. tt_news provides a hook for a user function that allows the custom processing of images (see line 2150 of class.tx_ttnews.php).

Example:

Insert the following typoscript:

includeLibs.user_ttnewsImageMarkerFunc = fileadmin/templates/php/user_ttnewsImageMarkerFunc.php
plugin.tt_news.imageMarkerFunc = user_ttnewsImageMarkerFunc->ttnewsImageMarkerFunc

Whereas the file user_ttnewsImageMarkerFunc.php contains:

<?php

    class user_ttnewsImageMarkerFunc {

        /**
        * Fills the image markers with data.
        *
        * @param    array        $paramArray: $markerArray and $config of the current news item in an array
        * @param    [type]        $conf: ...
        * @return    array        the processed markerArray
        */
        function ttnewsImageMarkerFunc($paramArray, $conf) {
            $markerArray = $paramArray[0];
            $lConf = $paramArray[1];
            $pObj = &$conf['parentObj'];
            $row = $pObj->local_cObj->data;

            $imageNum = isset($lConf['imageCount']) ? $lConf['imageCount'] : 1;
            $imageNum = t3lib_div::intInRange($imageNum, 0, 100);
            $theImgCode = '';
            $imgs = t3lib_div::trimExplode(',', $row['image'], 1);
            $imgsCaptions = explode(chr(10), $row['imagecaption']);
            $imgsAltTexts = explode(chr(10), $row['imagealttext']);
            $imgsTitleTexts = explode(chr(10), $row['imagetitletext']);

            reset($imgs);

            if ($pObj->config['code'] == 'SINGLE') {
                $markerArray = $this->getSingleViewImages($lConf, $imgs, $imgsCaptions, $imgsAltTexts, $imgsTitleTexts, $imageNum, $markerArray, $pObj);
            } else {

                $imageMode = (strpos($textRenderObj, 'LATEST') ? $lConf['latestImageMode'] : $lConf['listImageMode']);

                $suf = '';
                if (is_numeric(substr($lConf['image.']['file.']['maxW'], - 1))) { // 'm' or 'c' not set by TS
                    if ($imageMode) {
                        switch ($imageMode) {
                            case 'resize2max' :
                                $suf = 'm';
                                break;
                            case 'crop' :
                                $suf = 'c';
                                break;
                            case 'resize' :
                                $suf = '';
                                break;
                        }
                    }
                }

                // only insert width/height if it is not given by TS and width/height is empty
                if ($lConf['image.']['file.']['maxW'] && ! $lConf['image.']['file.']['width']) {
                    $lConf['image.']['file.']['width'] = $lConf['image.']['file.']['maxW'] . $suf;
                    unset($lConf['image.']['file.']['maxW']);
                }
                if ($lConf['image.']['file.']['maxH'] && ! $lConf['image.']['file.']['height']) {
                    $lConf['image.']['file.']['height'] = $lConf['image.']['file.']['maxH'] . $suf;
                    unset($lConf['image.']['file.']['maxH']);
                }

                $cc = 0;
                foreach ($imgs as $val) {
                    if ($cc == $imageNum)
                        break;
                    if ($val) {
                        $lConf['image.']['altText'] = $imgsAltTexts[$cc];
                        $lConf['image.']['titleText'] = $imgsTitleTexts[$cc];
                        $lConf['image.']['file'] = 'uploads/pics/' . $val;

                        $theImgCode .= str_replace('src="', 'class="lazy" data-original="', $pObj->local_cObj->IMAGE($lConf['image.'])) . $pObj->local_cObj->stdWrap($imgsCaptions[$cc], $lConf['caption_stdWrap.']);
                    }
                    $cc++;
                }

                if ($cc) {
                    $markerArray['###NEWS_IMAGE###'] = $pObj->local_cObj->wrap($theImgCode, $lConf['imageWrapIfAny']);
                } else {
                    $markerArray['###NEWS_IMAGE###'] = $pObj->local_cObj->stdWrap($markerArray['###NEWS_IMAGE###'], $lConf['image.']['noImage_stdWrap.']);
                }
            }
            if ($pObj->debugTimes) {
                $pObj->hObj->getParsetime(__METHOD__);
            }
            //        debug($markerArray, '$markerArray ('.__CLASS__.'::'.__FUNCTION__.')', __LINE__, __FILE__, 2);


            return $markerArray;
        }



        /**
        * Fills the image markers for the SINGLE view with data. Supports Optionssplit for some parameters
        *
        * @param    [type]        $lConf: ...
        * @param    [type]        $imgs: ...
        * @param    [type]        $imgsCaptions: ...
        * @param    [type]        $imgsAltTexts: ...
        * @param    [type]        $imgsTitleTexts: ...
        * @param    [type]        $imageNum: ...
        * @return    array        $markerArray: filled markerarray
        */
        function getSingleViewImages($lConf, $imgs, $imgsCaptions, $imgsAltTexts, $imgsTitleTexts, $imageNum, $markerArray, $pObj) {
            $marker = 'NEWS_IMAGE';
            $sViewSplitLConf = array();
            $tmpMarkers = array();
            $iC = count($imgs);

            // remove first img from image array in single view if the TSvar firstImageIsPreview is set
            if (($iC > 1 && $pObj->config['firstImageIsPreview']) || ($iC >= 1 && $pObj->config['forceFirstImageIsPreview'])) {
                array_shift($imgs);
                array_shift($imgsCaptions);
                array_shift($imgsAltTexts);
                array_shift($imgsTitleTexts);
                $iC--;
            }

            if ($iC > $imageNum) {
                $iC = $imageNum;
            }

            // get img array parts for single view pages
            if ($pObj->piVars[$pObj->config['singleViewPointerName']]) {

                /**
                * TODO
                * does this work with optionsplit ?
                */
                $spage = $pObj->piVars[$pObj->config['singleViewPointerName']];
                $astart = $imageNum * $spage;
                $imgs = array_slice($imgs, $astart, $imageNum);
                $imgsCaptions = array_slice($imgsCaptions, $astart, $imageNum);
                $imgsAltTexts = array_slice($imgsAltTexts, $astart, $imageNum);
                $imgsTitleTexts = array_slice($imgsTitleTexts, $astart, $imageNum);
            }

            if ($pObj->conf['enableOptionSplit']) {
                if ($lConf['imageMarkerOptionSplit']) {
                    $ostmp = explode('|*|', $lConf['imageMarkerOptionSplit']);
                    $osCount = count($ostmp);
                }
                $sViewSplitLConf = $pObj->processOptionSplit($lConf, $iC);
            }
            // reset markers for optionSplitted images
            for ($m = 1; $m <= $imageNum; $m++) {
                $markerArray['###' . $marker . '_' . $m . '###'] = '';
            }

            $cc = 0;
            foreach ($imgs as $val) {
                if ($cc == $imageNum)
                    break;
                if ($val) {
                    if (! empty($sViewSplitLConf[$cc])) {
                        $lConf = $sViewSplitLConf[$cc];
                    }

                    //                if (1) {
                    //                    $lConf['image.']['imgList.'] = '';
                    //                    $lConf['image.']['imgList'] = $val;
                    //                    $lConf['image.']['imgPath'] = 'uploads/pics/';
                    //    debug($lConf['image.'], ' ('.__CLASS__.'::'.__FUNCTION__.')', __LINE__, __FILE__, 3);
                    //
                    //                    $imgHtml = $pObj->local_cObj->IMGTEXT($lConf['image.']);
                    //
                    //                } else {
                    $lConf['image.']['altText'] = $imgsAltTexts[$cc];
                    $lConf['image.']['titleText'] = $imgsTitleTexts[$cc];
                    $lConf['image.']['file'] = 'uploads/pics/' . $val;


                    $imgHtml = str_replace('src="', 'class="lazy" data-original="', $pObj->local_cObj->IMAGE($lConf['image.'])) . $pObj->local_cObj->stdWrap($imgsCaptions[$cc], $lConf['caption_stdWrap.']);

                    //                }


                    //debug($imgHtml, '$imgHtml ('.__CLASS__.'::'.__FUNCTION__.')', __LINE__, __FILE__, 3);


                    if ($osCount) {
                        if ($iC > 1) {
                            $mName = '###' . $marker . '_' . $lConf['imageMarkerOptionSplit'] . '###';
                        } else { // fall back to the first image marker if only one image has been found
                            $mName = '###' . $marker . '_1###';
                        }
                        $tmpMarkers[$mName]['html'] .= $imgHtml;
                        $tmpMarkers[$mName]['wrap'] = $lConf['imageWrapIfAny'];
                    } else {
                        $theImgCode .= $imgHtml;
                    }
                }
                $cc++;
            }

            if ($cc) {
                if ($osCount) {
                    foreach ($tmpMarkers as $mName => $res) {
                        $markerArray[$mName] = $pObj->local_cObj->wrap($res['html'], $res['wrap']);
                    }
                } else {
                    $markerArray['###' . $marker . '###'] = $pObj->local_cObj->wrap($theImgCode, $lConf['imageWrapIfAny']);
                }
            } else {
                if ($lConf['imageMarkerOptionSplit']) {
                    $m = '_1';
                }
                $markerArray['###' . $marker . $m . '###'] = $pObj->local_cObj->stdWrap($markerArray['###' . $marker . $m . '###'], $lConf['image.']['noImage_stdWrap.']);
            }
            //        debug($sViewSplitLConf, '$sViewSplitLConf ('.__CLASS__.'::'.__FUNCTION__.')', __LINE__, __FILE__, 2);


            return $markerArray;
        }



    }

?>

Most of this code is copied from class.tx_ttnews.php. The important line is the following (in each of the two functions):

str_replace('src="', 'class="lazy" data-original="', $pObj->local_cObj->IMAGE($lConf['image.']))

Then you'll get the following image tags:

<img class="lazy" data-original="uploads/pics/myimage.jpg" width="110" height="70" border="0" alt="" />
音栖息无 2024-12-24 05:36:40

2019年tt_news依然存在。我将它与 TYPO3 8 LTS 一起使用,该版本来自 github 因为它不再出现在官方扩展存储库中。 (对于新项目使用“新闻”)

所以我认为,因为 tt_news 必须在 TYPO3 9 中更新,所以直接破解代码是合法的,通过更改 tt_news/Classes/Plugin/TtNews.php 如下:

--- a/Classes/Plugin/TtNews.php
+++ b/Classes/Plugin/TtNews.php
@@ -2621,6 +2621,7 @@ class TtNews extends AbstractPlugin
                     $markerArray['###NEWS_IMAGE###'] = $this->local_cObj->stdWrap($markerArray['###NEWS_IMAGE###'],
                         $lConf['image.']['noImage_stdWrap.']);
                 }
+                $markerArray['###NEWS_IMAGE###'] = $this->LazyLoading($markerArray['###NEWS_IMAGE###']);
             }
         }

@@ -2632,6 +2633,13 @@ class TtNews extends AbstractPlugin
     }


+   function LazyLoading($html){
+           $html = str_replace('src="', 'class="lazy" data-original="', $html);
+           return $html;
+   }
+
+
     /**
      * Fills the image markers for the SINGLE view with data. Supports Optionssplit for some parameters
      *

In 2019 tt_news is still around. I use it with TYPO3 8 LTS, the version from github as its not anymore in the official extension repository. (For new Projects use "news")

So I think, because tt_news has to be updated in TYPO3 9, its legit to just hack the code directly, by changing tt_news/Classes/Plugin/TtNews.php like this:

--- a/Classes/Plugin/TtNews.php
+++ b/Classes/Plugin/TtNews.php
@@ -2621,6 +2621,7 @@ class TtNews extends AbstractPlugin
                     $markerArray['###NEWS_IMAGE###'] = $this->local_cObj->stdWrap($markerArray['###NEWS_IMAGE###'],
                         $lConf['image.']['noImage_stdWrap.']);
                 }
+                $markerArray['###NEWS_IMAGE###'] = $this->LazyLoading($markerArray['###NEWS_IMAGE###']);
             }
         }

@@ -2632,6 +2633,13 @@ class TtNews extends AbstractPlugin
     }


+   function LazyLoading($html){
+           $html = str_replace('src="', 'class="lazy" data-original="', $html);
+           return $html;
+   }
+
+
     /**
      * Fills the image markers for the SINGLE view with data. Supports Optionssplit for some parameters
      *
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文