/**
  * Register Form
  */
 public function actionRegister()
 {
     $register = new RegisterForm(ControllerCore::REQUIRE_CAPTCHA_SCENARIO);
     if (isset($_POST[CHtml::modelName($register)])) {
         $register->attributes = $_POST[CHtml::modelName($register)];
         if ($register->save()) {
             $form = new LoginUser();
             $form->username = $register->email;
             $form->password = $_POST[CHtml::modelName($register)]['password'];
             $form->rememberMe = 0;
             /**
              * Generate random Assignment for newly registered user
              */
             $user = $register->user;
             $criteria = new CDbCriteria();
             $criteria->with = ['corpusParseTreeConsensus'];
             $criteria->order = 'rand()';
             $ratio = ['definitive' => 5, 'challenge' => ['limit' => 15, 'range' => [1000, 2000]], 'corpus' => ['Tutorial' => 5]];
             $criteriaGolden = new CDbCriteria();
             $criteriaGolden->mergeWith($criteria);
             $criteriaGolden->addCondition('corpusParseTreeConsensus.corpusParseTreeStringID is not null');
             $criteriaGolden->limit = $ratio['definitive'];
             $stringsGolden = CorpusParseTreeString::model()->findAll($criteriaGolden);
             $criteriaChallenge = new CDbCriteria();
             $criteriaChallenge->mergeWith($criteria);
             $criteriaChallenge->addCondition('corpusParseTreeConsensus.corpusParseTreeStringID is null');
             $criteriaChallenge->addCondition('ID >= :min and ID <= :max');
             $criteriaChallenge->params = [':min' => $ratio['challenge']['range'][0], ':max' => $ratio['challenge']['range'][1]];
             $criteriaChallenge->limit = $ratio['challenge']['limit'];
             $stringsChallenge = CorpusParseTreeString::model()->findAll($criteriaChallenge);
             $stringsTutorial = [];
             foreach ($ratio['corpus'] as $corpusName => $limit) {
                 $criteriaTutorial = new CDbCriteria();
                 $criteriaTutorial->mergeWith($criteria);
                 $criteriaTutorial->with[] = 'corpusParseTree';
                 $criteriaTutorial->limit = $limit;
                 $criteriaTutorial->compare('corpusParseTree.name', $corpusName);
                 $stringsTutorial = array_merge($stringsTutorial, CorpusParseTreeString::model()->findAll($criteriaTutorial));
             }
             foreach ([$stringsTutorial, $stringsGolden, $stringsChallenge] as $parts) {
                 foreach ($parts as $string) {
                     /* @var $string CorpusParseTreeString */
                     $assigned = new StringAssigned();
                     $assigned->userID = $user->ID;
                     $assigned->corpusParseTreeStringID = $string->ID;
                     $assigned->save();
                 }
             }
             /**
              * End Generate random Assignment
              */
             if ($form->validate() && $form->login()) {
                 $this->emailVerify($register->user);
                 $this->redirect(['/parser']);
             }
         }
     }
     $this->render('register', ['register' => $register]);
 }
 /**
  * Retrieve documents based on given string ID
  * @param string $stringsID list of ID of range of ID unified by a string.
  *                          eg. 1,2,4-5,22
  * @return \CorpusParseTreeString[]
  */
 protected function retrieveDocumentsByStringID($stringsID)
 {
     $userWeb = UserWeb::instance();
     $user = $userWeb->user();
     /* @var $user User */
     $documents = [];
     foreach ($stringsID as $stringID) {
         $condition = explode('-', $stringID);
         $case = count($condition);
         switch ($case) {
             case 1:
                 $document = $user->moderator ? CorpusParseTreeString::model()->findByPk($condition[0]) : CorpusParseTreeString::model()->with('stringAssigneds')->findByPk($condition[0], 'stringAssigneds.userID=:currentUserID', [':currentUserID' => $user->ID]);
                 if ($document) {
                     $documents[] = $document;
                 }
                 break;
             case 2:
                 $retrieved = $user->moderator ? CorpusParseTreeString::model()->findAll('ID>=:min and ID<=:max', [':min' => $condition[0], ':max' => $condition[1]]) : CorpusParseTreeString::model()->with('stringAssigneds')->findAll('ID>=:min and ID<=:max and stringAssigneds.userID=:currentUserID', [':min' => $condition[0], ':max' => $condition[1], ':currentUserID' => $user->ID]);
                 $documents = array_merge($documents, $retrieved);
                 break;
         }
     }
     return $documents;
 }