@@ -704,6 +704,32 @@ function getItemsFiltered($folder, $userDao = null, $policy = 0, $sortfield = 'n
704
704
{
705
705
$ folderIds = array ($ folder ->getKey ());
706
706
}
707
+
708
+ $ sql = $ this ->_buildChildItemsQuery ($ userDao , $ folderIds , $ policy , $ sortfield , $ sortdir );
709
+
710
+ if ($ limit > 0 )
711
+ {
712
+ $ sql ->limit ($ limit , $ offset );
713
+ }
714
+
715
+ $ rowset = $ this ->database ->fetchAll ($ sql );
716
+ $ return = array ();
717
+ foreach ($ rowset as $ row )
718
+ {
719
+ $ item = $ this ->initDao ('Item ' , $ row );
720
+ $ item ->parent_id = $ row ['folder_id ' ];
721
+ $ return [] = $ item ;
722
+ }
723
+ return $ return ;
724
+ }
725
+
726
+ /**
727
+ * Helper function to build the child selection query
728
+ * @param userDao The current user
729
+ * @param folderIds Array of parent folder ids
730
+ */
731
+ private function _buildChildItemsQuery (&$ userDao , &$ folderIds , $ policy , $ sortfield = 'name ' , $ sortdir = 'asc ' )
732
+ {
707
733
$ userId = $ userDao instanceof UserDao ? $ userDao ->getKey () : -1 ;
708
734
$ isAdmin = $ userDao instanceof UserDao ? $ userDao ->isAdmin () : false ;
709
735
@@ -737,21 +763,7 @@ function getItemsFiltered($folder, $userDao = null, $policy = 0, $sortfield = 'n
737
763
->where ('i.item_id IN ( ' .new Zend_Db_Expr ($ usrSql ).') OR ' .
738
764
'i.item_id IN ( ' .new Zend_Db_Expr ($ grpSql ).') ' );
739
765
}
740
-
741
- if ($ limit > 0 )
742
- {
743
- $ sql ->limit ($ limit , $ offset );
744
- }
745
-
746
- $ rowset = $ this ->database ->fetchAll ($ sql );
747
- $ return = array ();
748
- foreach ($ rowset as $ row )
749
- {
750
- $ item = $ this ->initDao ('Item ' , $ row );
751
- $ item ->parent_id = $ row ['folder_id ' ];
752
- $ return [] = $ item ;
753
- }
754
- return $ return ;
766
+ return $ sql ;
755
767
}
756
768
757
769
/**
@@ -776,6 +788,30 @@ function getChildrenFoldersFiltered($folder, $userDao = null, $policy = 0, $sort
776
788
{
777
789
$ folderIds = array ($ folder ->getKey ());
778
790
}
791
+
792
+ $ sql = $ this ->_buildChildFoldersQuery ($ userDao , $ folderIds , $ policy , $ sortfield , $ sortdir );
793
+
794
+ if ($ limit > 0 )
795
+ {
796
+ $ sql ->limit ($ limit , $ offset );
797
+ }
798
+
799
+ $ rowset = $ this ->database ->fetchAll ($ sql );
800
+ $ return = array ();
801
+ foreach ($ rowset as $ row )
802
+ {
803
+ $ return [] = $ this ->initDao ('Folder ' , $ row );
804
+ }
805
+ return $ return ;
806
+ }
807
+
808
+ /**
809
+ * Helper function to build the child selection query
810
+ * @param userDao The current user
811
+ * @param folderIds Array of parent folder ids
812
+ */
813
+ private function _buildChildFoldersQuery (&$ userDao , &$ folderIds , $ policy , $ sortfield = 'name ' , $ sortdir = 'asc ' )
814
+ {
779
815
$ userId = $ userDao instanceof UserDao ? $ userDao ->getKey () : -1 ;
780
816
$ isAdmin = $ userDao instanceof UserDao ? $ userDao ->isAdmin () : false ;
781
817
@@ -807,19 +843,7 @@ function getChildrenFoldersFiltered($folder, $userDao = null, $policy = 0, $sort
807
843
->where ('f.folder_id IN ( ' .new Zend_Db_Expr ($ usrSql ).') OR ' .
808
844
'f.folder_id IN ( ' .new Zend_Db_Expr ($ grpSql ).') ' );
809
845
}
810
-
811
- if ($ limit > 0 )
812
- {
813
- $ sql ->limit ($ limit , $ offset );
814
- }
815
-
816
- $ rowset = $ this ->database ->fetchAll ($ sql );
817
- $ return = array ();
818
- foreach ($ rowset as $ row )
819
- {
820
- $ return [] = $ this ->initDao ('Folder ' , $ row );
821
- }
822
- return $ return ;
846
+ return $ sql ;
823
847
}
824
848
825
849
/** Get the child folder
@@ -1020,6 +1044,51 @@ function isDeleteable($folder)
1020
1044
return true ;
1021
1045
}
1022
1046
1047
+ /**
1048
+ * This will zip stream the filtered contents of the fold
1049
+ */
1050
+ public function zipStream (&$ zip , $ path , $ folder , &$ userDao )
1051
+ {
1052
+ $ folderIds = array ($ folder ->getKey ());
1053
+ $ this ->Item = MidasLoader::loadModel ('Item ' );
1054
+
1055
+ $ sql = $ this ->_buildChildItemsQuery ($ userDao , $ folderIds , MIDAS_POLICY_READ );
1056
+ $ rows = $ this ->database ->fetchAll ($ sql );
1057
+ foreach ($ rows as $ row )
1058
+ {
1059
+ $ item = $ this ->initDao ('Item ' , $ row );
1060
+ $ bitstreams = $ this ->Item ->getLastRevision ($ item )->getBitstreams ();
1061
+ $ count = count ($ bitstreams );
1062
+
1063
+ foreach ($ bitstreams as $ bitstream )
1064
+ {
1065
+ if ($ count > 1 || $ bitstream ->getName () != $ item ->getName ())
1066
+ {
1067
+ $ currPath = $ path .'/ ' .$ item ->getName ().'/ ' .$ bitstream ->getName ();
1068
+ }
1069
+ else
1070
+ {
1071
+ $ currPath = $ path .'/ ' .$ bitstream ->getName ();
1072
+ }
1073
+ $ zip ->add_file_from_path ($ currPath , $ bitstream ->getAssetstore ()->getPath ().'/ ' .$ bitstream ->getPath ());
1074
+ }
1075
+ $ this ->Item ->incrementDownloadCount ($ item );
1076
+ unset($ bitstreams );
1077
+ unset($ item );
1078
+ }
1079
+ unset($ sql );
1080
+ unset($ rows );
1081
+
1082
+ $ sql = $ this ->_buildChildFoldersQuery ($ userDao , $ folderIds , MIDAS_POLICY_READ );
1083
+ $ rows = $ this ->database ->fetchAll ($ sql );
1084
+ foreach ($ rows as $ row )
1085
+ {
1086
+ $ subfolder = $ this ->initDao ('Folder ' , $ row );
1087
+ $ this ->zipStream ($ zip , $ path .'/ ' .$ subfolder ->getName (), $ subfolder , $ userDao );
1088
+ unset($ subfolder );
1089
+ }
1090
+ }
1091
+
1023
1092
/**
1024
1093
* Will return all root folder daos. There is a root folder for each
1025
1094
* user, and one for each community.
0 commit comments