コード例 #1
0
ファイル: crawl.php プロジェクト: janladaking/CodeIgniter
 /**
  * Add or Update Group
  * @return json
  */
 function addOrEditeGroup()
 {
     $group_id = (int) $this->input->post('group_id');
     $group_name = trim($this->input->post('group_name'));
     $terms_keywords = $this->input->post('terms_keywords');
     $retailers_sites = $this->input->post('retailers_sites');
     $group_enabled = $this->input->post('group_enabled');
     if (empty($group_enabled) || $group_enabled != 'false') {
         $group_enabled = 'true';
     }
     $error = '';
     $success = '';
     $find_entity = function (&$entites, $by) {
         if (is_array($entites)) {
             foreach ($entites as $entity) {
                 $it_is = null;
                 foreach ($by as $key => $value) {
                     $it_is = (is_null($it_is) ? true : $it_is) && (isset($entity->{$key}) && $entity->{$key} == $value);
                 }
                 if ($it_is) {
                     return $entity;
                 }
             }
         }
         return null;
     };
     if (!$group_name) {
         $status = 'error';
         $error = 'Group Name filed can not be empty';
     } else {
         $status = 'ok';
         $success = 'Success';
     }
     if ($status == 'ok') {
         $this->load->model('ranking_model');
         if (!$group_id) {
             $group_id = $this->ranking_model->selectOrIKeywordGroup($group_name, false, $group_enabled);
         } else {
             $this->ranking_model->updateKeywordGroup($group_id, $group_name, $group_enabled);
         }
         if (!empty($group_id)) {
             if (!empty($terms_keywords) && is_array($terms_keywords)) {
                 $terms_keywords = array_map('trim', $terms_keywords);
                 $search_terms = $this->ranking_model->get_('search_terms', array('group_id' => $group_id));
                 // creation
                 $search_terms_added = false;
                 foreach ($terms_keywords as $kword) {
                     $kword_data = array('title' => $kword, 'group_id' => $group_id);
                     $kword_entity = $find_entity($search_terms, $kword_data);
                     if (!$kword_entity) {
                         $kword_id = $this->ranking_model->create_('search_terms', $kword_data);
                         if (!empty($kword_id)) {
                             $search_terms[] = (object) array_merge(array('id' => $kword_id), $kword_data);
                             $search_terms_added = true;
                         }
                     }
                 }
                 if ($search_terms_added) {
                     // update keyword_cron_jobs, to crawl new added search terms
                     $keyword_cron_jobs = $this->ranking_model->getParentCronJobsByGroup($group_id);
                     $keyword_cron_jobs_ids = array_map(function ($cron_job) {
                         return $cron_job->id;
                     }, $keyword_cron_jobs);
                     if (!empty($keyword_cron_jobs_ids)) {
                         // crawl/keyword_cron_job will recheck these groups, and create new cron jobs
                         $this->ranking_model->changeCronJobStatus($keyword_cron_jobs_ids, $this->ranking_model->CRON_STATUS_WAITING);
                     }
                 }
                 // deletion
                 foreach ($search_terms as $search_term_obj) {
                     if (!in_array($search_term_obj->title, $terms_keywords)) {
                         $this->ranking_model->delete_('search_terms', array('id' => $search_term_obj->id));
                     }
                 }
             }
             if (!empty($retailers_sites) && is_array($retailers_sites)) {
                 $groups_sites = $this->ranking_model->get_('groups_sites', array('group_id' => $group_id));
                 // creation
                 $user_id = $this->session->userdata('user_id');
                 foreach ($retailers_sites as $site_id) {
                     $groups_sites_data = array('group_id' => $group_id, 'site_id' => $site_id);
                     $groups_sites_entity = $find_entity($groups_sites, $groups_sites_data);
                     if (!$groups_sites_entity) {
                         $groups_sites_id = $this->ranking_model->create_('groups_sites', $groups_sites_data);
                         if (!empty($groups_sites_id)) {
                             $groups_sites[] = (object) array_merge(array('id' => $groups_sites_id), $groups_sites_data);
                             if (!empty($search_terms)) {
                                 $this->ranking_model->addCronJob($group_id, $site_id, '', 0, $user_id);
                             }
                         }
                     }
                 }
                 // deletion
                 foreach ($groups_sites as $groups_sites_obj) {
                     if (!in_array($groups_sites_obj->site_id, $retailers_sites)) {
                         $this->ranking_model->delete_('groups_sites', array('id' => $groups_sites_obj->id));
                     }
                 }
             }
         }
     }
     $this->output->set_content_type('application/json')->set_output(json_encode(array('status' => $status, 'error' => $error, 'success' => $success)));
 }
コード例 #2
0
ファイル: system.php プロジェクト: janladaking/CodeIgniter
 /**
  * Import Search terms groups (including search terms), 'search terms groups - sites'
  * relations as json file
  */
 public function search_terms_groups_import()
 {
     session_id() || session_start();
     $result = array();
     $this->load->model('ranking_model');
     $this->load->model('alert_model');
     $file_to_get = null;
     if (isset($_FILES['file'], $_FILES['file']['error'])) {
         // uploading file
         if ($_FILES['file']['error'] == 0) {
             // resave it, to keep after this script finishes
             if ($temp_file_name = tempnam(sys_get_temp_dir(), '')) {
                 if (copy($_FILES['file']['tmp_name'], $temp_file_name)) {
                     $_SESSION['stgs_imp_tmp_file'] = $temp_file_name;
                     unset($_SESSION['stgs_imp_answers']);
                     unset($_SESSION['stgs_imp_answers_others']);
                     $file_to_get = $temp_file_name;
                 } else {
                     $result['error'] = 'Can\'t save file (writing)';
                 }
             } else {
                 $result['error'] = 'Can\'t save file (creating)';
             }
         } else {
             $this->lang->load('upload');
             $_FILES['file']['error'] = isset($_FILES['file']['error']) ? $_FILES['file']['error'] : 4;
             switch ($_FILES['file']['error']) {
                 case 1:
                     // UPLOAD_ERR_INI_SIZE
                     $result['error'] = $this->lang->line('upload_file_exceeds_limit');
                     break;
                 case 2:
                     // UPLOAD_ERR_FORM_SIZE
                     $result['error'] = $this->lang->line('upload_file_exceeds_form_limit');
                     break;
                 case 3:
                     // UPLOAD_ERR_PARTIAL
                     $result['error'] = $this->lang->line('upload_file_partial');
                     break;
                 case 4:
                     // UPLOAD_ERR_NO_FILE
                     $result['error'] = $this->lang->line('upload_no_file_selected');
                     break;
                 case 6:
                     // UPLOAD_ERR_NO_TMP_DIR
                     $result['error'] = $this->lang->line('upload_no_temp_directory');
                     break;
                 case 7:
                     // UPLOAD_ERR_CANT_WRITE
                     $result['error'] = $this->lang->line('upload_unable_to_write_file');
                     break;
                 case 8:
                     // UPLOAD_ERR_EXTENSION
                     $result['error'] = $this->lang->line('upload_stopped_by_extension');
                     break;
                 default:
                     $result['error'] = "Unknown error";
                     break;
             }
         }
     } elseif (isset($_SESSION['stgs_imp_tmp_file'])) {
         // get saved filename
         if (is_file($_SESSION['stgs_imp_tmp_file'])) {
             $file_to_get = $_SESSION['stgs_imp_tmp_file'];
         } else {
             // wipe all data, as it got outdated
             unset($_SESSION['stgs_imp_tmp_file']);
             unset($_SESSION['stgs_imp_answers']);
             unset($_SESSION['stgs_imp_answers_others']);
         }
     }
     if ($file_to_get) {
         if (($stgs_imp = json_decode(file_get_contents($file_to_get), true)) && is_array($stgs_imp)) {
             if (($answer = $this->input->post('answer')) && isset($answer['group_name'], $answer['action']) && in_array($answer['action'], array('overwrite', 'add'))) {
                 // get user's answers
                 $_SESSION['stgs_imp_answers'][strtolower($answer['group_name'])] = $answer['action'];
                 if (isset($answer['others']) && $answer['others']) {
                     $_SESSION['stgs_imp_answers_others'] = $answer['action'];
                 }
             }
             $stgs_imp_answers = isset($_SESSION['stgs_imp_answers']) ? $_SESSION['stgs_imp_answers'] : array();
             $stgs_imp_answers_others = isset($_SESSION['stgs_imp_answers_others']) ? $_SESSION['stgs_imp_answers_others'] : null;
             $entites = array();
             $stgs_cmp = $this->get_search_terms_groups_for_export($entites);
             // search_terms_groups for comparison
             $stgs_cmp_names = array_combine(array_map('strtolower', array_keys($stgs_cmp)), array_keys($stgs_cmp));
             $stgs_to_create = array();
             $stgs_to_overwrite = array();
             $stgs_to_add = array();
             $stgs_to_populate = array();
             /**
              * find entity by params
              * @param string $entity_name entity type (search_terms_groups, sites, groups_sites)
              * @param array $by array of params to search by
              * @param bool $cs whether search should be case sensitive
              * @param string $trim characters that need to be stripped
              */
             $find_entity = function ($entity_type, $by, $cs = false, $trim = '') use($entites) {
                 if (isset($entites[$entity_type])) {
                     foreach ($entites[$entity_type] as $entity) {
                         $it_is = null;
                         foreach ($by as $key => $value) {
                             if (!isset($entity[$key])) {
                                 return null;
                             } else {
                                 $val1 = trim($entity[$key], $trim);
                                 $val2 = trim($value, $trim);
                                 $cmp_f = $cs ? 'strcmp' : 'strcasecmp';
                                 $it_is = (is_null($it_is) ? true : $it_is) && $cmp_f($val1, $val2) === 0;
                             }
                         }
                         if ($it_is) {
                             return $entity;
                         }
                     }
                 }
                 return null;
             };
             foreach ($stgs_imp as $stg_imp_name => $stg_imp) {
                 $stg_imp_name_low = strtolower($stg_imp_name);
                 if (!isset($stgs_cmp_names[$stg_imp_name_low])) {
                     $stgs_to_create[$stg_imp_name] = $stg_imp;
                 } else {
                     $stg_cmp = $stgs_cmp[$stgs_cmp_names[$stg_imp_name_low]];
                     if ($this->search_terms_groups_compare($stg_imp, $stg_cmp)) {
                         continue;
                     }
                     if (isset($stgs_imp_answers[$stg_imp_name_low]) || $stgs_imp_answers_others) {
                         $action = isset($stgs_imp_answers[$stg_imp_name_low]) ? $stgs_imp_answers[$stg_imp_name_low] : $stgs_imp_answers_others;
                         if ($action == 'overwrite') {
                             // check whether existing search terms are used in alerts
                             // get search terms ids
                             $search_terms_ids = array();
                             foreach ($stg_imp['search_terms'] as $search_term_title) {
                                 $search_term = $find_entity('search_terms', array('title' => $search_term_title, 'group_name' => $stg_imp_name));
                                 if (!empty($search_term['id'])) {
                                     $search_terms_ids[] = $search_term['id'];
                                 }
                             }
                             if (!empty($search_terms_ids)) {
                                 $will_break_alert = false;
                                 $alerts = $this->alert_model->getRecords();
                                 foreach ($alerts as $alert) {
                                     $alert->options = unserialize($alert->options);
                                     $alert_search_terms_ids = array();
                                     if (!empty($alert->options['rank_term']['all_checked_checkboxes'])) {
                                         foreach ($alert->options['rank_term']['all_checked_checkboxes'] as $gr_id => $gr) {
                                             $gr_search_terms_ids = empty($gr['id']) ? array() : $gr['id'];
                                             $alert_search_terms_ids = array_merge($alert_search_terms_ids, $gr_search_terms_ids);
                                         }
                                     }
                                     $array_intersect = array_intersect($search_terms_ids, $alert_search_terms_ids);
                                     if (!empty($array_intersect)) {
                                         $will_break_alert = $alert->name;
                                         break;
                                     }
                                 }
                                 if ($will_break_alert) {
                                     $result['question'] = array('alert_name' => $will_break_alert, 'group_name' => $stg_imp_name);
                                 }
                             }
                             $stgs_to_overwrite[$stg_imp_name] = $stg_imp;
                         } elseif ($action == 'add') {
                             $stgs_to_add[$stg_imp_name] = $stg_imp;
                         }
                     } else {
                         $result['question'] = array('group_name' => $stg_imp_name);
                         break;
                     }
                 }
             }
             if (!isset($result['question'])) {
                 // make import
                 foreach ($stgs_to_add as $stg_name => $stg) {
                     // find data to be added
                     if ($stg_entity = $find_entity('search_terms_groups', array('name' => $stg_name))) {
                         $stg_id = $stg_entity['id'];
                         $stg_cmp = $stgs_cmp[$stgs_cmp_names[strtolower($stg_name)]];
                         $search_terms_batch = array();
                         $stg_search_terms = array_combine(array_map('strtolower', $stg['search_terms']), $stg['search_terms']);
                         $stg_cmp_search_terms = array_combine(array_map('strtolower', $stg_cmp['search_terms']), $stg_cmp['search_terms']);
                         foreach (array_diff_key($stg_search_terms, $stg_cmp_search_terms) as $search_term) {
                             $search_terms_batch[] = array('title' => $search_term, 'group_id' => $stg_id);
                         }
                         if ($search_terms_batch) {
                             $this->ranking_model->create_batch_('search_terms', $search_terms_batch);
                         }
                         $prepare_sites = function ($site) {
                             $site['url'] = trim($site['url'], '/');
                             return strtolower(serialize($site));
                         };
                         $stg_sites = array_combine(array_map($prepare_sites, $stg['sites']), $stg['sites']);
                         $stg_cmp_sites = array_combine(array_map($prepare_sites, $stg_cmp['sites']), $stg_cmp['sites']);
                         $sites_to_add = array_diff_key($stg_sites, $stg_cmp_sites);
                         $groups_sites_batch = array();
                         foreach ($sites_to_add as $site_to_add) {
                             if ($site_entity = $find_entity('sites', $site_to_add, false, ' /')) {
                                 $site_id = $site_entity['id'];
                             } else {
                                 $site_data = array('name' => '', 'url' => '', 'image_url' => '', 'site_type' => 0);
                                 $site_data = array_merge($site_data, array_intersect_key($site_to_add, $site_data));
                                 $site_id = $this->ranking_model->create_('sites', $site_data);
                             }
                             $groups_sites_batch[] = array('group_id' => $stg_id, 'site_id' => $site_id);
                         }
                         if ($groups_sites_batch) {
                             $this->ranking_model->create_batch_('groups_sites', $groups_sites_batch);
                         }
                     }
                 }
                 foreach ($stgs_to_overwrite as $stg_name => $stg) {
                     // delete current stg's all corresponding data
                     if ($stg_entity = $find_entity('search_terms_groups', array('name' => $stg_name))) {
                         $stg['id'] = $stg_entity['id'];
                         $this->ranking_model->delete_('search_terms', array('group_id' => $stg['id']));
                         $this->ranking_model->delete_('groups_sites', array('group_id' => $stg['id']));
                         $stgs_to_populate[$stg_name] = $stg;
                     }
                 }
                 foreach ($stgs_to_create as $stg_name => $stg) {
                     // create stg & set it up for fetching keyword data by cron
                     if ($stg['id'] = $this->ranking_model->create_('search_terms_groups', array('name' => $stg_name))) {
                         $this->ranking_model->addKeywordGroupCronJob($stg['id'], $this->ranking_model->CRON_PERIOD_DAY);
                     }
                     $stgs_to_populate[$stg_name] = $stg;
                 }
                 foreach ($stgs_to_populate as $stg_name => $stg) {
                     // populate stg with all corresponding data
                     if (!isset($stg['id'])) {
                         continue;
                     }
                     $search_terms_batch = array();
                     foreach ($stg['search_terms'] as $search_term) {
                         $search_terms_batch[] = array('title' => $search_term, 'group_id' => $stg['id']);
                     }
                     if ($search_terms_batch) {
                         $this->ranking_model->create_batch_('search_terms', $search_terms_batch);
                     }
                     $groups_sites_batch = array();
                     foreach ($stg['sites'] as $site) {
                         if ($site_entity = $find_entity('sites', $site, false, ' /')) {
                             $site_id = $site_entity['id'];
                         } else {
                             $site_data = array('name' => '', 'url' => '', 'image_url' => '', 'site_type' => 0);
                             $site_data = array_merge($site_data, array_intersect_key($site, $site_data));
                             $site_id = $this->ranking_model->create_('sites', $site_data);
                         }
                         $groups_sites_batch[] = array('group_id' => $stg['id'], 'site_id' => $site_id);
                     }
                     if ($groups_sites_batch) {
                         $this->ranking_model->create_batch_('groups_sites', $groups_sites_batch);
                     }
                 }
                 $result['result'] = 'Search terms groups were inported successfully';
             }
         } else {
             $result['error'] = json_last_error_msg() ? 'JSON error: ' . json_last_error_msg() : 'Wrong data format (not an array)';
         }
     } else {
         $result['error'] = 'No file';
     }
     $this->output->set_content_type('application/json')->set_output(json_encode($result));
 }