1+ <?php
2+
3+ namespace mod_moodleoverflow \search ;
4+
5+ use core_search \document ;
6+
7+ defined ('MOODLE_INTERNAL ' ) || die ();
8+ require_once (dirname (__FILE__ ) . '/../../locallib.php ' );
9+ class moodleoverflowposts extends \core_search \base_mod {
10+
11+ /**
12+ * @var array Internal quick static cache.
13+ */
14+ protected $ postsdata = array ();
15+ protected $ moodleoverflows = array ();
16+ protected $ discussions = array ();
17+
18+ protected static $ levels = [CONTEXT_COURSE ];
19+
20+ public function uses_file_indexing () {
21+ return false ;
22+ }
23+
24+ public function get_document ($ record , $ options = array ()) {
25+ try {
26+ $ cm = $ this ->get_cm ('moodleoverflow ' , $ record ->moodleoverflowid , $ record ->course );
27+ $ context = \context_module::instance ($ cm ->id );
28+ } catch (\dml_missing_record_exception $ ex ) {
29+ debugging ('Error retrieving ' . $ this ->areaid . ' ' . $ record ->id . ' document, not all required data is available: ' .
30+ $ ex ->getMessage (), DEBUG_DEVELOPER );
31+ return false ;
32+ } catch (\dml_exception $ ex ) {
33+ debugging ('Error retrieving ' . $ this ->areaid . ' ' . $ record ->id . ' document: ' . $ ex ->getMessage (), DEBUG_DEVELOPER );
34+ return false ;
35+ }
36+
37+ $ doc = \core_search \document_factory::instance ($ record ->id , $ this ->componentname , $ this ->areaname );
38+
39+ $ doc ->set ('title ' , content_to_text ($ record ->title , true ));
40+ $ doc ->set ('content ' , content_to_text ($ record ->message , FORMAT_HTML ));
41+ $ doc ->set ('contextid ' , $ context ->id );
42+ $ doc ->set ('type ' , \core_search \manager::TYPE_TEXT );
43+ $ doc ->set ('courseid ' , $ record ->course );
44+ $ doc ->set ('modified ' , $ record ->modified );
45+ $ doc ->set ('userid ' , $ record ->userid );
46+ $ doc ->set ('owneruserid ' , \core_search \manager::NO_OWNER_ID );
47+ $ postdata [$ record ->id [0 ]] = array ('discussionid ' => $ record ->discussion , 'moodleoverflowid ' => $ record ->moodleoverflowid );
48+ if (isset ($ options ['lastindexedtime ' ]) && ($ options ['lastindexedtime ' ] < $ record ->created )) {
49+ // If the document was created after the last index time, it must be new.
50+ $ doc ->set_is_new (true );
51+ }
52+
53+ return $ doc ;
54+ }
55+
56+ private function get_discussion_from_id ($ discussionid ) {
57+ global $ DB ;
58+ if (isset ($ this ->discussions [$ discussionid ])) {
59+ return $ this ->discussions [$ discussionid ];
60+ } else {
61+ if (!$ discussion = $ DB ->get_record ('moodleoverflow_discussions ' , array ('id ' => $ discussionid ))) {
62+ return false ;
63+ }
64+ $ this ->discussions [$ discussionid ] = $ discussion ;
65+ return $ discussion ;
66+ }
67+ }
68+
69+ private function get_moodleoverflow_from_id ($ moodleoverflowid ) {
70+ global $ DB ;
71+ if (isset ($ this ->moodleoverflows [$ moodleoverflowid ])) {
72+ return $ this ->moodleoverflows [$ moodleoverflowid ];
73+ } else {
74+ if (!$ moodleoverflow = $ DB ->get_record ('moodleoverflow ' , array ('id ' => $ moodleoverflowid ))) {
75+ return false ;
76+ }
77+ $ this ->moodleoverflows [$ moodleoverflowid ] = $ moodleoverflow ;
78+ return $ moodleoverflow ;
79+ }
80+ }
81+
82+ public function check_access ($ id ) {
83+ try {
84+ $ post = moodleoverflow_get_post_full ($ id );
85+ if (!$ discussion = $ this ->get_discussion_from_id ($ post ->discussion )) {
86+ return \core_search \manager::ACCESS_DELETED ;
87+ }
88+ if (!$ moodleoverflow = $ this ->get_moodleoverflow_from_id ($ post ->moodleoverflow )) {
89+ return \core_search \manager::ACCESS_DELETED ;
90+ }
91+ $ context = moodleoverflow_get_context ($ post ->moodleoverflow );
92+ } catch (\dml_missing_record_exception $ ex ) {
93+ return \core_search \manager::ACCESS_DELETED ;
94+ } catch (\dml_exception $ ex ) {
95+ return \core_search \manager::ACCESS_DENIED ;
96+ }
97+ if (moodleoverflow_user_can_see_discussion ($ moodleoverflow , $ discussion , $ context )) {
98+ return \core_search \manager::ACCESS_GRANTED ;
99+ }
100+ return \core_search \manager::ACCESS_DENIED ;
101+ }
102+
103+ public function get_discussionid_for_document (document $ doc ) {
104+ global $ DB ;
105+ $ postid = $ doc ->get ('itemid ' );
106+ if (isset ($ this ->postsdata [$ postid ]) && isset ($ this ->postsdata [$ postid ]['discussionid ' ])) {
107+ return $ this ->postsdata [$ postid ]['discussionid ' ];
108+ } else {
109+ $ discussionid = $ DB ->get_field ('moodleoverflow_posts ' , 'discussion ' , array ('id ' => $ postid ));
110+ if (!isset ($ this ->postsdata [$ postid ])) {
111+ $ this ->postsdata [$ postid ] = array ();
112+ }
113+ $ this ->postsdata [$ postid ]['discussionid ' ] = $ discussionid ;
114+ return $ discussionid ;
115+ }
116+ }
117+
118+ public function get_moodleoverflowid_for_document (document $ doc ) {
119+ global $ DB ;
120+ $ discussionid = $ this ->get_discussionid_for_document ($ doc );
121+ $ postid = $ doc ->get ('itemid ' );
122+ if (isset ($ this ->postsdata [$ postid ]) && isset ($ this ->postsdata [$ postid ]["moodleoverflowid " ])) {
123+ return $ this ->postsdata [$ postid ]["moodleoverflowid " ];
124+ } else {
125+ $ moodleoverflowid = $ DB ->get_field ('moodleoverflow_discussions ' , 'moodleoverflow ' , array ('id ' => $ discussionid ));
126+ if (!isset ($ this ->postsdata [$ postid ])) {
127+ $ this ->postsdata [$ postid ] = array ();
128+ }
129+ $ this ->postsdata [$ postid ]['moodleoverflowid ' ] = $ moodleoverflowid ;
130+ return $ moodleoverflowid ;
131+ }
132+ }
133+
134+ public function get_doc_url (document $ doc ) {
135+ return new \moodle_url ('/mod/moodleoverflow/discussion.php ' , array ('d ' => $ this ->get_discussionid_for_document ($ doc )),
136+ "p " . $ doc ->get ('itemid ' ));
137+ }
138+
139+ public function get_context_url (document $ doc ) {
140+ return new \moodle_url ('/mod/moodleoverflow/view.php ' , array ('m ' => $ this ->get_moodleoverflowid_for_document ($ doc )));
141+ }
142+
143+ public function get_document_recordset ($ modifiedfrom = 0 , \context $ context = null ) {
144+ global $ DB ;
145+ list ($ contextjoin , $ contextparams ) = $ this ->get_context_restriction_sql ($ context , 'moodleoverflow ' , 'discussions ' );
146+ if ($ contextjoin === null ) {
147+ return null ;
148+ }
149+ $ sql = "SELECT md.name as title, mp.*, mo.course, mo.id as moodleoverflowid FROM {moodleoverflow_posts} mp
150+ JOIN {moodleoverflow_discussions} md ON mp.discussion = md.id
151+ JOIN {moodleoverflow} mo ON md.moodleoverflow = mo.id
152+ $ contextjoin
153+ WHERE mp.modified >= ? ORDER BY mp.modified ASC " ;
154+ return $ DB ->get_recordset_sql ($ sql , array_merge ($ contextparams , [$ modifiedfrom ]));
155+ }
156+ }
0 commit comments