一个文章如果将全部的内容都隐藏掉,容易实现。但是用户点进来什么都看不到,让用户还是很扫兴的,至少让用户看到大部分的内容,关键的地方如果被隐藏,有消费的冲动。
如何将文章指定的局部内容隐藏呢?
看了官方的问卷系统代码才发现有个付费标签的功能(帮助手册没有写到),就从这里入手,这里的代码如下:
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']; 其他的按自己的逻辑来调整,不要硬拷贝来使用。
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>
截图如下↓