EReadMore ¶
A simple extension to shorten an html code.
- version 1.0
- author Dimitrios Mengidis tydeas.dr@gmail.com
Requirements ¶
Description ¶
This a common functionality found in blogs, where you see a part of an article and there is link usually named read more where get redirected to the full article. As an example you can check my blog.
Use ¶
Simple case ¶
In the view add:
<?php $this->beginWidget('application.extensions.EReadMore.EReadMore', array(
'linkUrl'=>$data->url
));?>
<div>
<h1>EReadMore</h1>
<p>A simple extension to shorten an html code.</p>
<h2>Requirements</h2>
<ul>
<li><a href='php.net/manual/en/intro.dom.php' >DOMDocument</a></li>
</ul>
</div>
<?php $this->endWidget(); ?>
Advanced use ¶
Check the EReadMore code options to see what you can set.
Utf characters
After a few more tests i found out that this is actually working.
$this->beginWidget('application.extensions.ereadmore.EReadMore', array('linkUrl'=>$data->url)); echo $data->content; $this->endWidget();
but the utf characters are not properly shown. Any ideas?
Utf problem
For this to work for a certain number of chars I'm using this, but still can't work around utf, any ideas?
if (strlen($data->content)<500) { echo $data->content; } else if (strlen($data->content)>500) { $this->beginWidget('application.extensions.ereadmore.EReadMore', array('linkUrl'=>$data->url)); echo $data->content; $this->endWidget(); } else { echo $data->content; } //echo $data->content; $this->endWidget();
workaround
I manage to use this the "old fashion" way by using this code instead
$string = $data->content; if(mb_strlen($string, 'utf-8') >= 700){ $string = mb_substr($string, 0, 700 - 5, 'utf-8')." ".CHtml::link(CHtml::encode("read more..."), $data->url); } echo $string;
utf works ok and there's no need to use extensions. But still there's the problem with the cuts inside some tags like "ul". But it works.
read more..
for urgent solution to meet my need I make a read more with very simple php code strip_tags and substr
$desc = strip_tags(substr($data->description, 0, 200))."...."; echo $desc; echo CHtml::link('read more', array('view', 'id'=>$data->id),array('class'=>'btn btn-success btn-small'));
demo : www (dot) lowongankerja (dot) dewatatech (dot) com
Fixed version of EReadMore
I found several problems in this widget, but it is no longer maintained unfortunately. I have hacked a couple of hours to solve several issues as follows.
1.DOCTYPE issue
There is the same discussion on the forum, I copied the idea to the following function.
function fragmentHtml($html) { return preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $html)); }
How to use is as follows.
$this->short = $this->fragmentHtml($shortdom->saveHTML());
2.UTF-8 issue
It does not handle UTF-8 based text well. There also is a solution on the forum as follows.
$this->doc->loadHTML("<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"></head>".$html);
3.Chopping the last of the sentence
I prefer to separate the sentence at the end. Then I implemented the idea of the separator as follows. This can be more generic as the separator is hard coded, sorry. And we will remove this tag at last.
public function run() { $html=str_replace('。', '。<hr class="period">', ob_get_clean());
4.Counting character numbers
If the number of the characters exceeds the maximum, then the widget will produce the link of readmore.
$newnode = $shortdom->importNode($node, true); $count += strlen($newnode->textContent); if ($count < $this->maxChar) { $shortdom->documentElement->appendChild($newnode); } else { $overFlag = true; break; }
5.Removing specific <hr> and more
We have to remove inserted <hr> and <p></p> that is inserted by the system.
function fragmentHtml($html) { return preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>', '<hr class="period">'), array('', '', '', '', ''), $html)); }
$this->doc->loadHTML("<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"></head><hr class=\"period\">".$html);
After those modification, the widget is working perfectly. Thanks go to the author for the great idea of using DOMDocument. Hope this helps.
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.