The best approcach for Multi-Site Codeigniter projects? - php

Thanks for taking the time to read this.
Here's what I want:
I will have a main server, it will hold the client's package info, the themes they've ordered and a_ds they have attached from my marketplace.
I don't want their site to be a sub-domain, rather their own domain and it will be hosted by me in a shared environment.
Now, I want to set up my CI project in such a way, that these will happen. Each individual client will be given their own project space and database but I want their particular projects to derive their settings from my database/CI functions.
I know I wrote terribly, but even Google failed me on this. You guys are my last hope.
Thanks in advance!!

Do you intend to run these multitude of sites from one CodeIgniter source in your server, with application configurations varying depending on which domain is accessed?
If that is the case, then here is an option available for you off the top of my head:
Organize the varying configurations in application/config like this:
application/
config/
domains/
foo.com/
database.php
config.php
bar.net/
database.php
config.php
baz.org/
database.php
config.php
Each of these application/config/domains/*/(database|config).php files contain the configurations specific only for that particular domains (You have to generate these somehow).
Example:
//In database.php files
return array(
'username' => 'client1',
'password' => 'password!',
'database' => 'client1_db'
);
//In config.php files
return array(
'base_url' => 'http://baz.org'
);
Then its just a matter of including the right file depending on the domain used in the request:
In your application/config/database.php:
$client_vars = include __DIR__ . '/domains/' . $_SERVER['HTTP_HOST'] . '/database.php';
/* validate $client_vars to ensure that client is not overriding anything important. Throw an error to inform client. */
$db['default'] = array_replace($db['default'], $client_vars);
/* Rest of DB settings. */
In your application/config/config.php:
$client_vars = include __DIR__ . '/domains/' . $_SERVER['HTTP_HOST'] .'/database.php';
/* validate $client_vars to ensure that client is not overriding anything important. Throw an error to inform client */
$config = array_replace($config, $client_vars);
/* Rest of config settings */
This is a rough idea of a possible solution, though this is not very secure at all. Just two cents.

Related

Moodle plugin : check if admin + add link to plugin in administration

I'm new to moodle plugin development and am trying to create a plugin that displays a page to the admin where I can add my on php code.
In brief, what I want the plugin to do I have already achieved in a standard php file that I upload to the moodle root. From here you can call the file e.g. yourdomain.co.uk/moodlelocation/myfile.php and it will run as expected.
The problem with this is it isn't secure since anyone can load the myfile.php and in turn run the scripts on the page. It also means any one else using this script (it will be given away for free when complete) would need to FTP into their hosting and upload two php files to their moodle install.
Due to this, I thought a plugin (a very very basic plugin) may be the best solution. They could then load the page in the admin via the "site administration". e.g. site administration > Development > MyPlugin. I am assuming I could then also restrict the plugin's main page to admins only (??).
So to recap, I can create a php page that has my script all rocking and rolling BUT I need to make this into a plugin.
I did some reading and I think a "local" plugin was the easiest way to go (??).
I have managed to get the local plugin up and running using the below in local/webguides/inex.php :
<?php
// Standard config file and local library.
require_once(__DIR__ . '/../../config.php');
// Setting up the page.
$PAGE->set_context(context_system::instance());
$PAGE->set_pagelayout('standard');
$PAGE->set_title("webguides");
$PAGE->set_heading("webguides");
$PAGE->set_url(new moodle_url('/local/webguides/index.php'));
// Ouput the page header.
echo $OUTPUT->header();
echo 'MY php CODE here etc';
?>
This works fine but with two problems:
Anyone can access it via http://domain/local/webguides/index.php
There is no link to it in the site administration (so the user would need to type the URL in).
Can anyone shed any light how I would achieve the two steps above?
Thanks in advance
p.s. ideally I'd like to keep the plugin to as few files as possible so if the required code could be added to the local/webguides/index.php file it would be preferred.
You need to create a capability, then require that capability before displaying the page.
First, have a look at local/readme.txt - this gives an overview of the files needed for a local plugin.
Or read the documentation at https://docs.moodle.org/dev/Local_plugins
Also have a look at existing local plugins so you can see how they are created - https://moodle.org/plugins/?q=type:local
At a bare minimum, you need
local/webguides/db/access.php - this will have the capability
local/webguides/lang/en/local_webguides.php
local/webguides/version.php
Plus your index file
local/webguides/index.php
In the db/access.php file have something like
defined('MOODLE_INTERNAL') || die();
$capabilities = array(
'local/webguides:view' => array(
'captype' => 'read',
'contextlevel' => CONTEXT_SYSTEM,
'archetypes' => array(
),
),
);
You might also need 'riskbitmask' => RISK_XXX depending on if there are any risks in you code. Such as RISK_CONFIG, RISK_PERSONAL, etc.
In lang/en/local_webguides.php have something like
defined('MOODLE_INTERNAL') || die();
$string['pluginname'] = 'Webguides';
$string['webguides:view'] = 'Able to view webguids';
In version.php have something like
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2020051901; // The current plugin version (Date: YYYYMMDDXX)
$plugin->requires = 2015051109; // Requires this Moodle version.
$plugin->component = 'local_webguides'; // Full name of the plugin (used for diagnostics).
Replace 2015051109 with the version of Moodle you are using - this will be in version.php in the root folder.
Then in your index.php file use this near the top.
require_capability('local/webguides:view', context_system::instance());
So only users with that capability will have access to the page.
EDIT:
You can add a link via settings.php using something like
defined('MOODLE_INTERNAL') || die;
if ($hassiteconfig) {
$page = new admin_externalpage(
'local_webguides',
get_string('pluginname', 'local_webguides'),
new moodle_url('/local/webguides/index.php'),
'local/webguides:view'
);
$ADMIN->add('localplugins', $page);
}
Then in your index page ad this
require_once($CFG->libdir.'/adminlib.php');
and remove require_login() and require_capability() and replace with
admin_externalpage_setup('local_webguides');

how to create multi site cms that make subdomain and source code dynamically

I want know how blogging systems works, what will happen when a user create a blog?
I know every blogging system has a main site that user register on it , but how main site create sub-domain and source code for each user? how about database? is blog source code copied to every user folder? are all blogs use single core?
Your question is way too broad, but as an example of one possible approach, you could use the server name to choose an appropriate configuration for your app, and share source code.
<?php
$domain_map =
[
'foo.example.com' => 'foo',
'bar.example.com' => 'bar'
];
$domain = $_SERVER['SERVER_NAME'];
if(isset($domain_map[$domain])) {
$config = require __DIR__ . '/' . $domain_map[$domain] . '.config';
$app = new App($config);
// etc.
}

DokuWiki Plugin - Read/Write configuration from conf/metadata.php

I am trying to read/write my configuration in the DokuWiki.
The problem that occurs is when I am trying to call $this->getConf('url'); I always get the response from the conf/default.php file.
This is how my files look like:
admin.php
$url = $this->getConf('url');
conf/default.php
$conf['url'] = 'https://www.example.com';
conf/metadata.php
$meta['url'] = array('string', 'url' => 'https://correct-url.com');
And the value of $url always is:
https://www.example.com
I am not sure what I do wrong.
Thanks!
You may have some misunderstanding to DokuWiki's config system.
The config, which is editable by users, will be saved at /conf/local.php (not inside plugins!). The plugin can only provide a default value at default.php, while the metadata.php is to define how the value is shown on the frontend settings manager.
In your case, the correct URL will be shown, if the DokuWiki global config file (/conf/local.php for example) includes $conf["your_plugin_name"]["url"] = "https://correct-url.com";.
For more: https://www.dokuwiki.org/devel:configuration

set config params from database in yii 1

I have created CRUD for global configuration parameters. I want to apply this parameters value as main config params (main.php).
I have found some way like add value of these parameters to any .inc file and perform read/write operation. Can anybody help me how can I achieve this? I am beginner in yii.
I have created table structure :
global_config :
Field | Value
pageSize | 20
admin_email| admin#example.com
main.php file as below :
.
.
{
'params' = array(
'pageSize' => 10,
'admin_email' => 'admin#example.com',
);
}
.
.
I am using config file as show above, I want to change it dynamically that it should get value from database.
So that I can make changes in config file from front-end side. I don't need to perform open/write action on main.php
In yii1 you can use params you can set this in main.php
'params'=>array(
'your_param'=>'your_value ',
...
Yii::app()->params['your_param'];
and you can set this value like a simple array poplulating the value form database
$param['yuor_param' =>$your_db_value];
You can't do this for params. As Application parameters are not really meant to be altered and if you change a value, it does not persist across different requests.
These are treated as constant in Yii, So you can't define them after running the script as config files runs at first as your code runs.
Finally, I found solution as per my requirement. I followed given below link from yii forum.
Link : http://www.yiiframework.com/wiki/304/setting-application-parameters-dynamically-in-the-back-end/
Thanks.

Is there a way we can build YII multisite application with one database for multiple domains

We are planned to host a single CMS for the multiple sites.
Is there are way in YII we can do that, The idea is simple we want to share single application and single database for all the domains but we will let them choose the different themes for the different website.
By website I mean totally different Domains.
What other setting will we have to do to point all the domains to single server ?
Edit::
I don't want the different serve directory for each domain. what I want to do it, keep the installation only one.
i.e.
/server/www/master
then all the domains
a.com, b.com, c.com read the same dir "/server/www/master" and same DB. and records get filer on the base of site.
I have done exactly that with Yii so yes it is possible.
In your Apache settings make sure to point all the domain names to the same directory (using ServerAlias - http://httpd.apache.org/docs/2.2/mod/core.html#serveralias).
In my database I created a table with a row for each website, storing the domain name as one of the fields.
In my ApplicationConfigBehavior.php::beginRequest (which is executed for every request), I did something like this:
/**
* Load configuration that cannot be put in config/main
*/
public function beginRequest()
{
if(empty(Yii::app()->session['community'])){
$current_community = Community::model()->with(array(
'communityHosts'=>array(
'joinType'=>'INNER JOIN',
'condition'=>'`communityHosts`.hostname= :hostname',
'params' => array(':hostname' => $_SERVER['SERVER_NAME'])
),
))->find();
Yii::app()->session['community'] = serialize($current_community);
}
else{
$current_community = unserialize(Yii::app()->session['community']);
}
if(!empty($current_community)){
Yii::app()->name = $current_community->name;
Yii::app()->params['currentCommunity'] = $current_community;
Yii::app()->language = $current_community->language;
}
else{
//TODO: Throw error
session_unset();
die('Hostname ' . $_SERVER['SERVER_NAME'] .' not found');
}
}
Which basically says, looks for this server name in my database, get the current "community" (my sites), and store all the settings (theme, site name, etc...) in the session.
The exact query might not be the same for you. It's just to give you the general idea. Adapt it to your database schema or however you store the settings for each website.
In the apache virtual host file, set the site name
SetEnv SITE_NAME "CMSA"
Get site name in the code using
defined('SITE_NAME') || define('SITE_NAME', ( getenv('SITE_NAME') );
Use the constant in the config and filter your records based on the site.
The same way theme can also be declared.

Categories