3v4l.org

run code in 150+ php & hhvm versions
Bugs & Features
<?php class Solr_Importer_Ee { protected $_restClient = null; protected $_solr = null; public function __construct(Solr $solr) { $this->_solr = $solr; $this->_restClient = $solr->getRestClient(); } public function update() { $this->_bootstrap(); $items = $this->getItems('updated_date > '.$GLOBALS['_SOLR']['lastRunTime']); $client = $this->_restClient; $cores = $this->_solr->config('ee_cores'); $client->setCore($cores[0]); $model = new Solr_Model_Ee(); foreach ($items as $item) { $client->add($model->as_document($item)); } } public function reindex() { $this->_bootstrap(); $client = $this->_restClient; $cores = $this->_solr->config('ee_cores'); $liveCore = $cores[0]; $deckCore = $cores[1]; echo "using $deckCore...\n"; $this->_restClient->setCore($deckCore); $this->_restClient->deleteIndex(); echo "Starting data import into index...\n"; @set_time_limit(-1); // Expand upon ExpressionEngines timeouts, set to infinite. $items = $this->getItems(); $model = new Solr_Model_Ee(); foreach ($items as $item) { $client->add($model->as_document($item)); } $this->_restClient->swapCores($deckCore, $liveCore); } /** * Bootstraps EE * @throws Exception * @return */ protected function _bootstrap() { try { $system_path = realpath($this->_solr->getAppDir().$this->_solr->config('ee_app_path')); set_include_path(get_include_path() . PATH_SEPARATOR . $system_path); // Here, if we don't create that controller, it won't work // class Required_Controller extends CI_Controller {} $assign_to_config['enable_query_strings'] = TRUE; $assign_to_config['subclass_prefix'] = 'EE_'; if (realpath($system_path) !== FALSE) { $system_path = realpath($system_path).'/'; } // ensure there's a trailing slash $system_path = rtrim($system_path, '/').'/'; $_SERVER['REQUEST_URI'] = 'solr.gif'; define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME)); define('EXT', '.php'); define('BASEPATH', str_replace("\\", "/", $system_path.'codeigniter/system/')); define('APPPATH', $system_path.'expressionengine/'); define('FCPATH', str_replace(SELF, '', __FILE__)); define('SYSDIR', trim(strrchr(trim(str_replace("\\", "/", $system_path), '/'), '/'), '/')); define('UTF8_ENABLED', false); define('CI_VERSION', '2.0'); //define('AJAX_REQUEST',false); define('DEBUG',false); require BASEPATH.'core/Common'.EXT; require APPPATH.'config/constants'.EXT; $CFG =& load_class('Config', 'core'); $URI =& load_class('URI', 'core'); $IN =& load_class('Input', 'core'); $OUT =& load_class('Output', 'core'); $LANG =& load_class('Lang', 'core'); $SEC =& load_class('Security', 'core'); $loader = load_class('Loader', 'core'); // Load the base controller class require BASEPATH.'core/Controller'.EXT; function &get_instance() { return CI_Controller::get_instance(); } $EE = @new Solr_Importer_Ee_Bootstrap; $this->EE = $EE; return $this->EE; } catch (Exception $e) { throw new Exception($e->getMessage()); } } public function getItems($filter = null) { $channelList = $this->_solr->config('channels'); $SOLR_entries = array(); $site_mapping = $this->_solr->config('ee_sites'); $configSites = $this->_solr->config('ee_sites'); if ( ! is_array( $configSites ) ) { die('Site and Store IDs need to be defined in config.php'); } // retrieve all channels we have defined in the config. $this->EE->db->where_in('channel_name', array_keys($channelList)); $channels = $this->EE->db->get('channels' )->result(); foreach($channels as $channel) { // Retrieve all custom fields $fields = $this->EE->db->get_where('channel_fields', array( 'group_id' => $channel->field_group ) )->result(); //Grab all the categories for an entry $this->EE->db->select('(select GROUP_CONCAT(cat_name) from exp_category_posts cp join exp_categories c on c.cat_id = cp.cat_id where cp.entry_id = exp_d.entry_id) as cats', false); // Build out which custom fields we need and get entries $channel_title_fields = array('entry_id','title','url_title','status','year','month','day','entry_date'); foreach( $channel_title_fields as $i) $this->EE->db->select('t.' . $i); $this->EE->db->select('unix_timestamp(t.edit_date) as updated_date'); $this->EE->db->join('channel_titles t', 't.entry_id=d.entry_id'); $this->EE->db->join('channel_data pd', 'pd.entry_id=d.entry_id'); //$this->EE->db->select('pl.short_name')->join('publisher_languages pl', 'pl.id=pd.publisher_lang_id'); $field_map = array(); foreach($fields as $field) { $this->EE->db->select("pd.field_id_{$field->field_id}"); $field_map[ 'field_' . $field->field_name] = 'field_id_' . $field->field_id; } $this->EE->db->where('d.channel_id', $channel->channel_id); if ($filter) { $filter = str_replace('updated_date', 'unix_timestamp(t.edit_date)', $filter); $this->EE->db->where($filter); } $this->EE->db->where('t.status', 'open'); $entries = $this->EE->db->get('channel_data exp_d'); // Build items. foreach( $entries->result() as $entry ) { $base_item = $this->makeItem( $channel, $field_map, $entry ); /** * Figure out solr id for content */ $base_item['site_id'] = 1;//hard coding until multi site is needed - $site_mapping[$entry->short_name]; $SOLR_entries[] = $base_item; } } return $SOLR_entries; } function makeItem( $channel, $fieldmap, $entry ) { $data = array(); $tmpdata = array(); $data['entry_id'] = $entry->entry_id; $data['channel_id'] = $channel->channel_id; $data['channel_name'] = $channel->channel_name; $data['channel_title'] = htmlentities($channel->channel_title); $data['title'] = $entry->title; $data['status'] = $entry->status; $data['updated'] = $entry->entry_date; $data['category'] = explode(',',$entry->cats); //$data['fields'] = Solr::config('defaults'); $channelRules = $this->_solr->config('channels'); if ( array_key_exists( $channel->channel_name, $channelRules ) ) { // if this channel has custom fields $fields = $channelRules[$channel->channel_name]; foreach($fields as $field => $rules) { is_array($rules) or $rules = array( 'type' => '', 'value' => $rules); preg_match_all('/@\!(\w+)/', $rules['value'], $matches); // handle tmp fields foreach($matches[1] as $match) { $tmp = array_key_exists($match, $tmpdata) ? $tmpdata[$match] : ''; $rules['value'] = str_replace('@!' . $match, $tmp, $rules['value']); } unset($matches); preg_match_all('/@(\w+)/', $rules['value'], $matches); foreach($matches[1] as $orig_match) { $match = array_key_exists($orig_match, $fieldmap) ? $fieldmap[$orig_match] : $orig_match; $tmp = property_exists($entry, $match) ? $entry->{$match} : (property_exists($channel, $match) ? $channel->{$match}: $match); $rules['value'] = str_replace('@' . $orig_match, $tmp, $rules['value']); } unset($matches); switch ($rules['type']) { case 'expression': $rules['value'] = $this->parse( $rules['value'] ); break; default: $rules['value'] = filter_var( strip_tags($rules['value']), FILTER_SANITIZE_STRING); //$rules['value'] = filter_var($rules['value'], FILTER_SANITIZE_STRING); } switch (@$rules['save']) { case 'tmp': $tmpdata[$field] = $rules['value']; break; default: $data['fields'][$field] = $rules['value']; } } } return $data; } }
Output for 5.3.0 - 5.6.28, hhvm-3.10.0 - 3.13.2, 7.0.0 - 7.1.0