Mercurial
comparison .cms/mod/rss.mod.php @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 <?php | |
2 | |
3 $cms["modules"]["rss.mod.php"] = array( | |
4 "name" => "rss_module_name", | |
5 "description" => "rss_module_description", | |
6 "files" => array( | |
7 ".cms/mod/rss.mod.php", | |
8 ".cms/js/rss.js", | |
9 ".cms/css/rss.css", | |
10 ".cms/lang/ru_RU.UTF-8/rss.mod.php", | |
11 ".cms/lang/en_US.UTF-8/rss.mod.php", | |
12 ".cms/lang/uk_UA.UTF-8/rss.mod.php", | |
13 ), | |
14 ); | |
15 | |
16 // Return if module disabled | |
17 if ( ! empty( $cms["config"]["rss.mod.php"]["disabled"] ) ) { | |
18 | |
19 return; | |
20 | |
21 } else { | |
22 | |
23 // Default Settings | |
24 | |
25 if ( empty( $cms["config"]["rss.mod.php"]["update_interval"] ) ) { | |
26 $cms["config"]["rss.mod.php"]["update_interval"] = 60; | |
27 } | |
28 | |
29 if ( empty( $cms["config"]["rss.mod.php"]["exclude"] ) ) { | |
30 $cms["config"]["rss.mod.php"]["exclude"] = ""; | |
31 } | |
32 | |
33 if ( empty( $cms["config"]["rss.mod.php"]["gen"] ) ) { | |
34 $cms["config"]["rss.mod.php"]["gen"] = "dynamic"; | |
35 } | |
36 | |
37 if ( empty( $cms["config"]["rss.mod.php"]["lastrun"] ) ) { | |
38 $cms["config"]["rss.mod.php"]["lastrun"] = ""; | |
39 } | |
40 | |
41 if ( is_admin() ) { | |
42 hook_add_fn( "admin", "cms_rss_admin" ); | |
43 hook_add_fn( "admin_header", "cms_rss_admin_header" ); | |
44 } | |
45 | |
46 if ( $cms["config"]["rss.mod.php"]["gen"] === "static" ) { | |
47 hook_add_fn( "cron", "cms_rss_cron" ); | |
48 } | |
49 | |
50 $cms["urls"]["^{$cms['base_path']}rss.xml$"] = "rss.xml"; | |
51 hook_add_fn( "rss.xml", "cms_rss_xml" ); | |
52 | |
53 // Количество элементов в ленте | |
54 if ( empty( $cms["config"]["rss.mod.php"]["count"] ) ) { | |
55 $cms["config"]["rss.mod.php"]["count"] = 30; | |
56 } | |
57 | |
58 } | |
59 | |
60 | |
61 function cms_rss_admin_header() { | |
62 global $cms; | |
63 $conf = $cms["config"]["rss.mod.php"]["menu"]["rss"]; | |
64 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { | |
65 echo "<link rel=stylesheet href='{$cms['base_path']}css/rss.css'>"; | |
66 echo "<script src='{$cms['base_path']}js/rss.js'></script>"; | |
67 } | |
68 } | |
69 | |
70 | |
71 function cms_rss_cron() { | |
72 global $cms; | |
73 if ( $cms["config"]["rss.mod.php"]["lastrun"] < date( "Y-m-d H:i:s", time() - $cms["config"]["rss.mod.php"]["update_interval"] * 60) ) { | |
74 unlink( "{$cms['site_dir']}/rss.xml" ); | |
75 $cms["config"]["rss.mod.php"]["lastrun"] = date( "Y-m-d H:i:s"); | |
76 cms_save_config(); | |
77 } | |
78 } | |
79 | |
80 | |
81 function cms_rss_xml() { | |
82 global $cms; | |
83 header( "Content-Type: application/xml;charset=UTF-8" ); | |
84 $rss = cms_rss_generate(); | |
85 echo $rss; | |
86 if ( $cms["config"]["rss.mod.php"]["gen"] === "static" ) { | |
87 file_put_contents( "{$cms['site_dir']}/rss.xml", $rss ); | |
88 } | |
89 } | |
90 | |
91 | |
92 function cms_rss_update() { | |
93 global $cms; | |
94 // disable remove file | |
95 if ( ! empty( $cms["config"]["rss.mod.php"]["disabled"] ) ) { | |
96 return; | |
97 } | |
98 | |
99 $file = "{$cms['site_dir']}/rss.xml"; | |
100 if ( file_exists( $file ) ) unlink( $file ); | |
101 } | |
102 | |
103 | |
104 function cms_rss_generate() { | |
105 global $cms; | |
106 if ( empty( $cms["base"] ) ) cms_base_connect(); | |
107 if ( empty( $cms["base"] ) ) return; | |
108 if ( mysqli_connect_error() ) return; | |
109 | |
110 $domain = "{$cms['url']['scheme']}://{$cms['url']['host']}"; | |
111 | |
112 $cms["rss"] = array(); | |
113 | |
114 $exclude = explode( "\n", $cms["config"]["rss.mod.php"]["exclude"] ); | |
115 foreach( $exclude as $n => $link ) { | |
116 $t = trim( $link ); | |
117 if ( empty( $t ) ) { | |
118 // delete empty lines | |
119 unset( $exclude[$n] ); | |
120 } | |
121 } | |
122 | |
123 $channel_title = ""; | |
124 $channel_link = ""; | |
125 $channel_description = ""; | |
126 $date = date( "Y-m-d H:i:s" ); | |
127 $n = 0; | |
128 $cms["rss_links"] = array(); | |
129 $q = "SELECT `title`, `seo_title`, `url`, `created`, `modified`, `description`, `text`, `published` FROM `pages` WHERE `created`<='{$date}' AND `published` ORDER BY `created` DESC"; | |
130 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
131 while ( $page = mysqli_fetch_assoc( $res ) ) { | |
132 if ( $page["url"] === "" ) { | |
133 $channel_title = $page["title"]; | |
134 $channel_link = $domain . $cms["base_path"]; | |
135 $channel_description = $page["description"]; | |
136 } | |
137 if ( ! in_array( $page["url"], $exclude ) && $n < $cms["config"]["rss.mod.php"]["count"] ) { | |
138 $sort = max( strtotime( $page["created"] ), (int) $page["modified"] ); | |
139 $link = $domain . $cms["base_path"] . $page["url"]; | |
140 if ( ! isset( $cms["rss_links"][$link] ) ) { | |
141 | |
142 // image | |
143 $enclosure = ""; | |
144 if ( preg_match( '/<img[^>]+src=[\'"]([^\'"]+)[\'"][^>]*>/us', $page['text'], $m ) ) { | |
145 $img = $m[1]; | |
146 $img_file = $cms["site_dir"] . $img; | |
147 if ( is_file( $img_file ) ) { | |
148 $mime = mime_content_type( $img_file ); | |
149 if ( substr( $img, 0, 4 ) !== "http" ) { | |
150 if ( substr( $img, 0, 1 ) === "/" ) $img = substr( $img, 1 ); | |
151 $img = $domain . $cms["base_path"] . $img; | |
152 } | |
153 $enclosure = "<enclosure url='{$img}' type='{$mime}'/>"; | |
154 } | |
155 } | |
156 | |
157 if ( ! empty( $page["seo_title"] ) ) { | |
158 $page["title"] = $page["seo_title"]; | |
159 } | |
160 $cms["rss_links"][$link] = true; | |
161 $cms["rss"][] = array( | |
162 "title" => $page["title"], | |
163 "link" => $link, | |
164 "description" => $page["description"], | |
165 "guid" => "{$page['modified']}", | |
166 "sort" => $sort, | |
167 "enclosure" => $enclosure, | |
168 ); | |
169 $n++; | |
170 } | |
171 } | |
172 } | |
173 } | |
174 | |
175 do_hook( "rss" ); | |
176 | |
177 cms_asort( $cms["rss"] ); | |
178 $cms["rss"] = array_reverse( $cms["rss"] ); | |
179 | |
180 $content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> | |
181 <rss version=\"2.0\"> | |
182 | |
183 <channel> | |
184 <title>{$channel_title}</title> | |
185 <link>{$channel_link}</link> | |
186 <description>{$channel_description}</description>\n"; | |
187 foreach( $cms["rss"] as $item ) { | |
188 $content .= " <item> | |
189 <title>{$item['title']}</title> | |
190 <link>{$item['link']}</link> | |
191 <guid>{$item['guid']}</guid> | |
192 <description>{$item['description']}</description> | |
193 {$item['enclosure']} | |
194 </item>\n"; | |
195 } | |
196 $content .= " </channel>\n</rss>"; | |
197 return $content; | |
198 } | |
199 | |
200 | |
201 function cms_rss_admin() { | |
202 global $cms; | |
203 | |
204 $conf = $cms["config"]["rss.mod.php"]["menu"]["rss"]; | |
205 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { | |
206 | |
207 // Save settings | |
208 if ( ! empty( $_POST["save_settings_rss"] ) ) { | |
209 $list = preg_split( "/\r\n|\n\r|\r|\n/u", $_POST["exclude"] ); | |
210 $base_url = "{$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}"; | |
211 foreach ( $list as $key => $value ) { | |
212 // remove domain | |
213 $list[$key] = trim( str_replace( $base_url, "", $value ) ); | |
214 if ( substr( $list[$key], 0, 1 ) === "/" ) $list[$key] = substr( $list[$key], 1 ); | |
215 } | |
216 $list = implode( "\n", $list ); | |
217 $cms["config"]["rss.mod.php"]["gen"] = $_POST["gen"]; | |
218 $cms["config"]["rss.mod.php"]["exclude"] = $list; | |
219 $cms["config"]["rss.mod.php"]["update_interval"] = (int) $_POST["update_interval"]; | |
220 $cms["config"]["rss.mod.php"]["count"] = (int) $_POST["count"]; | |
221 cms_save_config(); | |
222 if ( $cms["config"]["rss.mod.php"]["gen"] === "dynamic" ) { | |
223 unlink( "{$cms['site_dir']}/rss.xml" ); | |
224 } | |
225 cms_rss_update(); | |
226 header( "Location: {$cms['base_path']}{$cms['config']['admin.mod.php']['admin_url']}" ); | |
227 $cms["hooks"]["admin"]["next"] = ""; // Предотвратить выдачу админки | |
228 return; | |
229 } | |
230 | |
231 // Create menu item if not exists | |
232 if ( empty( $cms["config"]["rss.mod.php"]["menu"]["rss"] ) ) { | |
233 $cms["config"]["rss.mod.php"]["menu"]["rss"] = array( | |
234 "title" => "rss_module_name", | |
235 "sort" => 65, | |
236 "section" => "settings", | |
237 ); | |
238 cms_save_config(); | |
239 } | |
240 | |
241 $ch["static"] = ""; | |
242 $ch["dynamic"] = ""; | |
243 $ch[ $cms["config"]["rss.mod.php"]["gen"] ] = "checked"; | |
244 | |
245 $rss = "{$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}rss.xml"; | |
246 | |
247 $page = " | |
248 <div class=rss>" . __( "view_rss" ) . " <a href='{$rss}' target=_blank>{$rss}</a></div> | |
249 | |
250 <form method=post> | |
251 | |
252 <div class=xml-wrapper-hidden> | |
253 <div>" . __( "excluded_links" ) . "</div> | |
254 <textarea name=exclude rows=12 autocomplete=off>{$cms['config']['rss.mod.php']['exclude']}</textarea> | |
255 <div class=save_2_col> | |
256 <button name=save_settings_rss value=save>" . __( "save" ) . "</button> | |
257 <div class=select-dropdown> | |
258 <div class=field-search> | |
259 <input class=search-field autocomplete=off placeholder='" . __( "placeholder" ) . "'> | |
260 </div> | |
261 <ul class=list-search> | |
262 | |
263 </ul> | |
264 </div> | |
265 </div> | |
266 </div> | |
267 | |
268 <div class=xml-static-dynamic> | |
269 <div>" . __( "rss_gen" ) . "</div> | |
270 <label><input name=gen type=radio value=dynamic {$ch['dynamic']}> " . __( "dynamic" ) . "</label> | |
271 <label><input name=gen type=radio value=static {$ch['static']}> " . __( "static" ) . "</label> | |
272 <p>" . __( "rss_items_count" ) . ": <input type=text name=count value={$cms['config']['rss.mod.php']['count']}></p> | |
273 <button name=save_settings_rss value=save>" . __( "save" ) . "</button> | |
274 </div> | |
275 <div class=xml-static-cron> | |
276 <div>" . __( "update_freq" ) . "</div> | |
277 <p>" . __( "static_freq" ) . " <input type=text name=update_interval value={$cms['config']['rss.mod.php']['update_interval']}> " . __( "minutes" ) . "</p> | |
278 <p>" . __( "url_for_cron" ) . ": {$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}{$cms['config']['admin.mod.php']['cron_url']}</p> | |
279 <button name=save_settings_rss value=save>" . __( "save" ) . "</button> | |
280 </div> | |
281 </form> | |
282 "; | |
283 | |
284 $cms["admin_pages"]["rss"] = $page; | |
285 | |
286 } | |
287 | |
288 } |