如何将文章指定的局部内容隐藏

发布于 2024-11-23 23:07:43

背景

一个文章如果将全部的内容都隐藏掉,容易实现。但是用户点进来什么都看不到,让用户还是很扫兴的,至少让用户看到大部分的内容,关键的地方如果被隐藏,有消费的冲动。
如何将文章指定的局部内容隐藏呢?

改造步骤

step1: model的改造

看了官方的问卷系统代码才发现有个付费标签的功能(帮助手册没有写到),就从这里入手,这里的代码如下:

    public function getIsPaidPartOfContentAttr($value, $data)
    {        
        $pattern = '/\$\$paidbegin\$\$(.*?)\$\$paidend\$\$/is';       
        return preg_match($pattern, $value);
    }
    
    public function getContentFmtPartAttr($value, $data)
    {
        //如果内容中包含有付费标签
        $pattern = '/\$\$paidbegin\$\$(.*?)\$\$paidend\$\$/is';
        if (preg_match($pattern, $value) && !$this->getAttr('paid') && ($data['price'] > 0 || $data['score'] > 0)) {
            $money = (int)Auth::instance()->money;
            $currency = $data['price'] > 0 ? 'money' : 'score';
            $btn = "<a href='javascript:' class='btn btn-primary btn-paynow' style='color:white' data-id='{$data['id']}' data-type='article' data-price='{$data['price']}' data-score='{$data['score']}' data-currency='{$currency}' data-money='{$money}'>内容已经隐藏,点击付费后查看</a>";
            $value = preg_replace($pattern, "<div class='alert alert-warning alert-paid'>{$btn}</div>", $value);
        }
        return $value;
    }

以上是\1.2.0.20201008_full\addons\ask\model\Article.php的代码
改造如下:

    public function getIsPaidPartOfContentAttr($value, $data)
    {
        $content = $data['content_fmt']; //edit tonny 20241123:需要获取库表里的content_fmt来做判断,否则原来的$value都是空的
        $pattern = '/\$\$paidbegin\$\$(.*?)\$\$paidend\$\$/is';
       
        return preg_match($pattern, $content);
    }
    
    //add tonny 20241123:不需要付费状态的判断
    public function getContentFmtPartGradeAttr($value, $data)
    {
        $content = $data['content_fmt'];
        
        //如果内容中包含有付费标签
        $pattern = '/\$\$paidbegin\$\$(.*?)\$\$paidend\$\$/is';        
        if (preg_match($pattern, $content) ) {
            $viewGradeText = $this->getViewGradeTextAttr($value, $data);           
            $btn = '<div class="alert alert-warning alert-paid" style="font-size:13px;">                                       
                       <strong>内容已经隐藏,</strong> 会员等级为<b>'.$viewGradeText.'</b>及以上才能查看。
                    </div>';
            $value = preg_replace($pattern, $btn, $content);
        }
        return $value;
    }

以上关键在于 $content = $data['content_fmt']; 其他的按自己的逻辑来调整,不要硬拷贝来使用。

step2: 视图html的改造

html:

 <div class="question-richtext wysiwyg" itemprop="text">
    {if $__article__.can_view_this_article}
        {$__article__.content_fmt}
    {else}                                
        {if $__article__.is_paid_part_of_content}
            {$__article__.content_fmt_part_grade}
        {else /}
            {if $__article__.summary}
                <div class="question-summary">
                    {$__article__.summary}
                </div>
            {/if}

            <div class="alert alert-warning alert-paid" style="font-size:13px;">                                       
                <strong>内容已经隐藏,</strong> 会员等级为<b>{$__article__.view_grade_text}</b>及以上才能查看。
            </div>
        {/if}
       
    {/if}
</div>

step3: 文章的里要隐藏的部分使用如下的标签包起来

image.png

最终效果

截图如下↓
image.png

0 条评论

发布
问题