/** * @inheritdoc */ public function init() { parent::init(); $friendshipEnabled = Yii::$app->getModule('friendship')->getIsEnabled(); if ($this->user == null) { /** * For guests collect all wall_ids of "guest" public spaces / user profiles. * Generally show only public content */ $publicSpacesSql = (new \yii\db\Query())->select(["si.wall_id"])->from('space si')->where('si.visibility=' . \humhub\modules\space\models\Space::VISIBILITY_ALL); $union = Yii::$app->db->getQueryBuilder()->build($publicSpacesSql)[0]; $publicProfilesSql = (new \yii\db\Query())->select("pi.wall_id")->from('user pi')->where('pi.status=1 AND pi.visibility = ' . \humhub\modules\user\models\User::VISIBILITY_ALL); $union .= " UNION " . Yii::$app->db->getQueryBuilder()->build($publicProfilesSql)[0]; $this->activeQuery->andWhere('wall_entry.wall_id IN (' . $union . ')'); $this->activeQuery->andWhere(['content.visibility' => \humhub\modules\content\models\Content::VISIBILITY_PUBLIC]); } else { /** * Collect all wall_ids we need to include into dashboard stream */ // User to user follows $userFollow = (new \yii\db\Query())->select(["uf.wall_id"])->from('user_follow')->leftJoin('user uf', 'uf.id=user_follow.object_id AND user_follow.object_model=:userClass')->where('user_follow.user_id=' . $this->user->id . ' AND uf.wall_id IS NOT NULL'); $union = Yii::$app->db->getQueryBuilder()->build($userFollow)[0]; // User to space follows $spaceFollow = (new \yii\db\Query())->select("sf.wall_id")->from('user_follow')->leftJoin('space sf', 'sf.id=user_follow.object_id AND user_follow.object_model=:spaceClass')->where('user_follow.user_id=' . $this->user->id . ' AND sf.wall_id IS NOT NULL'); $union .= " UNION " . Yii::$app->db->getQueryBuilder()->build($spaceFollow)[0]; // User to space memberships $spaceMemberships = (new \yii\db\Query())->select("sm.wall_id")->from('space_membership')->leftJoin('space sm', 'sm.id=space_membership.space_id')->where('space_membership.user_id=' . $this->user->id . ' AND sm.wall_id IS NOT NULL AND space_membership.show_at_dashboard = 1'); $union .= " UNION " . Yii::$app->db->getQueryBuilder()->build($spaceMemberships)[0]; if ($friendshipEnabled) { // User to user follows $usersFriends = (new \yii\db\Query())->select(["ufr.wall_id"])->from('user ufr')->leftJoin('user_friendship recv', 'ufr.id=recv.friend_user_id AND recv.user_id=' . (int) $this->user->id)->leftJoin('user_friendship snd', 'ufr.id=snd.user_id AND snd.friend_user_id=' . (int) $this->user->id)->where('recv.id IS NOT NULL AND snd.id IS NOT NULL AND ufr.wall_id IS NOT NULL'); $union .= " UNION " . Yii::$app->db->getQueryBuilder()->build($usersFriends)[0]; } // Glue together also with current users wall $wallIdsSql = (new \yii\db\Query())->select('wall_id')->from('user uw')->where('uw.id=' . $this->user->id); $union .= " UNION " . Yii::$app->db->getQueryBuilder()->build($wallIdsSql)[0]; // Manual Union (https://github.com/yiisoft/yii2/issues/7992) // Double union query - to avoid MySQL performance problems $this->activeQuery->andWhere('wall_entry.wall_id IN (select subselect.wall_id from (' . $union . ') subselect)', [':spaceClass' => \humhub\modules\space\models\Space::className(), ':userClass' => \humhub\modules\user\models\User::className()]); /** * Begin visibility checks regarding the content container */ $this->activeQuery->leftJoin('wall', 'wall_entry.wall_id=wall.id'); $this->activeQuery->leftJoin('space_membership', 'wall.object_id=space_membership.space_id AND space_membership.user_id=:userId AND space_membership.status=:status', ['userId' => $this->user->id, ':status' => \humhub\modules\space\models\Membership::STATUS_MEMBER]); if ($friendshipEnabled) { $this->activeQuery->leftJoin('user_friendship', 'wall.object_id=user_friendship.user_id AND user_friendship.friend_user_id=:userId', ['userId' => $this->user->id]); } $condition = ' (wall.object_model=:userModel AND content.visibility=0 AND content.created_by = :userId) OR '; if ($friendshipEnabled) { // In case of friendship we can also display private content $condition .= ' (wall.object_model=:userModel AND content.visibility=0 AND user_friendship.id IS NOT NULL) OR '; } // In case of an space entry, we need to join the space membership to verify the user can see private space content $condition .= ' (wall.object_model=:spaceModel AND content.visibility = 0 AND space_membership.status = ' . \humhub\modules\space\models\Membership::STATUS_MEMBER . ') OR '; $condition .= ' (content.visibility = 1 OR content.visibility IS NULL) '; $this->activeQuery->andWhere($condition, [':userId' => $this->user->id, ':spaceModel' => \humhub\modules\space\models\Space::className(), ':userModel' => \humhub\modules\user\models\User::className()]); } }
/** * @inheritdoc */ public function run() { $friendshipsEnabled = Yii::$app->getModule('friendship')->getIsEnabled(); $countFriends = 0; if ($friendshipsEnabled) { $countFriends = Friendship::getFriendsQuery($this->user)->count(); } $countFollowing = $this->user->getFollowingCount(User::className()) + $this->user->getFollowingCount(Space::className()); $countUserSpaces = Membership::getUserSpaceQuery($this->user)->andWhere(['!=', 'space.visibility', Space::VISIBILITY_NONE])->andWhere(['space.status' => Space::STATUS_ENABLED])->count(); return $this->render('profileHeader', array('user' => $this->user, 'isProfileOwner' => $this->isProfileOwner, 'friendshipsEnabled' => $friendshipsEnabled, 'countFriends' => $countFriends, 'countFollowers' => $this->user->getFollowerCount(), 'countFollowing' => $countFollowing, 'countSpaces' => $countUserSpaces)); }
/** * Space Section of directory * * Provides a list of all visible spaces. * * @todo Dont pass lucene hits to view, build user array inside of action */ public function actionSpaces() { $keyword = Yii::$app->request->get('keyword', ""); $page = (int) Yii::$app->request->get('page', 1); $searchResultSet = Yii::$app->search->find($keyword, ['model' => \humhub\modules\space\models\Space::className(), 'page' => $page, 'sortField' => $keyword == '' ? 'title' : null, 'pageSize' => Setting::Get('paginationSize')]); $pagination = new \yii\data\Pagination(['totalCount' => $searchResultSet->total, 'pageSize' => $searchResultSet->pageSize]); \yii\base\Event::on(Sidebar::className(), Sidebar::EVENT_INIT, function ($event) { $event->sender->addWidget(\humhub\modules\directory\widgets\NewSpaces::className(), [], ['sortOrder' => 10]); $event->sender->addWidget(\humhub\modules\directory\widgets\SpaceStatistics::className(), [], ['sortOrder' => 20]); }); return $this->render('spaces', array('keyword' => $keyword, 'spaces' => $searchResultSet->getResultInstances(), 'pagination' => $pagination)); }
/** * Collects a list of all modules which are available for this space * * @return array */ public function getAvailableModules() { if ($this->_availableModules !== null) { return $this->_availableModules; } $this->_availableModules = array(); foreach (Yii::$app->moduleManager->getModules() as $moduleId => $module) { if ($module instanceof ContentContainerModule && Yii::$app->hasModule($module->id) && $module->hasContentContainerType(Space::className())) { $this->_availableModules[$module->id] = $module; } } return $this->_availableModules; }
public function up() { $this->renameClass('Activity', Activity::className()); // Space Created Activity - object_model/object_id (source fix) $activities = (new \yii\db\Query())->select("activity.*, content.space_id")->from('activity')->leftJoin('content', 'content.object_model=:activityModel AND content.object_id=activity.id', [':activityModel' => Activity::className()])->where(['class' => 'humhub\\modules\\space\\activities\\Created', 'activity.object_model' => ''])->all(); foreach ($activities as $activity) { $this->updateSilent('activity', ['object_model' => Space::className(), 'object_id' => $activity['space_id']], ['id' => $activity['id']]); } // Space Member added Activity - object_model/object_id (source fix) $activities = (new \yii\db\Query())->select("activity.*, content.space_id")->from('activity')->leftJoin('content', 'content.object_model=:activityModel AND content.object_id=activity.id', [':activityModel' => Activity::className()])->where(['class' => 'humhub\\modules\\space\\activities\\MemberAdded', 'activity.object_model' => ''])->all(); foreach ($activities as $activity) { $this->updateSilent('activity', ['object_model' => Space::className(), 'object_id' => $activity['space_id']], ['id' => $activity['id']]); } // Space Member removed Activity - object_model/object_id (source fix) $activities = (new \yii\db\Query())->select("activity.*, content.space_id")->from('activity')->leftJoin('content', 'content.object_model=:activityModel AND content.object_id=activity.id', [':activityModel' => Activity::className()])->where(['class' => 'humhub\\modules\\space\\activities\\MemberRemoved', 'activity.object_model' => ''])->all(); foreach ($activities as $activity) { $this->updateSilent('activity', ['object_model' => Space::className(), 'object_id' => $activity['space_id']], ['id' => $activity['id']]); } }
/** * Returns a workspace list by json * * It can be filtered by by keyword. */ public function actionSearchJson() { \Yii::$app->response->format = 'json'; $keyword = Yii::$app->request->get('keyword', ""); $page = (int) Yii::$app->request->get('page', 1); $limit = (int) Yii::$app->request->get('limit', \humhub\models\Setting::Get('paginationSize')); $searchResultSet = Yii::$app->search->find($keyword, ['model' => \humhub\modules\space\models\Space::className(), 'page' => $page, 'pageSize' => $limit]); $json = array(); foreach ($searchResultSet->getResultInstances() as $space) { $spaceInfo = array(); $spaceInfo['guid'] = $space->guid; $spaceInfo['title'] = Html::encode($space->name); $spaceInfo['tags'] = Html::encode($space->tags); $spaceInfo['image'] = Image::widget(['space' => $space, 'width' => 24]); $spaceInfo['link'] = $space->getUrl(); $json[] = $spaceInfo; } return $json; }
public function up() { // Add contentcontainer_id to content table $this->addColumn('content', 'contentcontainer_id', $this->integer()); // Set content container for space content $this->update('content', ['contentcontainer_id' => new Expression('(SELECT id FROM contentcontainer WHERE class=:spaceModel AND pk=space_id)', [':spaceModel' => \humhub\modules\space\models\Space::className()])], ['IS NOT', 'space_id', new Expression('NULL')]); // Set content container for user content $this->update('content', ['contentcontainer_id' => new Expression('(SELECT id FROM contentcontainer WHERE class=:userModel AND pk=user_id)', [':userModel' => \humhub\modules\user\models\User::className()])], ['IS', 'space_id', new Expression('NULL')]); // Ensure created_by is set to user_id $this->update('content', ['created_by' => new Expression('user_id')]); // Ensure updated_by is set $this->update('content', ['updated_by' => new Expression('created_by')], ['IS', 'updated_by', new Expression('NULL')]); // Make sure fk dont fail Yii::$app->db->createCommand('UPDATE content LEFT JOIN user ON content.updated_by = user.id SET content.updated_by = NULL WHERE user.id IS NULL')->execute(); Yii::$app->db->createCommand('UPDATE content LEFT JOIN user ON content.created_by = user.id SET content.created_by = NULL WHERE user.id IS NULL')->execute(); // Add FKs $this->addForeignKey('fk-contentcontainer', 'content', 'contentcontainer_id', 'contentcontainer', 'id', 'SET NULL'); $this->addForeignKey('fk-create-user', 'content', 'created_by', 'user', 'id', 'SET NULL'); $this->addForeignKey('fk-update-user', 'content', 'updated_by', 'user', 'id', 'SET NULL'); $this->dropColumn('content', 'space_id'); $this->dropColumn('content', 'user_id'); }
<div class="pull-left entry"> <span class="count"><?php echo $user->getFollowerCount(); ?> </span></a> <br> <span class="title"><?php echo Yii::t('UserModule.widgets_views_profileHeader', 'Followers'); ?> </span> </div> <div class="pull-left entry"> <span class="count"><?php echo $user->getFollowingCount(User::className()) + $user->getFollowingCount(Space::className()); ?> </span> <br> <span class="title"><?php echo Yii::t('UserModule.widgets_views_profileHeader', 'Following'); ?> </span> </div> <div class="pull-left entry"> <span class="count"><?php echo count($user->spaces); ?> </span><br> <span class="title"><?php
public function getSpace() { return $this->hasOne(\humhub\modules\space\models\Space::className(), ['id' => 'space_id']); }
public function validateVisibility() { if ($this->object_model == Activity::className() || $this->getPolymorphicRelation()->className() == Activity::className()) { return; } if ($this->container->className() == Space::className()) { if (!$this->container->canShare() && $this->visibility) { $this->addError('visibility', Yii::t('base', 'You cannot create public visible content!')); } } }
/** * Creates the given ContentActiveRecord based on given submitted form information. * * - Automatically assigns ContentContainer * - Access Check * - User Notification / File Uploads * - Reloads Wall after successfull creation or returns error json * * [See guide section](guide:dev-module-stream.md#CreateContentForm) * * @param ContentActiveRecord $record * @return string json */ public static function create(ContentActiveRecord $record) { Yii::$app->response->format = 'json'; // Set Content Container $contentContainer = null; $containerClass = Yii::$app->request->post('containerClass'); $containerGuid = Yii::$app->request->post('containerGuid', ""); if ($containerClass === User::className()) { $contentContainer = User::findOne(['guid' => $containerGuid]); $record->content->visibility = 1; } elseif ($containerClass === Space::className()) { $contentContainer = Space::findOne(['guid' => $containerGuid]); $record->content->visibility = Yii::$app->request->post('visibility'); } $record->content->container = $contentContainer; // Handle Notify User Features of ContentFormWidget // ToDo: Check permissions of user guids $userGuids = Yii::$app->request->post('notifyUserInput'); if ($userGuids != "") { foreach (explode(",", $userGuids) as $guid) { $user = User::findOne(['guid' => trim($guid)]); if ($user) { $record->content->notifyUsersOfNewContent[] = $user; } } } // Store List of attached Files to add them after Save $record->content->attachFileGuidsAfterSave = Yii::$app->request->post('fileList'); if ($record->validate() && $record->save()) { return array('wallEntryId' => $record->content->getFirstWallEntryId()); } return array('errors' => $record->getErrors()); }
public function getSpace() { return $this->hasOne(Space::className(), ['id' => 'space_id']); }
public function up() { $this->renameClass('Space', Space::className()); }
$form = humhub\compat\CActiveForm::begin(); ?> <div class="modal-body"> <p> <?php echo Yii::t('AdminModule.views_module_setAsDefault', 'Here you can choose whether or not a module should be automatically activated on a space or user profile. If the module should be activated, choose "always activated".'); ?> </p> <br/> <div class="row"> <?php if ($module->hasContentContainerType(Space::className())) { ?> <div class="col-md-6"> <label for=""><?php echo Yii::t('AdminModule.views_module_setAsDefault', 'Spaces'); ?> </label> <div class="radio"> <label> <?php echo $form->radioButton($model, 'spaceDefaultState', array('value' => 0, 'uncheckValue' => null, 'id' => 'radioSpaceDeactivated', 'checked' => $model->spaceDefaultState == 0)); ?> <?php echo Yii::t('AdminModule.views_module_setAsDefault', 'Deactivated'); ?>
/** * @inheritdoc */ public function getContentContainerTypes() { return [Space::className(), User::className()]; }
protected function getTotals($keyword, $options) { $totals = array(); // Unset unnecessary search options unset($options['model']); unset($options['type']); unset($options['page']); unset($options['pageSize']); $searchResultSetCount = Yii::$app->search->find($keyword, array_merge($options, ['model' => User::className()])); $totals[self::SCOPE_USER] = $searchResultSetCount->total; $searchResultSetCount = Yii::$app->search->find($keyword, array_merge($options, ['model' => Space::className()])); $totals[self::SCOPE_SPACE] = $searchResultSetCount->total; $searchResultSetCount = Yii::$app->search->find($keyword, array_merge($options, ['type' => \humhub\modules\search\engine\Search::DOCUMENT_TYPE_CONTENT])); $totals[self::SCOPE_CONTENT] = $searchResultSetCount->total; $totals[self::SCOPE_ALL] = $totals[self::SCOPE_CONTENT] + $totals[self::SCOPE_SPACE] + $totals[self::SCOPE_USER]; return $totals; }
/** * Modal to list followers of a space */ public function actionFollowerList() { $query = User::find(); $query->leftJoin('user_follow', 'user.id=user_follow.user_id and object_model=:userClass and user_follow.object_id=:spaceId', [':userClass' => Space::className(), ':spaceId' => $this->getSpace()->id]); $query->orderBy(['user_follow.id' => SORT_DESC]); $query->andWhere(['IS NOT', 'user_follow.id', new \yii\db\Expression('NULL')]); $query->active(); $title = Yii::t('SpaceModule.base', '<strong>Space</strong> followers'); return $this->renderAjaxContent(UserListBox::widget(['query' => $query, 'title' => $title])); }
/** * Sets default enabled/disabled on User or/and Space Modules * * @throws CHttpException */ public function actionSetAsDefault() { $moduleId = Yii::$app->request->get('moduleId'); $module = Yii::$app->moduleManager->getModule($moduleId); if ($module == null) { throw new HttpException(500, Yii::t('AdminModule.controllers_ModuleController', 'Could not find requested module!')); } if (!$module instanceof ContentContainerModule) { throw new HttpException(500, 'Invalid module type!'); } $model = new \humhub\modules\admin\models\forms\ModuleSetAsDefaultForm(); $spaceDefaultModule = null; if ($module->hasContentContainerType(Space::className())) { $spaceDefaultModule = \humhub\modules\space\models\Module::findOne(['space_id' => 0, 'module_id' => $moduleId]); if ($spaceDefaultModule === null) { $spaceDefaultModule = new \humhub\modules\space\models\Module(); $spaceDefaultModule->module_id = $moduleId; $spaceDefaultModule->space_id = 0; $spaceDefaultModule->state = \humhub\modules\space\models\Module::STATE_DISABLED; } $model->spaceDefaultState = $spaceDefaultModule->state; } $userDefaultModule = null; if ($module->hasContentContainerType(User::className())) { $userDefaultModule = \humhub\modules\user\models\Module::findOne(['user_id' => 0, 'module_id' => $moduleId]); if ($userDefaultModule === null) { $userDefaultModule = new \humhub\modules\user\models\Module(); $userDefaultModule->module_id = $moduleId; $userDefaultModule->user_id = 0; $userDefaultModule->state = \humhub\modules\user\models\Module::STATE_DISABLED; } $model->userDefaultState = $userDefaultModule->state; } if ($model->load(Yii::$app->request->post()) && $model->validate()) { if ($module->hasContentContainerType(Space::className())) { $spaceDefaultModule->state = $model->spaceDefaultState; $spaceDefaultModule->save(); } if ($module->hasContentContainerType(User::className())) { $userDefaultModule->state = $model->userDefaultState; $userDefaultModule->save(); } return $this->renderModalClose(); } return $this->renderAjax('setAsDefault', array('module' => $module, 'model' => $model)); }
/** * Finds user related content. * All available scopes: ActiveQueryContent::USER_RELATED_SCOPE_* * * @param array $scopes * @param User $user * @return \humhub\modules\content\components\ActiveQueryContent */ public function userRelated($scopes = array(), $user = null) { if ($user === null) { $user = Yii::$app->user->getIdentity(); } $this->joinWith(['content', 'content.contentContainer']); $conditions = []; $params = []; if (in_array(self::USER_RELATED_SCOPE_OWN_PROFILE, $scopes)) { $conditions[] = 'contentcontainer.pk=:userId AND class=:userClass'; $params[':userId'] = $user->id; $params[':userClass'] = $user->className(); } if (in_array(self::USER_RELATED_SCOPE_SPACES, $scopes)) { $spaceMemberships = (new \yii\db\Query())->select("sm.id")->from('space_membership')->leftJoin('space sm', 'sm.id=space_membership.space_id')->where('space_membership.user_id=:userId AND space_membership.status=' . \humhub\modules\space\models\Membership::STATUS_MEMBER); $conditions[] = 'contentcontainer.pk IN (' . Yii::$app->db->getQueryBuilder()->build($spaceMemberships)[0] . ') AND contentcontainer.class = :spaceClass'; $params[':userId'] = $user->id; $params[':spaceClass'] = Space::className(); } if (in_array(self::USER_RELATED_SCOPE_OWN, $scopes)) { $conditions[] = 'content.created_by = :userId'; $params[':userId'] = $user->id; } if (in_array(self::USER_RELATED_SCOPE_FOLLOWED_SPACES, $scopes)) { $spaceFollow = (new \yii\db\Query())->select("sf.id")->from('user_follow')->leftJoin('space sf', 'sf.id=user_follow.object_id AND user_follow.object_model=:spaceClass')->where('user_follow.user_id=:userId AND sf.wall_id IS NOT NULL'); $conditions[] = 'contentcontainer.pk IN (' . Yii::$app->db->getQueryBuilder()->build($spaceFollow)[0] . ') AND contentcontainer.class = :spaceClass'; $params[':spaceClass'] = Space::className(); $params[':userId'] = $user->id; } if (in_array(self::USER_RELATED_SCOPE_FOLLOWED_USERS, $scopes)) { $userFollow = (new \yii\db\Query())->select(["uf.id"])->from('user_follow')->leftJoin('user uf', 'uf.id=user_follow.object_id AND user_follow.object_model=:userClass')->where('user_follow.user_id=:userId AND uf.wall_id IS NOT NULL'); $conditions[] = 'contentcontainer.pk IN (' . Yii::$app->db->getQueryBuilder()->build($userFollow)[0] . ' AND contentcontainer.class=:userClass)'; $params[':userClass'] = User::className(); $params[':userId'] = $user->id; } if (count($conditions) != 0) { $this->andWhere("(" . join(') OR (', $conditions) . ")", $params); } else { // No results, when no selector given $this->andWhere('1=2'); } return $this; }
protected function buildQuery($keyword, $options) { // Allow *Token* \ZendSearch\Lucene\Search\Query\Wildcard::setMinPrefixLength(0); $query = new \ZendSearch\Lucene\Search\Query\Boolean(); foreach (explode(" ", $keyword) as $k) { // Require at least 3 non-wildcard characters if (strlen($k) > 2) { $term = new \ZendSearch\Lucene\Index\Term("*" . $k . "*"); $query->addSubquery(new \ZendSearch\Lucene\Search\Query\Wildcard($term), true); } } // Add model filter if (isset($options['model']) && $options['model'] != "") { if (is_array($options['model'])) { $boolQuery = new \ZendSearch\Lucene\Search\Query\MultiTerm(); foreach ($options['model'] as $model) { $boolQuery->addTerm(new \ZendSearch\Lucene\Index\Term($model, 'model')); } $query->addSubquery($boolQuery, true); } else { $term = new \ZendSearch\Lucene\Index\Term($options['model'], 'model'); $query->addSubquery(new \ZendSearch\Lucene\Search\Query\Term($term), true); } } // Add type filter if (isset($options['type']) && $options['type'] != "") { if (is_array($options['type'])) { $boolQuery = new \ZendSearch\Lucene\Search\Query\MultiTerm(); foreach ($options['type'] as $model) { $boolQuery->addTerm(new \ZendSearch\Lucene\Index\Term($type), 'type'); } $query->addSubquery($boolQuery, true); } else { $term = new \ZendSearch\Lucene\Index\Term($options['type'], 'type'); $query->addSubquery(new \ZendSearch\Lucene\Search\Query\Term($term), true); } } // Add custom filters if (isset($options['filters']) && is_array($options['filters'])) { foreach ($options['filters'] as $field => $value) { $term = new \ZendSearch\Lucene\Index\Term($value, $field); $query->addSubquery(new \ZendSearch\Lucene\Search\Query\Term($term), true); } } if ($options['checkPermissions'] && !Yii::$app->request->isConsoleRequest) { $permissionQuery = new \ZendSearch\Lucene\Search\Query\Boolean(); if (Yii::$app->user->isGuest) { // Guest Content $guestContentQuery = new \ZendSearch\Lucene\Search\Query\Boolean(); $guestContentQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(self::DOCUMENT_VISIBILITY_PUBLIC, 'visibility')), true); $guestContentQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(self::DOCUMENT_TYPE_CONTENT, 'type')), true); $guestContentQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(Space::className(), 'containerModel')), true); $guestSpaceListQuery = new \ZendSearch\Lucene\Search\Query\MultiTerm(); foreach (Space::find()->where(['visibility' => Space::VISIBILITY_ALL])->all() as $space) { $guestSpaceListQuery->addTerm(new \ZendSearch\Lucene\Index\Term($space->id, 'containerPk')); } $guestContentQuery->addSubquery($guestSpaceListQuery, true); $permissionQuery->addSubquery($guestContentQuery); // Guest Spaces $guestSpacesQuery = new \ZendSearch\Lucene\Search\Query\Boolean(); $guestSpacesQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(self::DOCUMENT_TYPE_SPACE, 'type')), true); $guestSpacesQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(self::DOCUMENT_VISIBILITY_PUBLIC, 'visibility')), true); $permissionQuery->addSubquery($guestSpacesQuery); $permissionQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(self::DOCUMENT_TYPE_USER, 'type'))); } else { //--- Public Content $permissionQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(self::DOCUMENT_VISIBILITY_PUBLIC, 'visibility'))); //--- Private Space Content $privateSpaceContentQuery = new \ZendSearch\Lucene\Search\Query\Boolean(); $privateSpaceContentQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(self::DOCUMENT_VISIBILITY_PRIVATE, 'visibility')), true); $privateSpaceContentQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(Space::className(), 'containerModel')), true); $privateSpacesListQuery = new \ZendSearch\Lucene\Search\Query\MultiTerm(); foreach (\humhub\modules\space\models\Membership::GetUserSpaces() as $space) { $privateSpacesListQuery->addTerm(new \ZendSearch\Lucene\Index\Term($space->id, 'containerPk')); } $privateSpaceContentQuery->addSubquery($privateSpacesListQuery, true); $permissionQuery->addSubquery($privateSpaceContentQuery); } $query->addSubquery($permissionQuery, true); } if (count($options['limitSpaces']) > 0) { $spaceBaseQuery = new \ZendSearch\Lucene\Search\Query\Boolean(); $spaceBaseQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(Space::className(), 'containerModel')), true); $spaceIdQuery = new \ZendSearch\Lucene\Search\Query\MultiTerm(); foreach ($options['limitSpaces'] as $space) { $spaceIdQuery->addTerm(new \ZendSearch\Lucene\Index\Term($space->id, 'containerPk')); } $spaceBaseQuery->addSubquery($spaceIdQuery, true); $query->addSubquery($spaceBaseQuery, true); } return $query; }
<?php use humhub\modules\content\Events; use humhub\commands\CronController; use humhub\commands\IntegrityController; use humhub\modules\content\widgets\WallEntryControls; use humhub\modules\content\widgets\WallEntryAddons; use humhub\modules\user\models\User; use humhub\modules\space\models\Space; use humhub\modules\search\engine\Search; use humhub\modules\content\components\ContentActiveRecord; return ['id' => 'content', 'class' => \humhub\modules\content\Module::className(), 'isCoreModule' => true, 'events' => array(['class' => IntegrityController::className(), 'event' => IntegrityController::EVENT_ON_RUN, 'callback' => array(Events::className(), 'onIntegrityCheck')], ['class' => WallEntryControls::className(), 'event' => WallEntryControls::EVENT_INIT, 'callback' => array(Events::className(), 'onWallEntryControlsInit')], ['class' => WallEntryAddons::className(), 'event' => WallEntryAddons::EVENT_INIT, 'callback' => array(Events::className(), 'onWallEntryAddonInit')], ['class' => CronController::className(), 'event' => CronController::EVENT_ON_HOURLY_RUN, 'callback' => [Events::className(), 'onCronRun']], ['class' => CronController::className(), 'event' => CronController::EVENT_ON_DAILY_RUN, 'callback' => [Events::className(), 'onCronRun']], ['class' => User::className(), 'event' => User::EVENT_BEFORE_DELETE, 'callback' => [Events::className(), 'onUserDelete']], ['class' => Space::className(), 'event' => User::EVENT_BEFORE_DELETE, 'callback' => [Events::className(), 'onSpaceDelete']], ['class' => Search::className(), 'event' => Search::EVENT_ON_REBUILD, 'callback' => [Events::className(), 'onSearchRebuild']], ['class' => ContentActiveRecord::className(), 'event' => ContentActiveRecord::EVENT_AFTER_INSERT, 'callback' => [Events::className(), 'onContentActiveRecordSave']], ['class' => ContentActiveRecord::className(), 'event' => ContentActiveRecord::EVENT_AFTER_UPDATE, 'callback' => [Events::className(), 'onContentActiveRecordSave']], ['class' => ContentActiveRecord::className(), 'event' => ContentActiveRecord::EVENT_AFTER_DELETE, 'callback' => [Events::className(), 'onContentActiveRecordDelete']])];
<?php use humhub\modules\notification\Module; use humhub\modules\notification\Events; use humhub\modules\user\models\User; use humhub\modules\space\models\Space; use humhub\commands\IntegrityController; use humhub\commands\CronController; use humhub\components\ActiveRecord; return ['id' => 'notification', 'class' => Module::className(), 'isCoreModule' => true, 'events' => array(array('class' => User::className(), 'event' => User::EVENT_BEFORE_DELETE, 'callback' => array(Events::className(), 'onUserDelete')), array('class' => Space::className(), 'event' => Space::EVENT_BEFORE_DELETE, 'callback' => array(Events::className(), 'onSpaceDelete')), array('class' => IntegrityController::className(), 'event' => IntegrityController::EVENT_ON_RUN, 'callback' => array(Events::className(), 'onIntegrityCheck')), array('class' => CronController::className(), 'event' => CronController::EVENT_ON_DAILY_RUN, 'callback' => array(Events::className(), 'onCronDailyRun')), array('class' => ActiveRecord::className(), 'event' => ActiveRecord::EVENT_BEFORE_DELETE, 'callback' => [Events::className(), 'onActiveRecordDelete']))];
/** * * @return type */ public function getSpaces() { // TODO: SHOW ONLY REAL MEMBERSHIPS return $this->hasMany(\humhub\modules\space\models\Space::className(), ['id' => 'space_id'])->viaTable('space_membership', ['user_id' => 'id']); }
protected function buildQuery($keyword, $options) { $query = new \ZendSearch\Lucene\Search\Query\Boolean(); foreach (explode(" ", $keyword) as $k) { // Require at least 3 non-wildcard characters if (strlen($k) > 2) { $term = new \ZendSearch\Lucene\Index\Term($k . "*"); $query->addSubquery(new \ZendSearch\Lucene\Search\Query\Wildcard($term), true); } } // Add model filter if (isset($options['model']) && $options['model'] != "") { if (is_array($options['model'])) { $boolQuery = new \ZendSearch\Lucene\Search\Query\MultiTerm(); foreach ($options['model'] as $model) { $boolQuery->addTerm(new \ZendSearch\Lucene\Index\Term($model, 'model')); } $query->addSubquery($boolQuery, true); } else { $term = new \ZendSearch\Lucene\Index\Term($options['model'], 'model'); $query->addSubquery(new \ZendSearch\Lucene\Search\Query\Term($term), true); } } // Add type filter if (isset($options['type']) && $options['type'] != "") { if (is_array($options['type'])) { $boolQuery = new \ZendSearch\Lucene\Search\Query\MultiTerm(); foreach ($options['type'] as $model) { $boolQuery->addTerm(new \ZendSearch\Lucene\Index\Term($type), 'type'); } $query->addSubquery($boolQuery, true); } else { $term = new \ZendSearch\Lucene\Index\Term($options['type'], 'type'); $query->addSubquery(new \ZendSearch\Lucene\Search\Query\Term($term), true); } } if ($options['checkPermissions'] && !Yii::$app->request->isConsoleRequest) { $permissionQuery = new \ZendSearch\Lucene\Search\Query\Boolean(); //--- Public Content $permissionQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(self::DOCUMENT_VISIBILITY_PUBLIC, 'visibility'))); //--- Private Space Content $privateSpaceContentQuery = new \ZendSearch\Lucene\Search\Query\Boolean(); $privateSpaceContentQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(self::DOCUMENT_VISIBILITY_PRIVATE, 'visibility')), true); $privateSpaceContentQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(Space::className(), 'containerModel')), true); $privateSpacesListQuery = new \ZendSearch\Lucene\Search\Query\MultiTerm(); foreach (\humhub\modules\space\models\Membership::GetUserSpaces() as $space) { $privateSpacesListQuery->addTerm(new \ZendSearch\Lucene\Index\Term($space->id, 'containerPk')); } $privateSpaceContentQuery->addSubquery($privateSpacesListQuery, true); $permissionQuery->addSubquery($privateSpaceContentQuery); $query->addSubquery($permissionQuery, true); } if (count($options['limitSpaces']) > 0) { $spaceBaseQuery = new \ZendSearch\Lucene\Search\Query\Boolean(); $spaceBaseQuery->addSubquery(new \ZendSearch\Lucene\Search\Query\Term(new \ZendSearch\Lucene\Index\Term(Space::className(), 'containerModel')), true); $spaceIdQuery = new \ZendSearch\Lucene\Search\Query\MultiTerm(); foreach ($options['limitSpaces'] as $space) { $spaceIdQuery->addTerm(new \ZendSearch\Lucene\Index\Term($space->id, 'containerPk')); } $spaceBaseQuery->addSubquery($spaceIdQuery, true); $query->addSubquery($spaceBaseQuery, true); } return $query; }