Пример #1
0
 /**
  * Rebuilds the search index.
  */
 public function actionBuildIndex()
 {
     $contact = new Contacts();
     $fieldData = $contact->getFields();
     // lookup searchable fields
     $fields = array();
     for ($i = 0; $i < count($fieldData); $i++) {
         if (in_array($fieldData[$i]->type, array('dropdown', 'text', 'varchar', 'assignment')) && !in_array($fieldData[$i]->fieldName, array('firstName', 'lastName', 'updatedBy', 'priority', 'id'))) {
             //,'phone','url','email','link',
             // || !$fields[$i]->searchable
             if ($fieldData[$i]->relevance == 'High') {
                 $relevance = 3;
             } elseif ($fieldData[$i]->relevance == 'Medium') {
                 $relevance = 2;
             } else {
                 $relevance = 1;
             }
             $fields[$fieldData[$i]->fieldName] = array('type' => $fieldData[$i]->type, 'linkType' => $fieldData[$i]->linkType, 'relevance' => $relevance);
         }
     }
     $t0 = microtime(true);
     $totalCount = Yii::app()->db->createCommand('SELECT count(*) from x2_contacts;')->queryScalar();
     $dataProvider = new CSqlDataProvider('SELECT ' . implode(',', array_merge(array_keys($fields), array('id', 'visibility'))) . ' FROM x2_contacts', array('totalItemCount' => $totalCount, 'sort' => array('defaultOrder' => 'id ASC'), 'pagination' => array('pageSize' => 500)));
     $dataProvider->getData();
     $pages = $dataProvider->pagination->getPageCount();
     echo $pages . ' pages.<br>';
     $searchTerms = array();
     // $fh = fopen('search.csv','w+');
     ob_end_flush();
     $keys = array();
     $tokenChars = " \n\r\t!\$%^&*()_+-=~[]{}\\|:;'\",.<>?/`‘’•–—“”";
     $noiseWords = array('a', 'about', 'after', 'all', 'also', 'an', 'and', 'another', 'any', 'are', 'arent', 'as', 'at', 'back', 'be', 'because', 'been', 'before', 'being', 'between', 'both', 'but', 'by', 'came', 'can', 'cant', 'come', 'contact', 'contacts', 'contacted', 'could', 'data', 'did', 'didnt', 'do', 'dont', 'does', 'doesnt', 'each', 'for', 'from', 'get', 'go', 'going', 'goes', 'got', 'has', 'hasnt', 'had', 'hadnt', 'he', 'hes', 'his', 'hed', 'have', 'havent', 'her', 'hers', 'here', 'heres', 'him', 'himself', 'how', 'i', 'if', 'in', 'into', 'is', 'it', 'its', 'like', 'make', 'made', 'makes', 'many', 'me', 'might', 'mightnt', 'more', 'most', 'much', 'must', 'mustnt', 'my', 'mine', 'never', 'no', 'now', 'not', 'of', 'on', 'only', 'onto', 'or', 'other', 'our', 'out', 'over', 'said', 'same', 'see', 'she', 'shes', 'should', 'shouldnt', 'since', 'some', 'still', 'such', 'take', 'than', 'that', 'the', 'their', 'them', 'then', 'there', 'theres', 'these', 'they', 'theyre', 'this', 'those', 'through', 'to', 'too', 'today', 'under', 'up', 'very', 'want', 'wants', 'wanted', 'was', 'wasnt', 'way', 'ways', 'we', 'well', 'were', 'what', 'whats', 'where', 'which', 'while', 'who', 'why', 'will', 'with', 'would', 'wont', 'you', 'your', 'youre');
     for ($i = 1; $i <= $pages; ++$i) {
         // for($i = 1; $i<=1; ++$i) {
         $links = array();
         $dataProvider->pagination->setCurrentPage($i);
         foreach ($dataProvider->getData($i > 1) as $record) {
             // var_dump($record);
             foreach ($fields as $fieldName => &$field) {
                 // $fieldName = $field['fieldName'];
                 if (!empty($record[$fieldName])) {
                     // break string into words, and eliminate any contractions so we can safely tokenize on ' characters
                     $token = strtok(preg_replace('/(?<=\\w)\'(?=\\w)/u', '', $record[$fieldName]), $tokenChars);
                     while ($token !== false) {
                         $token = strtolower($token);
                         if (strlen($token) <= 50 && !in_array($token, $noiseWords)) {
                             $links[] = array($token, 'Contacts', $record['id'], $field['relevance'], $record['assignedTo'], $record['visibility']);
                         }
                         $token = strtok($tokenChars);
                     }
                 }
             }
             unset($field);
         }
         $sql = 'INSERT INTO x2_search (keyword, modelType, modelId, relevance, assignedTo, visibility) VALUES ';
         for ($j = 0; $j < count($links); ++$j) {
             $sql .= '(?,?,?,?,?,?)';
             if ($j < count($links) - 1) {
                 $sql .= ',';
             }
         }
         // echo $sql;
         // var_dump($links);
         // die();
         $query = Yii::app()->db->createCommand($sql);
         for ($j = 0; $j < count($links); ++$j) {
             $query = $query->bindValues(array(6 * $j + 1 => $links[$j][0], 6 * $j + 2 => $links[$j][1], 6 * $j + 3 => $links[$j][2], 6 * $j + 4 => $links[$j][3], 6 * $j + 5 => $links[$j][4], 6 * $j + 6 => $links[$j][5]));
         }
         // die(var_dump($links));
         // echo $query->getText();
         $query->execute();
         // break;
         echo "Page {$i}...done<br>";
         flush();
     }
     // Yii::app()->db->createCommand();
     echo 'Time: ' . (microtime(true) - $t0) . '<br>';
 }
Пример #2
0
 public function actionUpdateList($id)
 {
     $list = X2List::model()->findByPk($id);
     if (!isset($list)) {
         throw new CHttpException(400, Yii::t('app', 'This list cannot be found.'));
     }
     if (!$this->checkPermissions($list, 'edit')) {
         throw new CHttpException(403, Yii::t('app', 'You do not have permission to modify this list.'));
     }
     $contactModel = new Contacts();
     $comparisonList = X2List::getComparisonList();
     $fields = $contactModel->getFields(true);
     if ($list->type == 'dynamic') {
         $criteriaModels = X2ListCriterion::model()->findAllByAttributes(array('listId' => $list->id), new CDbCriteria(array('order' => 'id ASC')));
         if (isset($_POST['X2List'], $_POST['X2List']['attribute'], $_POST['X2List']['comparison'], $_POST['X2List']['value'])) {
             $attributes =& $_POST['X2List']['attribute'];
             $comparisons =& $_POST['X2List']['comparison'];
             $values =& $_POST['X2List']['value'];
             if (count($attributes) > 0 && count($attributes) == count($comparisons) && count($comparisons) == count($values)) {
                 $list->attributes = $_POST['X2List'];
                 $list->modelName = 'Contacts';
                 $list->lastUpdated = time();
                 if ($list->save()) {
                     $this->redirect(array('/contacts/contacts/list', 'id' => $list->id));
                 }
             }
         }
     } else {
         //static or campaign lists
         if (isset($_POST['X2List'])) {
             $list->attributes = $_POST['X2List'];
             $list->modelName = 'Contacts';
             $list->lastUpdated = time();
             $list->save();
             $this->redirect(array('/contacts/contacts/list', 'id' => $list->id));
         }
     }
     if (empty($criteriaModels)) {
         $default = new X2ListCriterion();
         $default->value = '';
         $default->attribute = '';
         $default->comparison = 'contains';
         $criteriaModels[] = $default;
     } else {
         if ($list->type = 'dynamic') {
             foreach ($criteriaModels as $criM) {
                 if (isset($fields[$criM->attribute])) {
                     if ($fields[$criM->attribute]->type == 'link') {
                         $criM->value = implode(',', array_map(function ($c) {
                             list($name, $id) = Fields::nameAndId($c);
                             return $name;
                         }, explode(',', $criM->value)));
                     }
                 }
             }
         }
     }
     $this->render('updateList', array('model' => $list, 'criteriaModels' => $criteriaModels, 'users' => User::getNames(), 'comparisonList' => $comparisonList, 'listTypes' => array('dynamic' => Yii::t('contacts', 'Dynamic'), 'static' => Yii::t('contacts', 'Static')), 'itemModel' => $contactModel));
 }