%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/models/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/user/models/Mentioning.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2015 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\modules\user\models; use humhub\components\ActiveRecord; use humhub\modules\content\components\ContentActiveRecord; use humhub\modules\content\components\ContentAddonActiveRecord; use humhub\modules\user\notifications\Mentioned; use yii\base\Exception; use yii\base\InvalidArgumentException; /** * This is the model class for table "user_mentioning". * The followings are the available columns in table 'user_mentioning': * * @property integer $id * @property string $object_model * @property integer $object_id * @property integer $user_id */ class Mentioning extends ActiveRecord { /** * @inheritdoc */ public static function tableName() { return 'user_mentioning'; } /** * @inheritdoc */ public function behaviors() { return [ [ 'class' => \humhub\components\behaviors\PolymorphicRelation::class, 'mustBeInstanceOf' => [ContentActiveRecord::class, ContentAddonActiveRecord::class], ], ]; } /** * @inheritdoc */ public function rules() { return [ [['object_model', 'object_id', 'user_id'], 'required'], [['object_id', 'user_id'], 'integer'], [['object_model'], 'string', 'max' => 100], ]; } /** * @inheritdoc */ public function afterSave($insert, $changedAttributes) { $mentionedSource = $this->getPolymorphicRelation(); $originator = $this->getOriginatorBySource($mentionedSource); if (!$originator) { throw new Exception("Invalid polymorphic relation for Mentioning!"); } // Send Notification Mentioned::instance()->from($originator)->about($mentionedSource)->send($this->user); return parent::afterSave($insert, $changedAttributes); } /** * @param $source * @return User|null */ private function getOriginatorBySource($source) { if ($source instanceof ContentActiveRecord) { /** @var ContentActiveRecord $source */ return $source->content->createdBy; } elseif ($source instanceof ContentAddonActiveRecord) { /** @var ContentAddonActiveRecord $source */ return $source->user; } return null; } /** * Parses a given text for mentioned users and creates an mentioning for them. * * @param ContentActiveRecord|ContentAddonActiveRecord $record * @param string $text * * @return User[] Mentioned users * @throws Exception * @deprecated since 1.3 use [[\humhub\modules\content\widgets\richtext\RichText::processText()]] instead */ public static function parse($record, $text) { $result = []; if ($record instanceof ContentActiveRecord || $record instanceof ContentAddonActiveRecord) { preg_replace_callback('@\@\-u([\w\-]*?)($|\s|\.)@', function ($hit) use (&$record, &$result) { $result = array_merge($result, static::mention($hit[1], $record)); }, $text); } else { throw new Exception("Mentioning can only used in HActiveRecordContent or HActiveRecordContentAddon objects!"); } return $result; } /** * Creates the mentioning for the given `$guids`. * This function will skip `$guids` which are already mentioned in the given `$record`. * * @param string|string[] $guids * @param ContentActiveRecord|ContentAddonActiveRecord $record * @return array new mentionings for the given $record * @throws InvalidArgumentException if an invalid $record is provided * @since 1.3 */ public static function mention($guids, $record) { if (!($record instanceof ContentActiveRecord || $record instanceof ContentAddonActiveRecord)) { throw new InvalidArgumentException("Mentioning can only used in HActiveRecordContent or HActiveRecordContentAddon objects!"); } if(is_string($guids)) { $guids = [$guids]; } $result = []; foreach ($guids as $guid) { $user = User::findOne(['guid' => $guid]); if(!$user) { continue; } // Check the user was already mentioned (e.g. edit) $mention = static::findOne([ 'object_model' => get_class($record), 'object_id' => $record->getPrimaryKey(), 'user_id' => $user->id, ]); if (!$mention) { $mention = new static(['user_id' => $user->id]); $mention->setPolymorphicRelation($record); $mention->save(); $result[] = $user; // Mentioned users automatically follows the content $record->content->getPolymorphicRelation()->follow($user->id); } } return $result; } /** * Related user * * @return \yii\db\ActiveQuery */ public function getUser() { return $this->hasOne(\humhub\modules\user\models\User::class, ['id' => 'user_id']); } }