ACC SHELL
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Admin extends MY_Controller {
public $data;
public $default_view = true;
public function __construct(){
parent::__construct();
Form::$escape_quotes = true;
if(!$this->users->is_admin() && $this->data['action'] != "login"){
// bezpečnostní riziko: všechno je přes cookies, a pokud má uživatel přístup na jeden web, na jiný to má celkem jednoduché
$this->uri->redirect("admin/login");
}
}
public function export ($root_rel = array()) {
$this->export->export();
}
public function def ($edit_id = 0) {
$this->load->model($model="def_model");
$this->def = $this->$model;
$f = new Form($model);
if($edit_id){
if(!($this->data['item'] = $this->def->get_one($edit_id))){
Tools::flash("Zadana stranka nebyla nalezena...");
$this->uri->redirect("admin");
}
$f->load_data($this->data['item']);
}
if($f->ready()){
$data = $f->get_data();
if ($this->def->save($data,$edit_id)){
Tools::flash ("uloženo...","succ");
$this->uri->redirect("admin/links");
}else{
Tools::flash ("Nelze vlozit data, Admin::action().","critical");
$this->uri->back();
}
}
$this->data['items'] = $this->def->get_all();
$this->data['f'] = $f;
$this->load->view('_default/admin',$this->data);
}
public function index ($edit_id = 0) {
if(empty($this->data['settings'])){
Tools::debug("set this domain first");
$this->uri->redirect("admin/settings");
}
$this->load->model("sites_model");
$this->sites->idr = Settings_model::$root_relation['id'];
$this->data["sites"] = $this->sites->set_offset(0)->tree(); // tag("homepage")
if($this->default_view){
$this->load->view('_default/admin',$this->data);
}
}
public function site($idr = null){
if($idr && !is_numeric($idr)) $this->uri->redirect(404); // sanitize
if(!$idr && empty($_GET['parent_id'])) $this->uri->redirect(404); // again
$f = new Form("site");
// Form::$ajax=false;
if($f->ready()){
$data = $f->get_data();
// chyceni dedicnosti
$data['state_inherit']=(isset($_POST['state_inherit']) ? 1 : 0);
$state_inherit_once=(isset($_POST['state_inherit_once']) ? 1 : 0);
// var_dump($data);
// exit('<br>'.__FILE__.'; '.__LINE__);
$data["updated"] = date("c", time());
$rel = $this->sites->get_relation($idr); // set id and idr for save
if(!empty($rel['list'])) $data['list'] = $rel['list']; // set right list
if(!empty($_GET['parent_id'])) $data['parent_id'] = $_GET['parent_id'];
// takes $_POST, bx $data['parts'] is undesirable sanitized
$_POST['parts'] = str_replace("\n\n","\n",$_POST['parts']);
$data['parts'] = $_POST['parts'];
//die(var_dump(str_replace("\n","-",$_POST['parts'])));
if ($this->sites->save_site($data)){
// jednorazova dedicnost
if($state_inherit_once){
$count_of_inherited=$this->sites->state_inherit($idr);
if($count_of_inherited===false){
Tools::flash("Nepodařilo se podědit potomky stavem.","warn");
}
elseif($count_of_inherited){
Tools::flash("Stav byl předán potomkům. (".$count_of_inherited.")","succ");
}
else{
Tools::flash("Stav nebylo třeba dědit.","succ");
}
}
Tools::flash ("Podstránka byla úspěšně uložena.","succ");
$this->files = new Files_model();
foreach($data['del_files'] as $id=>$df){
if($df==1) $this->files->del_files($id);
}
if(!empty($_POST['save_continue'])) $this->uri->redirect("admin/site/".$this->sites->idr);
$this->uri->redirect("admin");
}
}
if($idr){
$this->sites->get_one($idr);
$this->data['parent'] = $this->sites->new_one()->parent();
if(empty($this->sites->id)) $this->uri->redirect("admin/sites"); // IE can have unreasonable behavior caused background requests
$f->load_data($this->sites->a);
}elseif($_GET['parent_id']){
$this->sites->a['parent_id'] = $_GET['parent_id'];
// vychozi stav je "publikovano"
$id_sites_states=1;
// vychozi dedicnost je "bez dedicnosti"
$state_inherit=0;
/**
* @todo Vlahovic, 16.3.12 16:30 - dopsat dedeni stavu...
*/
$inherited_state=$this->sites->inherited_state($_GET['parent_id']);
$id_sites_states=($inherited_state ? $inherited_state : $id_sites_states);
// proste prirazeni do potencialne pouzivanych promennych
@$this->data['sites']->a['id_sites_states']=$id_sites_states1;
@$this->data['sites']->a['state_inherit']=$state_inherit;
@$this->sites->a['id_sites_states']=$id_sites_states;
@$this->sites->a['state_inherit']=$state_inherit;
// stary zpusob
$this->sites->parent();
$sitemap = ($this->sites->a['parent']->has_tag('no_sitemap',1) ? 0 : 1);
$f->load_data(array('sitemap'=>$sitemap));
}
// states
$raw_sates=$this->db->query("SELECT `id`,`state` FROM sites_states ORDER BY `id`")->result_array();
foreach($raw_sates as $item){
$states[$item['id']]=$item['state'];
}
$this->data['states']=$states;
$this->data['site'] = $this->sites;
// default id_sites_states is 1
$this->data['site']->a['id_sites_states']=(is_null($this->data['site']->a['id_sites_states']) ? 1 : $this->data['site']->a['id_sites_states']);
// by default there is allways some text. Can be unset in some condition.
// the rest is in your_admin.php
if(empty($this->data['site']->a['parts']['text'])){
$this->data['site']->a['parts']['text'] = true;
}
$this->data['hidden_parts'] = array("title","h1_title","meta_title","meta_description","meta_keywords");
if(!empty($_GET['parent_id'])){
$f->load_data(array('parent_id'=>$_GET['parent_id']));
}
$this->data["f"] = $f;
if($this->default_view){
$this->load->view('_default/admin',$this->data);
}
}
/**
* @param int $idr relation of hp site
*/
function settings ($idr=null,$parent_idr=null) {
if(!$idr) $idr = @Settings_model::$root_relation['id'];
$settings = false;
if(!empty($_GET['del_alias'])){
$this->db->query("delete from settings where name='alias' && value='".$_GET['del_alias']."'");
$this->uri->back();
}
if($idr){
$settings = $this->settings->get_all($idr,false);
}
if(!$settings && !Ses::user("programator")){
Tools::alert("Nebylo nalezeno potřebné nastavení");
$this->uri->redirect("admin");
}
$f = new Form("settings",array("data"=>array("values"=>$settings)));
//$f->load_data(array("values"=>$settings));
if($f->ready()){
$data = $f->get_data();
// CREATE NEW WEB
if(empty($idr)){
if(!$parent_idr) $parent_idr = $this->sites->idr;
if(!$parent_idr){
$p = $this->db->query("select relations.id from relations join sites on sites.id=relations.id_sites where tags like '%#root#%'")->row_array();
$parent_idr = $p['id'];
}
Sites_model::$repair_on_insert = false;
$res = $this->sites->new_one()
->save_site(array("parts"=>array("title"=>$data['values']['name']),"tags"=>"hp","parent_id"=>$parent_idr,"sitemap"=>"1"));
Settings_model::$root_relation['id'] = $res->idr;
$this->settings->set_root_relation($res->idr);
// sites
$podstranky = $this->sites->new_one()
->save_site(array("parts"=>array("title"=>"PODSTRÁNKY"),"tags"=>"sites","parent_id"=>Settings_model::$root_relation['id']));
$this->sites->new_one()
->save_site(array("parts"=>array("title"=>"Kontakt","text"=>"<p>adresa...</p>"),"tags"=>"mail_form","parent_id"=>$podstranky->idr));
// search
$this->sites->new_one()
->save_site(array("parts"=>array("title"=>"Vyhledávání"),"tags"=>"search","parent_id"=>Settings_model::$root_relation['id']));
// design
$design = $this->sites->new_one()
->save_site(array("parts"=>array("title"=>"Design"),"tags"=>"design","parent_id"=>Settings_model::$root_relation['id']));
$this->sites->new_one()
->save_site(array("parts"=>array("title"=>"styles.css","text"=>file_get_contents("./views/_default/www/css/styles.css")),"tags"=>"css","parent_id"=>$design->idr));
// 404
$this->sites->new_one()
->save_site(array("parts"=>array("title"=>"Stránka nenalezena [404]","text"=>"Stránka neexistuje"),"tags"=>"error_404","parent_id"=>Settings_model::$root_relation['id']));
$this->sites->repair_tree();
Sites_model::$repair_on_insert = false; // back to normal
}
// save values
foreach($data['values'] as $name=>$val){
$this->settings->save_row($name,$val);
}
// save aliases
$a_lang = $data['aliases']['value']['lang'];
foreach($data['aliases']['value'] as $i=>$val){
$this->settings->save_row('alias',$val,$a_lang[$i],true);
}
$view = APPPATH . "views/" . $data['values']['name'];
$w = APPPATH . "w/" . $data['values']['name'];
if(!is_dir($view)){
mkdir($view);
}
if(!is_dir($w)){
mkdir($w);
mkdir($w . "/cache");
mkdir($w . "/files");
}
Tools::flash("uloženo...","succ");
$this->uri->redirect("admin");
}
if(!empty($_POST['import_submit'])){
if(empty($_FILES['import_file']['tmp_name']) || !strpos($_FILES['import_file']['name'],".zip")){
Tools::alert("musíte vložit zip soubor pro import");
$this->uri->redirect("admin/settings");
}else{
$files_folder = "views/" . $_POST['settings_name'] . '/www/i_files/';
foreach($this->sites->new_one()->tag("hp")->childrens() as $ch){
$ch->del_sites();
}
$this->export->import($_FILES['import_file']['tmp_name'], $files_folder, Settings_model::$root_relation['id']);
$this->sites->repair_tree();
}
}
$this->data['settings'] = $settings;
$this->data['f'] = $f;
$this->load->view('_default/admin',$this->data);
}
public function site_serialize(){
$list = 1;
if(!empty($_POST['i'])){
foreach($_POST['i'] as $id=>$parent_id){
$this->db->query("update relations set parent_id='$parent_id', list='$list' where id='$id'");
$list++;
}
}
$this->sites->repair_tree(false,Settings_model::$root_relation['id']);
//$this->sites->repair_tree(false,false);
}
public function file_serialize(){
foreach($_POST['f'] as $list=>$id){
$this->db->query("update files set list='".($list+1)."' where id='$id'");
}
}
function users(){
/**
* kdyz se na tom shodneme, tak se to presune v nejake forme do modelu...
*
* @since 6.2.12 10:15
* @author Vlahovic
*/
$users = $this->users->get_all();
foreach($users as $index => $user){
$query="# zjisti nazev root domeny
SELECT p.`content` AS `domain`
FROM relations AS r
LEFT JOIN `sites_parts` AS p ON p.id_sites=r.id_sites
WHERE r.`id`=".$user['access_root']." AND p.`part`='title' LIMIT 1";
$item = $this->db->query($query)->row_array();
$users[$index]['domain']=(!empty($item['domain']) ? $item['domain'] : false);
}
$this->data['users']=$users;
// $this->data['users'] = $this->users->get_all();
$this->load->view('_default/admin',$this->data);
}
function user($id=0){
// todo: vychytat bezpečnostní rizika:
// - uživatelé nesmí lézt do editace uživatelů nad nima
// - uživatel nesmí nastavit sobě ani jnému vyšší root_access než je jeho (bezpeč.chybka)
// - to samé s přidělením programátorského práva
/**
* mozne root uzly
* pokud se shodneme na tomto reseni tak se asi presune do modelu
*
* @since 6.2.12 13:50
* @author Vlahovic
*/
$query = "# zjisti id rootu a ostatni potencialni domeny
SELECT r.`id`, p.`content` AS `value`
FROM sites AS s
LEFT JOIN relations AS r ON r.id_sites=s.id
LEFT JOIN sites_parts AS p ON p.id_sites=s.id AND p.`part`='title'
WHERE s.tags LIKE '%#root#%' OR s.tags LIKE '%#hp#%'
ORDER BY s.tags DESC, p.`content` ASC
";
$this->data['domains']=$this->db->query($query)->result_array();
$f = new Form("user");
// novy uzivatel
if($id=='add'){
// defaultni pro nove vytvareneho je aktualni domena
$f->load_data(array('access_root'=>$this->sites->new_one()->tag('hp')->a['id'],'admin'=>1));
}
elseif($id){
$this->data['user'] = $this->users->get_one($id);
if(empty($this->data['user'])){
Tools::flash("Tento uživatel (id: ".$id.") již neexistuje");
$this->uri->redirect("admin/users");
}
$f->load_data($this->data['user']);
}
if($f->ready()){
$data = $f->get_data();
if($this->users->save_user($data,$id)){
Tools::flash("Údaje o uživateli uloženy...","succ");
header('location:/admin/users');
exit();
}else{
Tools::flash("chyba při ukládání","critical");
$this->uri->back();
}
}
$this->data['f'] = $f;
$this->load->view('_default/admin',$this->data);
}
function del($table,$id,$p3="",$p4=""){
$redirect = ""; // redirect after deleting on succes which can depend on $table
if($table == 'sites'){ // SITES
$this->load->model("sites_model");
$res = $this->sites->del_relations($id); // $id is id of relation // returns array
if(empty($res)){ // idr
$fail = true;
}else{
Tools::flash("stránka (včetně podstránek) byla úspěšně smazána","succ");
if($res['diff']) Tools::flash("poznámka: ".$res['diff']." stránek nebylo smazáno. Pravděpodobně se nacházejí i v jiné větvi","warn");
$this->uri->redirect("/admin");
}
}elseif($table == 'files'){ // FILES
//$redirect = "admin/files";
$this->load->model("files_model");
if(!$this->files_model->del_files($id)) $fail = true;
}
elseif($table=='user'){
$this->load->model("users_model");
if(!$this->users_model->del($id)){
$fail = true;
Tools::flash("Uživatelský účet se nepodařilo odstraněn.","warn");
}
else{
Tools::flash("Uživatelský účet byl odstraněn.","succ");
}
header('location:/admin/users');
exit();
}
else{ // OTHER
$model = $table."_model";
if (file_exists(APPPATH.'models/'.$model.EXT)){
$this->load->model($model);
if(!$this->$model->del($id,$p3,$p4)) $fail = true;
}else{
$this->base->load(NULL,$id,$table);
if(!$this->base->del()) $fail = true;
}
}
// if there
if(!empty($fail)){
//Tools::flash("maybe bad model '".$table."' was specified or id is wrong [admin->del()]","critical");
}else{
Tools::flash("smazáno...","succ");
}
// option to specific redirect dependent on table-case
if(!empty($redirect)){
$this->uri->redirect($redirect);
}else{
$this->uri->back();
}
}
function manual(){
$this->load->view('_default/admin',$this->data);
}
function login (){
if($this->users->is_admin()){
$this->uri->redirect("admin");
}
$f = new Form("login");
if($f->ready()){
$data = $f->get_data();
if($this->users->login($data)){
$sql = "select parent_id from relations where id='".$this->users->data['access_root']."'";
$rel_parent_id = $this->db->query($sql)->row()->parent_id; // is this root?
// is admin of this web or is this root admin?
if($this->users->data['access_root'] == @Settings_model::$root_relation['id'] || !$rel_parent_id){
Ses::user($this->users->data);
Tools::succ("přístup do administrace povolen");
$this->uri->redirect("admin");
}else{ // not exist settings and you havent root access
Tools::alert("Neexistující nastavení webu, nebo nemáte root práva pro jeho nastavení");
}
}else{
Tools::alert("Zadal jste špatný login nebo heslo");
}
}
$this->data['f'] = $f;
$this->load->view('_default/layout/blank',$this->data);
}
function logout (){
Ses::user_destroy();
Tools::flash("byl jste úspěšně odhlášen","succ");
$this->uri->redirect("");
}
//// DEPRECATED
public function files ($edit_id = 0) {
$this->load->model("files_model");
$this->def = $this->files_model;
if(!empty($_GET["duplicate"])){
$duplic = $this->def->get_one($edit_id);
$sql = "INSERT INTO files (file, file_title, file_url) VALUES ('".$duplic["file"]."', '".$duplic["file_title"]."', '".$duplic["file_url"]."')";
$this->db->query($sql);
$edit_id = $this->db->insert_id();
Tools::flash ("Kopie vytvořena (<a href='/admin/del/files/".$edit_id."' style='font-size: 90%; color: red;'>smazat</a>)","succ");
$this->uri->redirect("admin/files/".$edit_id);
}
$f = new Form("files");
if($f->ready()){
$data = $f->get_data();
if ($edit_id) unset($data['file_url']);
if ($this->def->save_file($data,$edit_id)){
Tools::flash ("uloženo...","succ");
$this->uri->redirect("admin/files");
}
}
if($edit_id){
$this->def->get_one($edit_id);
$this->def->a["file_url"] = "/www/files/".$this->def->a["file_url"];
$f->load_data($this->def->a);
}
$this->data['file'] = $this->def;
$this->data['files'] = $this->def->get_all();
$this->data['f'] = $f;
$this->data["sites_id"] = $this->get_sites_for_select();
$this->load->view('_default/admin',$this->data);
}
/**
* import dat z jinych databazi/systemu
*/
public function import(){
// importuje...
$this->load->model('import_model');
// dostupne databaze
$databases=array(''=>'-- vyber --');
$query="SHOW DATABASES;";
$s=$this->db->query($query)->result_array();
foreach($s as $db){
if($db['Database']!='information_schema' && $db['Database']!='mysql' && $db['Database']!=DB_DB){
$databases[$db['Database']]=$db['Database'];
}
}
// dostupne typy importu
$systems=array_merge(array(''=>'-- vyber --'),$this->import_model->get_import_posible_systems());
// zpracovani formulare
$f=new Form('import');
if($f->ready()){
$data = $f->get_data();
if($this->import_model->do_import($data['database'],$data['system'],$data['server'])){
Tools::succ('Byla importována data ze systému "'.$data['system'].'" z databáze "'.$data['database'].'"');
}
else{
Tools::critical('Nepodařilo se importovat data ze systému "'.$data['system'].'" z databáze "'.$data['database'].'"');
}
}
// vystup
$this->data['f'] = $f;
$this->data['databases']=$databases;
$this->data['systems']=$systems;
$this->load->view('_default/admin',$this->data);
}
}
?>
ACC SHELL 2018