@@ -3795,123 +3795,53 @@ private function getItemsForIndex(
37953795 && true === api_get_configuration_value ('portfolio_show_base_course_post_in_sessions ' );
37963796
37973797 $ portfolioRepo = Container::getPortfolioRepository ();
3798- $ queryBuilder = $ portfolioRepo ->getResources ();
3799- $ portfolioRepo ->addCourseQueryBuilder ($ this ->course , $ queryBuilder );
3798+ $ portfolioCategoryHelper = Container::getPortfolioCategoryHelper ();
38003799
3801- if ($ this ->session ) {
3802- if ($ showBaseContentInSession ) {
3803- $ portfolioRepo ->addSessionAndBaseContentQueryBuilder ($ this ->session , $ queryBuilder );
3804- } else {
3805- $ portfolioRepo ->addSessionOnlyQueryBuilder ($ this ->session , $ queryBuilder );
3806- }
3807- } else {
3808- $ portfolioRepo ->addSessionNullQueryBuilder ($ queryBuilder );
3809- }
3800+ $ filters = $ frmFilterList && $ frmFilterList ->validate () ? $ frmFilterList ->exportValues () : [];
38103801
3811- if ($ frmFilterList && $ frmFilterList ->validate ()) {
3812- $ values = $ frmFilterList ->exportValues ();
3802+ $ searchInCategories = [];
38133803
3814- if (!empty ($ values ['date ' ])) {
3815- $ queryBuilder
3816- ->andWhere ('resource.creationDate >= :date ' )
3817- ->setParameter (':date ' , api_get_utc_datetime ($ values ['date ' ], false , true ))
3818- ;
3819- }
3804+ if ($ categoryId = $ filters ['categoryId ' ] ?? null ) {
3805+ $ searchInCategories [] = $ categoryId ;
38203806
3821- if (!empty ($ values ['tags ' ])) {
3822- $ queryBuilder
3823- ->innerJoin (ExtraFieldRelTag::class, 'efrt ' , Join::WITH , 'efrt.itemId = resource.id ' )
3824- ->innerJoin (ExtraFieldEntity::class, 'ef ' , Join::WITH , 'ef.id = efrt.fieldId ' )
3825- ->andWhere ('ef.extraFieldType = :efType ' )
3826- ->andWhere ('ef.variable = :variable ' )
3827- ->andWhere ('efrt.tagId IN (:tags) ' );
3828-
3829- $ queryBuilder ->setParameter ('efType ' , ExtraFieldEntity::PORTFOLIO_TYPE );
3830- $ queryBuilder ->setParameter ('variable ' , 'tags ' );
3831- $ queryBuilder ->setParameter ('tags ' , $ values ['tags ' ]);
3807+ foreach ($ portfolioCategoryHelper ->getListForIndex ($ categoryId ) as $ subCategory ) {
3808+ $ searchInCategories [] = $ subCategory ->getId ();
38323809 }
3810+ }
38333811
3834- if (!empty ($ values ['text ' ])) {
3835- $ queryBuilder ->andWhere (
3836- $ queryBuilder ->expr ()->orX (
3837- $ queryBuilder ->expr ()->like ('resource.title ' , ':text ' ),
3838- $ queryBuilder ->expr ()->like ('resource.content ' , ':text ' )
3839- )
3840- );
3812+ $ searchNotInCategories = [];
38413813
3842- $ queryBuilder -> setParameter ( ' text ' , ' % ' . $ values [ ' text ' ]. ' % ' );
3843- }
3814+ if ( $ subCategoryIdList = $ filters [ ' subCategoryIds ' ] ?? '' ) {
3815+ $ diff = [];
38443816
3845- // Filters by category level 0
3846- $ searchCategories = [];
3847- if (!empty ($ values ['categoryId ' ])) {
3848- $ searchCategories [] = $ values ['categoryId ' ];
3849- $ subCategories = $ this ->getCategoriesForIndex ($ values ['categoryId ' ]);
3850- if (count ($ subCategories ) > 0 ) {
3851- foreach ($ subCategories as $ subCategory ) {
3852- $ searchCategories [] = $ subCategory ->getId ();
3853- }
3854- }
3855- $ queryBuilder ->andWhere ('resource.category IN( ' .implode (', ' , $ searchCategories ).') ' );
3817+ if ('all ' !== $ subCategoryIdList ) {
3818+ $ subCategoryIds = explode (', ' , $ subCategoryIdList );
3819+ $ diff = array_diff ($ searchInCategories , $ subCategoryIds );
3820+ } elseif (trim ($ subCategoryIdList ) === '' ) {
3821+ $ diff = $ searchInCategories ;
38563822 }
38573823
3858- // Filters by sub-category, don't show the selected values
3859- $ diff = [];
3860- if (!empty ($ values ['subCategoryIds ' ]) && !('all ' === $ values ['subCategoryIds ' ])) {
3861- $ subCategoryIds = explode (', ' , $ values ['subCategoryIds ' ]);
3862- $ diff = array_diff ($ searchCategories , $ subCategoryIds );
3863- } else {
3864- if (trim ($ values ['subCategoryIds ' ]) === '' ) {
3865- $ diff = $ searchCategories ;
3866- }
3867- }
38683824 if (!empty ($ diff )) {
38693825 unset($ diff [0 ]);
3870- if (!empty ($ diff )) {
3871- $ queryBuilder ->andWhere ('resource.category NOT IN( ' .implode (', ' , $ diff ).') ' );
3872- }
3873- }
3874- }
38753826
3876- if ($ listByUser ) {
3877- $ queryBuilder
3878- ->andWhere ('resource.user = :user ' )
3879- ->setParameter ('user ' , $ this ->owner );
3880- }
3881-
3882- if ($ this ->advancedSharingEnabled ) {
3883- $ queryBuilder ->andWhere (
3884- $ queryBuilder ->expr ()->orX (
3885- $ queryBuilder ->expr ()->eq ('resource.visibility ' , Portfolio::VISIBILITY_VISIBLE ),
3886- $ queryBuilder ->expr ()->eq ('links.user ' , ':current_user ' )
3887- )
3888- );
3889- } else {
3890- $ visibilityCriteria = [Portfolio::VISIBILITY_VISIBLE ];
3891-
3892- if (api_is_allowed_to_edit ()) {
3893- $ visibilityCriteria [] = Portfolio::VISIBILITY_HIDDEN_EXCEPT_TEACHER ;
3827+ $ searchNotInCategories = $ diff ;
38943828 }
3895-
3896- $ queryBuilder ->andWhere (
3897- $ queryBuilder ->expr ()->orX (
3898- 'node.creator = :current_user ' ,
3899- $ queryBuilder ->expr ()->andX (
3900- 'node.creator != :current_user ' ,
3901- $ queryBuilder ->expr ()->in ('resource.visibility ' , $ visibilityCriteria )
3902- )
3903- )
3904- );
3905- }
3906-
3907- $ queryBuilder ->setParameter ('current_user ' , $ currentUserId );
3908- if ($ alphabeticalOrder || true === api_get_configuration_value ('portfolio_order_post_by_alphabetical_order ' )) {
3909- $ queryBuilder ->orderBy ('resource.title ' , 'ASC ' );
3910- } else {
3911- $ queryBuilder ->orderBy ('node.createdAt ' , 'DESC ' );
39123829 }
39133830
3914- $ items = $ queryBuilder ->getQuery ()->getResult ();
3831+ $ items = $ portfolioRepo ->getIndexCourseItems (
3832+ api_get_user_entity (),
3833+ $ this ->owner ,
3834+ $ this ->course ,
3835+ $ this ->session ,
3836+ $ showBaseContentInSession ,
3837+ $ listByUser ,
3838+ $ filters ['date ' ] ?? null ,
3839+ $ filters ['tags ' ] ?? [],
3840+ $ filters ['text ' ] ?? '' ,
3841+ $ searchInCategories ,
3842+ $ searchNotInCategories ,
3843+ $ this ->advancedSharingEnabled
3844+ );
39153845
39163846 if ($ showBaseContentInSession ) {
39173847 $ items = array_filter (
0 commit comments