Elgg\BootData::populate PHP Method

populate() public method

Populate the boot data
public populate ( stdClass $config, Database $db, EntityTable $entities, Plugins $plugins ) : void
$config stdClass Elgg CONFIG object
$db Database Elgg database
$entities Elgg\Database\EntityTable Entities service
$plugins Elgg\Database\Plugins Plugins service
return void
    public function populate(\stdClass $config, Database $db, EntityTable $entities, Plugins $plugins)
    {
        // get subtypes
        $rows = $db->getData("\n\t\t\tSELECT *\n\t\t\tFROM {$db->prefix}entity_subtypes\n\t\t");
        foreach ($rows as $row) {
            $this->subtype_data[$row->id] = $row;
        }
        // get config
        $rows = $db->getData("\n\t\t\tSELECT *\n\t\t\tFROM {$db->prefix}config\n\t\t");
        foreach ($rows as $row) {
            $this->config_values[$row->name] = unserialize($row->value);
        }
        if (!array_key_exists('installed', $this->config_values)) {
            // try to fetch from old pre 3.0 datalists table
            // need to do this to be able to perform an upgrade from 2.x to 3.0
            try {
                $rows = $db->getData("\n\t\t\t\t\tSELECT *\n\t\t\t\t\tFROM {$db->prefix}datalists\n\t\t\t\t");
                foreach ($rows as $row) {
                    $value = $row->value;
                    if ($row->name == 'processed_upgrades') {
                        // config table already serializes data so no need to double serialize
                        $value = unserialize($value);
                    }
                    $this->config_values[$row->name] = $value;
                }
            } catch (\Exception $e) {
            }
        }
        // get site entity
        $this->site = $entities->get($this->config_values['default_site'], 'site');
        if (!$this->site) {
            throw new \InstallationException("Unable to handle this request. This site is not configured or the database is down.");
        }
        // get plugins
        $this->active_plugins = $plugins->find('active');
        // get plugin settings
        if (!$this->active_plugins) {
            return;
        }
        // find GUIDs with not too many private settings
        $guids = array_map(function (\ElggPlugin $plugin) {
            return $plugin->guid;
        }, $this->active_plugins);
        // find plugin GUIDs with not too many settings
        $limit = 40;
        $set = implode(',', $guids);
        $sql = "\n\t\t\tSELECT entity_guid\n\t\t\tFROM {$db->prefix}private_settings\n\t\t\tWHERE entity_guid IN ({$set})\n\t\t\t  AND name NOT LIKE 'plugin:user_setting:%'\n\t\t\t  AND name NOT LIKE 'elgg:internal:%'\n\t\t\tGROUP BY entity_guid\n\t\t\tHAVING COUNT(*) > {$limit}\n\t\t";
        $unsuitable_guids = $db->getData($sql, function ($row) {
            return (int) $row->entity_guid;
        });
        $guids = array_values($guids);
        $guids = array_diff($guids, $unsuitable_guids);
        if ($guids) {
            // get the settings
            $set = implode(',', $guids);
            $rows = $db->getData("\n\t\t\t\tSELECT entity_guid, `name`, `value`\n\t\t\t\tFROM {$db->prefix}private_settings\n\t\t\t\tWHERE entity_guid IN ({$set})\n\t\t\t\t  AND name NOT LIKE 'plugin:user_setting:%'\n\t\t\t\t  AND name NOT LIKE 'elgg:internal:%'\n\t\t\t\tORDER BY entity_guid\n\t\t\t");
            // make sure we show all entities as loaded
            $this->plugin_settings = array_fill_keys($guids, []);
            foreach ($rows as $i => $row) {
                $this->plugin_settings[$row->entity_guid][$row->name] = $row->value;
            }
        }
    }

Usage Example

Ejemplo n.º 1
0
 /**
  * Get the boot data
  *
  * @param \stdClass $CONFIG Elgg config object
  * @param Database  $db     Elgg database
  *
  * @return BootData
  *
  * @throws \InstallationException
  */
 private function getBootData(\stdClass $CONFIG, Database $db)
 {
     $CONFIG->_boot_cache_hit = false;
     if (!$CONFIG->boot_cache_ttl) {
         $data = new BootData();
         $data->populate($CONFIG, $db, _elgg_services()->entityTable, _elgg_services()->plugins);
         return $data;
     }
     $item = $this->getStashItem($CONFIG);
     $item->setInvalidationMethod(Invalidation::NONE);
     $data = $item->get();
     if ($item->isMiss()) {
         $data = new BootData();
         $data->populate($CONFIG, $db, _elgg_services()->entityTable, _elgg_services()->plugins);
         $item->set($data);
         $item->expiresAfter($CONFIG->boot_cache_ttl);
         $item->save();
     } else {
         $CONFIG->_boot_cache_hit = true;
     }
     return $data;
 }