%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/wiki/models/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/wiki/models/WikiPageRevision.php |
<?php
namespace humhub\modules\wiki\models;
use humhub\components\ActiveRecord;
use humhub\modules\user\models\User;
use humhub\modules\wiki\permissions\CreatePage;
use Yii;
/**
* This is the model class for table "wiki_page_revision".
*
* The followings are the available columns in table 'wiki_page_revision':
* @property integer $id
* @property integer $revision
* @property integer $is_latest
* @property integer $wiki_page_id
* @property integer $user_id
* @property string $content
*
* @property-read WikiPage $page
*/
class WikiPageRevision extends ActiveRecord
{
/**
* @var bool
*/
var $isCurrentlyEditing = false;
/**
* @return string the associated database table name
*/
public static function tableName()
{
return 'wiki_page_revision';
}
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return [
[['revision', 'wiki_page_id', 'user_id'], 'required'],
[['revision', 'is_latest', 'wiki_page_id', 'user_id'], 'integer'],
['content', 'safe'],
];
}
public function getAuthor()
{
return $this->hasOne(User::class, ['id' => 'user_id']);
}
public function getPage()
{
return $this->hasOne(WikiPage::class, ['id' => 'wiki_page_id']);
}
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id' => 'ID',
'revision' => 'Revision',
'is_latest' => 'Is Latest',
'wiki_page_id' => 'Wiki Page',
'user_id' => 'User',
'content' => 'Content',
);
}
/**
* @inheritdoc
*/
public function beforeSave($insert)
{
$this->is_latest = 1;
$this->createPagesFromWikiLinks();
return parent::beforeSave($insert);
}
/**
* @inheritdoc
*/
public function afterSave($insert, $changedAttributes)
{
WikiPageRevision::updateAll(['is_latest' => 0], 'wiki_page_id=:wikiPageId AND id!=:selfId', [':wikiPageId' => $this->wiki_page_id, ':selfId' => $this->id]);
try {
Yii::$app->search->update(WikiPage::findOne(['id' => $this->wiki_page_id]));
} catch (\Throwable $e) {
Yii::error($e);
}
parent::afterSave($insert, $changedAttributes);
}
/**
* Create Wiki Pages from wiki links found in the content of this Revision
*/
private function createPagesFromWikiLinks()
{
if (!$this->page->content->container->can(CreatePage::class)) {
return;
}
if (!preg_match_all('/(\[.+?\]\(wiki:)(.+?)( ".+?"\))/i', $this->content, $wikiLinks)) {
return;
}
foreach ($wikiLinks[2] as $w => $wikiTitle) {
if ($wikiPage = $this->createOrFindPageByTitle($wikiTitle)) {
$this->updateWikiLink($wikiLinks[0][$w], $wikiLinks[1][$w] . $wikiPage->id . $wikiLinks[3][$w]);
}
}
}
/**
* Create or find existing Wiki Page by title
*
* @param string $title
* @return WikiPage|null
* @throws \yii\base\Exception
*/
private function createOrFindPageByTitle(string $title): ?WikiPage
{
if (preg_match('/^\d+$/', $title) &&
WikiPage::find()->contentContainer($this->page->content->container)->where(['wiki_page.id' => $title])->exists()) {
// Exclude case when title is ID of the existing Wiki Page
return null;
}
if ($wikiPage = WikiPage::find()->contentContainer($this->page->content->container)->where(['title' => $title])->one()) {
return $wikiPage;
}
$wikiPage = new WikiPage($this->page->content->container);
$wikiPage->setScenario(WikiPage::SCENARIO_CREATE);
$wikiPage->title = $title;
$wikiPage->parent_page_id = $this->page->parent_page_id;
if (!$wikiPage->save()) {
return null;
}
$wikiPageRevision = $wikiPage->createRevision();
$wikiPageRevision->content = $title;
if (!$wikiPageRevision->save()) {
return null;
}
return $wikiPage;
}
/**
* Update Wiki Link in content
*
* @param string $wikiLinkWithTitle
* @param string $wikiLinkWithId
*/
private function updateWikiLink(string $wikiLinkWithTitle, string $wikiLinkWithId)
{
$this->content = str_replace($wikiLinkWithTitle, $wikiLinkWithId, $this->content);
}
}