Gentics Portal.Node PHP API
 All Classes Namespaces Functions Variables Pages
BulkController.php
1 <?php
2 /**
3  * Gentics Portal.Node PHP
4  * Author & Copyright (c) by Gentics Software GmbH
5  * sales@gentics.com
6  * http://www.gentics.com
7  * Licenses can be found in the LICENSE.txt file in the root-folder of this installation
8  * You must not use this software without a valid license agreement.
9  *
10  * Comment controller class file.
11  *
12  * @author Vitalii Kovalchuk <vitaly.kovalchuk@oberig.com>
13  */
14 
15 /**
16  * Comment controller class
17  *
18  * @author Vitalii Kovalchuk <vitaly.kovalchuk@oberig.com>
19  *
20  */
22 {
23  /**
24  *
25  * @var _users
26  * @desc user AR container
27  */
28  private $_users;
29 
30  /**
31  * Defines filters
32  *
33  * @return array
34  */
35  public function filters()
36  {
37  return array(
38  'accessControl'
39  );
40  }
41 
42  public function accessRules()
43  {
44  return array(
45  array(
46  'allow',
47  'roles' => array('Admin')
48  ),
49  array(
50  'deny',
51  'users' => array('*')
52  )
53  );
54  }
55 
56  /**
57  * Inits data
58  *
59  * @return array
60  */
61  public function init()
62  {
63  $logRouter = Yii::app()->getComponent('log');
64  Yii::getLogger()->detachEventHandler('onFlush', array($logRouter, 'collectLogs'));
65  Yii::app()->detachEventHandler('onEndRequest', array($logRouter, 'processLogs'));
66  }
67 
68 
69  /**
70  * default action
71  * will show module menu
72  *
73  * @return bool
74  */
75  public function actionIndex()
76  {
77  $model = new GenerationForm();
78 
79  $usersQty = User::model()->count('is_bulk = :is_bulk', array(':is_bulk' => true));
80 
81  $likesQty = Yii::app()->db->createCommand()
82  ->select('count(*)')
83  ->from(Like::model()->tableName())
84  ->join(User::model()->tableName() . ' as u', 'u.id = user_id')
85  ->where('is_bulk = :is_bulk', array(':is_bulk' => true))
86  ->queryScalar();
87 
88  $commentsQty = Yii::app()->db->createCommand()
89  ->select('count(*)')
90  ->from(Comment::model()->tableName())
91  ->join(User::model()->tableName() . ' as u', 'u.id = user_id')
92  ->where('is_bulk = :is_bulk', array(':is_bulk' => true))
93  ->queryScalar();
94 
95  if (isset($_POST['GenerationForm'])) {
96  $model->attributes = $_POST['GenerationForm'];
97  if ($model->validate()) {
98  $this->redirect('/bulk/bulk/generate?' . http_build_query($_POST));
99  }
100  }
101 
102  $this->render('index', array('model' => $model, 'usersQty' => $usersQty, 'likesQty' => $likesQty, 'commentsQty' => $commentsQty));
103  }
104 
105  /**
106  * action for displaying generation form and some statistics
107  *
108  * @return void
109  */
110  public function actionGenerate()
111  {
112  if (isset($_GET['GenerationForm'])) {
113  $model = new GenerationForm();
114  $model->attributes = $_GET['GenerationForm'];
115  set_time_limit(0);
116  $start = microtime(true);
117  $usersCreated = 0;
118  if (!empty($model->usersQty)) {
119  $usersCreated = $this->_generateUsers($model->usersQty);
120  }
121 
122  $likesCreated = 0;
123  if (!empty($model->likesQty)) {
124  if (($likesCreated = $this->_generateLikes($model->likesQty, $model->likesContentId)) === false) {
125  Yii::app()->user->setFlash('error', BulkModule::t('There is no bulk users(free bulk users)! Cant create likes'));
126  }
127  }
128 
129  $commentsCreated = 0;
130  if (!empty($model->commentsQty)) {
131  if (($commentsCreated = $this->_generateComments($model->commentsQty, $model->commentsContentId, $model->commentsForEach)) === false) {
132  Yii::app()->user->setFlash('error', BulkModule::t('There is no bulk users! Cant create comments'));
133  }
134  }
135 
136  $totalTime = round(microtime(true) - $start, 4);
137  $this->render(
138  'bulk.views.bulk.generate',
139  array('usersCreated' => $usersCreated, 'likesCreated' => $likesCreated, 'commentsCreated' => $commentsCreated, 'time' => $totalTime)
140  );
141  } else {
142  $this->redirect('index');
143  }
144  }
145 
146  /**
147  * action for users generation
148  *
149  * @param int $qty required user's quantity
150  *
151  * @return int
152  */
153  private function _generateUsers($qty)
154  {
155  $stamp = time();
156  $db = Yii::app()->db->beginTransaction();
157  $profile = new Profile;
158  $faker = new Faker();
159  $locale = include Yii::getPathOfAlias('system') . '/i18n/data/en.php';
160  $countries = array_values($locale['territories']);
161 
162  $createdQty = 0;
163  for ($i = 1; $i <= $qty; $i++) {
164  $user = new User();
165  $user->is_bulk = true;
166  $user->activkey = md5('user' . $i . '_' . $stamp);
167  $user->attributes = array(
168  'username' => 'user' . $i . '_' . $stamp,
169  'password' => md5('user' . $i . '_' . $stamp),
170  'email' => 'user' . $i . '_' . $stamp . '@example.com',
171  'status' => 1,
172  );
173  if ($user->save()) {
174  $firstname = $faker->Name->prefix() . $faker->Name->first_name();
175  $lastname = $faker->Name->surname() . ' ' . $faker->Name->suffix();
176 
177  $profile->setIsNewRecord(true);
178  $profile->regMode = true;
179  $profile->user_id = $user->id;
180  foreach (Profile::model()->getFields() as $field) {
181  $value = null;
182  if ($field->range) {
183  $pos = strpos($field->range, '-');
184  if ($pos !== false) {
185  $tag = substr($field->range, 0, $pos);
186  switch ($tag) {
187  case 'checkbox':
188  $field->range = substr($field->range, $pos + 1);
189  break;
190  case 'radio':
191  $field->range = substr($field->range, $pos + 1);
192  break;
193  case 'select':
194  $field->range = substr($field->range, $pos + 1);
195  break;
196  default:
197  break;
198  }
199  }
200  $value = array_rand(Profile::range($field->range));
201  } elseif ($field->field_type == 'VARCHAR') {
202  $value = $this->_randStr(rand($field->field_size_min, $field->field_size));
203  } elseif ($field->field_type == 'DATE') {
204  $value = date('Y-m-d', $stamp - 20 * 368 * 24 * 60 * 60);
205  } else {
206  $value = rand($field->field_size_min, $field->field_size);
207  }
208  $profile->{$field->varname} = $value;
209  }
210 
211  $profile->attributes = array(
212  'firstname' => $firstname,
213  'lastname' => $lastname,
214  );
215  if ($profile->save()) {
216  $createdQty++;
217  } else {
218  //var_dump($profile->getErrors());
219  }
220 
221  } else {
222  //var_dump($user->getErrors());
223  }
224  }
225  $db->commit();
226 
227  return $createdQty;
228  }
229 
230  /**
231  * Action for Likes generation
232  *
233  * @param int $qty required likes quantity
234  * @param int|string $contentId string contentId that should be
235  *
236  * @return bool
237  */
238  private function _generateLikes($qty, $contentId = 0)
239  {
240  $userIds = false;
241  $bulkUsers = Yii::app()->db->createCommand()
242  ->select('u.id')
243  ->from(User::model()->tableName() . ' u');
244  if ($contentId) {
245  $bulkUsers->where(
246  'is_bulk = :is_bulk and id not in ( SELECT user_id from {{likes}} where content_id=:content_id)',
247  array(':content_id' => $contentId, ':is_bulk' => true)
248  );
249  } else {
250  $bulkUsers->where('is_bulk = :is_bulk', array(':is_bulk' => true));
251  }
252  $bulkUsers = $bulkUsers->queryAll();
253  if (!empty($bulkUsers)) {
254  $userIds = array_map(
255  function ($user) {
256  return $user['id'];
257  }, $bulkUsers
258  );
259  }
260 
261  if ($userIds) {
262  $transaction = Yii::app()->db->beginTransaction();
263  $createdQty = 0;
264  $like = new Like();
265  $userCount = count($userIds);
266  for ($i = 0; $i < $qty; $i++) {
267  if (!empty($contentId) && $i >= $userCount) {
268  break;
269  }
270  $like->id = null;
271  $like->setIsNewRecord(true);
272  $like->user_id = $userIds[$i % $userCount];
273  $like->content_id = empty($contentId) ? uniqid('', true) : $contentId;
274  $like->createdate = date('Y-m-d H:i:s');
275  if ($like->save()) {
276  $createdQty++;
277  }
278  }
279  $transaction->commit();
280  return $createdQty;
281  } else {
282  return false;
283  }
284  }
285 
286  /**
287  * Action for Comments generation
288  *
289  * @param int $qty required likes quantity
290  * @param int|string $contentId string contentId that should be
291  * @param bool $forEachUser defines if given quantity is for each user or total
292  *
293  * @return bool
294  */
295  private function _generateComments($qty, $contentId = 0, $forEachUser = false)
296  {
297  if ($users = $this->_getBulkUsers()) {
298  $createdQty = 0;
299  $userCount = count($users);
300  $faker = new Faker();
301  if ($forEachUser) {
302  foreach ($users as $u) {
303  for ($i = 0; $i < $qty; $i++) {
304  $comment = new Comment();
305  $comment->setIsNewRecord(true);
306  $comment->content_id = empty($contentId) ? uniqid('', true) : $contentId;
307  $comment->user_id = $u['id'];
308  $comment->email = $u['email'];
309  $comment->subject = $faker->Lorem->sentence(1);
310  $comment->description = $faker->Lorem->sentence(20);
311  $comment->language = 'en';
312  $comment->status = Comment::APPROVED;
313  $comment->notify_moderator = true;
314  $comment->notify_user = true;
315  if ($comment->save()) {
316  $createdQty++;
317  }
318  }
319  }
320  } else {
321  for ($i = 0; $i < $qty; $i++) {
322  $comment = new Comment();
323  $comment->setIsNewRecord(true);
324  $comment->content_id = empty($contentId) ? uniqid('', true) : $contentId;
325  $comment->user_id = $users[$i % $userCount]['id'];
326  $comment->email = $users[$i % $userCount]['email'];
327  $comment->subject = $faker->Lorem->sentence(1);
328  $comment->description = $faker->Lorem->sentence(20);
329  $comment->language = 'en';
330  $comment->status = Comment::APPROVED;
331  $comment->notify_moderator = true;
332  $comment->notify_user = true;
333  if ($comment->save()) {
334  $createdQty++;
335  }
336  }
337  }
338  return $createdQty;
339  } else {
340  return false;
341  }
342  }
343 
344  /**
345  * private method that gets list if user ids generated by this module
346  *
347  * @return bool | array
348  */
349  private function _getBulkUsersIds()
350  {
351  $bulkUsers = Yii::app()->db->createCommand()
352  ->select('id')
353  ->from(User::model()->tableName())
354  ->where('is_bulk = :is_bulk', array(':is_bulk' => true))
355  ->queryAll(false);
356  if (!empty($bulkUsers)) {
357  $userIds = array_map(
358  function ($user) {
359  return $user[0];
360  }, $bulkUsers
361  );
362  return $userIds;
363  }
364  return false;
365  }
366 
367  /**
368  * private method that gets list if users generated by this module
369  *
370  * @return bool | array
371  */
372  private function _getBulkUsers()
373  {
374  $bulkUsers = Yii::app()->db->createCommand()
375  ->select('id, email')
376  ->from(User::model()->tableName())
377  ->where('is_bulk = :is_bulk', array(':is_bulk' => true))
378  ->limit(10000)
379  ->queryAll(false);
380  if (!empty($bulkUsers)) {
381 
382  $usersData = array();
383  foreach ($bulkUsers as $user) {
384  $usersData[] = array('id' => $user[0], 'email' => $user[1]);
385  }
386 
387  return $usersData;
388  }
389  return false;
390  }
391 
392  /**
393  * private method that gets list if users generated by this module
394  *
395  * @param string $type defines what type of data should be deleted
396  *
397  * @return bool | array
398  */
399  public function actionClear($type)
400  {
401  $usersQty = 0;
402  $likesQty = 0;
403  $commentsQty = 0;
404 
405  if ($userIds = $this->_getBulkUsersIds()) {
406  $userIdsStr = implode(',', $userIds);
407  if ($type == 'all') {
408  $likesQty = Yii::app()->db->createCommand()->delete(Like::model()->tableName(), "user_id in ($userIdsStr)");
409  $commentsQty = Yii::app()->db->createCommand()->delete(Comment::model()->tableName(), "user_id in ($userIdsStr)");
410  Yii::app()->db->createCommand()->delete(Profile::model()->tableName(), "user_id in ($userIdsStr)");
411  $usersQty = Yii::app()->db->createCommand()->delete(User::model()->tableName(), "is_bulk = :is_bulk", array(':is_bulk' => true));
412  } elseif ($type == 'likes') {
413  $likesQty = Yii::app()->db->createCommand()->delete(Like::model()->tableName(), "user_id in ($userIdsStr)");
414  } elseif ($type == 'comments') {
415  $commentsQty = Yii::app()->db->createCommand()->delete(Comment::model()->tableName(), "user_id in ($userIdsStr)");
416  }
417  }
418 
419  $this->render('bulk.views.bulk.clear', array('usersQty' => $usersQty, 'likesQty' => $likesQty, 'commentsQty' => $commentsQty));
420 
421  }
422 
423  /**
424  * function will return string of chars with given length
425  *
426  * @param int $length length of string to return
427  *
428  * @return string
429  */
430  private function _randStr($length = 0)
431  {
432  $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
433  $randomString = '';
434  for ($i = 0; $i < $length; $i++) {
435  $randomString .= $characters[rand(0, strlen($characters) - 1)];
436  }
437  return $randomString;
438  }
439 }