-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathajax.php
210 lines (149 loc) · 4.62 KB
/
ajax.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
<?php
// Libs
require('lib/idiorm.php');
require('lib/paris.php');
// Models
require('models.php');
// Config
require('config.php');
// Für UTF-8
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
// Extraktoren
$extractor = array();
require('extractors.php');
// Normaler Backbone-Sync-Ajax-Handler
function ajax_sync() {
global $modellist;
$method = $_REQUEST['backbone_method'];
$model = $_REQUEST['backbone_model'];
// Sicherstellen, dass nur Models bearbeitet werden, die wir auch unterstützten
if (!in_array($model, $modellist)) {
die('Security Error');
}
// Convert the incoming json data into an associative array
if (isset($_REQUEST['content'])) {
$vars = json_decode($_REQUEST['content'], true);
}
switch ($method) {
// This is the read method.
// Most of the data will be retrieved via the init method and cached in the client's browser, so this will be rarely used
case 'read':
if (isset($_REQUEST['content']) && !empty($_REQUEST['content'])) {
// 'content' ist direkt eine ID, daher wird nicht $vars benutzt
$result = Model::factory($model)->find_one($_REQUEST['content']);
$response = $result->as_array();
} else {
// Spezialbehandlung für posts... nur die holen, die nicht gelesen sind.
if($model == 'Post') {
$results = Model::factory($model)->where_null('posted')->find_many();
} else {
$results = Model::factory($model)->find_many();
}
$response = array();
if(count($results) > 0) {
if(is_array($results[0])) {
// Array von Daten-Arrays
$response = $results;
} else {
// Array von Models - in einen Array umpacken.
foreach ($results as $result) {
$response[] = $result->as_array();
}
}
} // end: If results > 0
} // end: find_one or find_many
echo json_encode($response);
break;
case 'create':
$new_object = Model::factory($model)->create($vars);
echo json_encode($new_object->as_array());
break;
case 'update':
$update_object = array();
if($model == 'Post') {
$update_object = Post::update($vars);
}
echo json_encode($update_object->as_array());
break;
case 'delete':
$delete_object = Model::factory($model)->find_one($vars['id']);
$delete_object->delete();
echo json_encode(array('deleted' => true));
break;
}
exit();
}
function ajax_insertmulti() {
if(!isset($_REQUEST['urls'])) {
die("Du musst das richtige Formular benutzen.");
}
$urls = explode("\n", $_REQUEST['urls']);
// Füge alle neuen URLs ein
foreach($urls as $url) {
if(trim($url) == '') {
continue; // Leere URLs überspringen.
}
// Checken, ob es diese URL schon im System gibt, dann überspringen
$duplicateCheck = Model::factory('Post')->where('url', $url)->count();
if($duplicateCheck > 0) {
continue;
}
$entry = Model::factory('Post')->create(array(
'url' => $url,
'created' => date('Y-m-d H:i:s')
));
$entry->save();
}
// Gib die Anweisungen an den Client aus, wieviel noch zu refreshen ist
$num_todo = Model::factory('Post')->where_null('image')->count();
die("$num_todo");
}
function ajax_insertmulti_progess() {
global $extractor;
// Hole irgendeinen Eintrag, der noch Bearbeitung bedarf
$entry = Model::factory('Post')->where_null('image')->find_one();
if($entry === false) {
die("Nichts mehr zu tun.");
}
$data = array();
foreach($extractor as $ex) {
if($ex->is_able($entry->url)) {
$source = @file_get_contents($entry->url);
if($source === false) {
$entry->posted = date('Y-m-d H:i:s');
$entry->title = "Fehlerhaft!";
break; // Kannst aufhören, das wird hier nichts mehr.
}
$data = $ex->extract($source);
}
}
// Daten einsortieren
if(empty($data)) {
$entry->image = "none";
$entry->comment = "Keine passender Extraktor gefunden!";
} else {
$entry->image = $data['image'];
$entry->title = $data['title'];
}
$entry->save();
// Gib die Anweisungen an den Client aus, wieviel noch zu refreshen ist
// Außerdem das geänderte Objekt
$num_todo = Model::factory('Post')->where_null('image')->count();
die(json_encode(array(
'num_todo' => $num_todo,
'entry' => $entry->as_array()
)));
}
if(isset($_REQUEST['action'])) {
switch($_REQUEST['action']) {
case 'sync': // Synct die normale Datenstruktur
ajax_sync();
break;
case 'insertmulti': // Fügt viele URLs ein, die man gerade so einfügen wollte
ajax_insertmulti();
break;
case 'insertmulti_progress': // tickt weiter, damit die Webseiten abgearbeitet werden können
ajax_insertmulti_progess();
break;
}
}