$route = '/model/' . $model->class;
     \runner::redirect_route($route, \runner::config("scaffold"), true, $_model_context, $root_router, $root_model);
     if (isset($router->runner->backend_context["model"]["fields"])) {
         $fields = $router->runner->backend_context["model"]["fields"];
     }
     if (isset($root_router->runner->backend_context["model"]["fields"])) {
         $fields = array_merge($fields, $root_router->runner->backend_context["model"]["fields"]);
     }
     foreach ($fields as $field_name => $field_data) {
         if (isset($field_data["crop"])) {
             $crops[$field_name] = $field_data["crop"];
         }
     }
     $field_data = $fields[$field];
 }
 $parents = \Routerunner\Bootstrap::parent($reference);
 if (isset($parents[0]["model_class"]) && $parents[0]["model_class"] == "lang") {
     $lang = array_shift($parents);
 }
 $path_route = '';
 while ($parent = array_shift($parents)) {
     $_model_context = array("direct" => $parent["reference"], "session" => \runner::stack("session_id"));
     $router = false;
     $route = '/model/' . $parent["model_class"];
     \runner::redirect_route($route, \runner::config("scaffold"), true, $_model_context, $router, $parent_model);
     if (is_array($parent_model) && count($parent_model) == 1) {
         $parent_model = array_shift($parent_model);
     }
     if (isset($parent_model) && is_object($parent_model) && get_parent_class($parent_model) == "Routerunner\\BaseModel" && isset($parent_model->label)) {
         $path_route .= \runner::toAscii($parent_model->label) . DIRECTORY_SEPARATOR;
     }
<?php

/**
 * Created by PhpStorm.
 * User: csibi
 * Date: 2015.06.11.
 * Time: 17:03
 */
$debug = 1;
$selected_class = \bootstrap::get("submenu") == \model::property("id") ? ' selected' : '';
$has_children_class = '';
if (\Routerunner\Bootstrap::children(\model::property("reference"))) {
    $has_children_class = ' menu-item-has-children';
}
<?php

/**
 * Created by PhpStorm.
 * User: csibi
 * Date: 2014.10.20.
 * Time: 10:33
 */
require '../../../Routerunner/Routerunner.php';
use Routerunner\Routerunner as runner;
$post = array_merge($_GET, $_POST);
new runner(array('mode' => 'backend', 'params' => $post, 'method' => 'post', 'resource' => '/', 'bootstrap' => false), function () use($post) {
    $settings = \Routerunner\Routerunner::$static->settings;
    \Routerunner\Bootstrap::initialize($settings, true);
    $response = array("success" => false, "apply" => false, "change_id" => false, "error" => array());
    $SQL = "CALL {PREFIX}change_get(:change_id, :session, :draft, :applied)";
    $params = array(":change_id" => is_numeric($post["change_id"]) ? $post["change_id"] : 0, ":session" => \runner::stack("session_id") ? \runner::stack("session_id") : 0, ":draft" => 1, ":applied" => 0);
    if ($change_get = \db::query($SQL, $params)) {
        foreach ($change_get as $change) {
            $response["change_id"] = $change["change_id"];
            $SQL_apply = "CALL `{PREFIX}change_apply`(:change_id, :session)";
            $params_apply = array(":change_id" => $change["change_id"], ":session" => \runner::stack("session_id") ? \runner::stack("session_id") : 0);
            $model_class = false;
            if (is_numeric($change["reference"])) {
                $SQL = 'SELECT model_class FROM {PREFIX}models WHERE reference = ?';
                if ($result = \db::query($SQL, array($change["reference"]))) {
                    $model_class = $result[0]["model_class"];
                }
            }
            if (($resource = json_decode($change["resource"], true)) && isset($resource["route"])) {
                $model_route = $resource["route"];
 private static function SQL_creator($select, $from, $primary_key, $leftJoin = array(), $where = array(), &$params = array(), $orderBy = false, $groupBy = false, $limit = false, $offset = false)
 {
     $ordering = $orderBy;
     $parents = \runner::stack("parents");
     if (!$parents) {
         $parents = array();
     }
     $prevs = \runner::stack("prevs");
     if (!$prevs) {
         $prevs = array();
     }
     $strict = false;
     $skip_state = false;
     $by_tree = false;
     $by_index = false;
     if ($orderBy === \Routerunner\Routerunner::BY_TREE || $orderBy === \Routerunner\Routerunner::BY_TREE_DESC || $orderBy === \Routerunner\Routerunner::BY_INDEX || $orderBy === \Routerunner\Routerunner::BY_INDEX_DESC || isset($where["direct"]) && $where["direct"] || isset($where["parent"]) && $where["parent"] || isset($where["self"]) && $where["self"] || isset($where["lang"]) && $where["lang"]) {
         $tree = array();
         $params = array();
         if (isset($where["direct"]) && is_numeric($where["direct"])) {
             $SQL = 'SELECT models.reference, NULL AS parent_ref, NULL AS prev, table_from, table_id ' . PHP_EOL;
             $SQL .= 'FROM {PREFIX}models AS models ' . PHP_EOL;
             $SQL .= 'WHERE models.reference = :reference';
             $params = array(":reference" => $where["direct"]);
             $strict = true;
             $skip_state = true;
             $by_tree = true;
         } elseif (isset($where["direct"]) && is_array($where["direct"])) {
             $SQL = 'SELECT models.reference, NULL AS parent_ref, NULL AS prev, table_from, table_id ' . PHP_EOL;
             $SQL .= 'FROM {PREFIX}models AS models ' . PHP_EOL;
             $SQL .= 'WHERE models.model_class = :class AND models.table_id = :id';
             if (is_numeric(current($where["direct"]))) {
                 $params = array(":class" => key($where["direct"]), ":id" => current($where["direct"]));
             } else {
                 $params = array(":class" => current($where["direct"]), ":id" => key($where["direct"]));
             }
             $strict = true;
             $skip_state = true;
             $by_tree = true;
         } else {
             $where_reference = array();
             // get self reference
             if ($self_reference = self::resolve_model_reference('self', $where, true)) {
                 $where_reference['model_traverse.reference IN (' . implode(',', $self_reference) . ')'] = null;
                 $strict = true;
                 $skip_state = true;
                 $by_tree = true;
             }
             // get parent reference
             if ($parent_reference = self::resolve_model_reference('parent', $where, true)) {
                 $where_reference['model_traverse.parent_ref IN (' . implode(',', $parent_reference) . ')'] = null;
                 $strict = true;
                 $skip_state = true;
                 $by_tree = true;
             }
             // get lang condition
             if ($lang = self::resolve_model_reference('lang', $where, true)) {
                 $where_reference['model_traverse.lang IN (' . implode(',', $lang) . ')'] = null;
                 $strict = true;
                 $skip_state = true;
             }
             if (!$where_reference && $where) {
                 $SQL_reference = "SELECT models.reference FROM `" . $from . "` AS model_table " . PHP_EOL . "LEFT JOIN `" . $from . "` ON `" . $from . "`.`" . $primary_key . "` = model_table.`" . $primary_key . "`" . PHP_EOL . "LEFT JOIN `{PREFIX}models` AS models ON models.table_from = '" . $from . "' AND models.table_id = model_table.`" . $primary_key . "`" . PHP_EOL . " WHERE ";
                 $conds_reference = array();
                 $params_reference = array();
                 foreach ($where as $cond_reference => $param_reference) {
                     $conds_reference[] = preg_replace("~(:[a-z0-9\\-_\\.]+)~i", "?", $cond_reference);
                     if (!is_null($param_reference)) {
                         $params_reference[] = $param_reference;
                     }
                 }
                 $SQL_reference .= implode(" AND ", $conds_reference);
                 if ($result_reference = \db::query($SQL_reference, $params_reference)) {
                     $row_reference = array_shift($result_reference);
                     $reference_for_parent = $row_reference["reference"];
                     if (($parent_obj = \Routerunner\Bootstrap::parent($reference_for_parent)) && count($parent_obj)) {
                         $parent_obj = array_pop($parent_obj);
                         $parent_reference = $parent_obj["reference"];
                         $where_reference['model_traverse.parent_ref IN (' . $parent_reference . ')'] = null;
                     }
                     $strict = true;
                     $skip_state = true;
                 }
             }
             if ($orderBy === \Routerunner\Routerunner::BY_TREE || $orderBy === \Routerunner\Routerunner::BY_TREE_DESC) {
                 // get previous sibling
                 $prev_reference = self::resolve_model_reference('prev', $where, true);
                 if ($prev_reference !== false) {
                     $where_reference['model_traverse.prev_ref IN (' . implode(',', $prev_reference) . ')'] = null;
                     $strict = true;
                     $skip_state = true;
                 }
                 // get next sibling
                 // todo: check --- is it ok?
                 $next_reference = self::resolve_model_reference('next', $where, true);
                 if ($next_reference !== false) {
                     $where_reference['model_traverse.prev_ref IN (SELECT reference FROM {PREFIX}model_trees WHERE prev_ref IN (' . implode(',', $next_reference) . '))'] = null;
                     $strict = true;
                     $skip_state = true;
                 }
             }
             if ($orderBy === \Routerunner\Routerunner::BY_INDEX) {
                 // get order_no sibling
                 $order_no_reference = self::resolve_model_reference('order_no', $where, true);
                 if ($order_no_reference !== false) {
                     $where_reference['model_traverse.order_no IN (' . implode(',', $order_no_reference) . ')'] = null;
                     $strict = true;
                     $skip_state = true;
                     $by_index = true;
                 }
             }
             if ($where_reference) {
                 $SQL = 'SELECT models.reference, model_traverse.parent_ref' . PHP_EOL;
                 if ($orderBy === \Routerunner\Routerunner::BY_TREE || $orderBy === \Routerunner\Routerunner::BY_TREE_DESC || $by_tree) {
                     $SQL .= ', prev_ref AS prev' . PHP_EOL;
                 } elseif ($orderBy === \Routerunner\Routerunner::BY_INDEX || $orderBy === \Routerunner\Routerunner::BY_INDEX_DESC || $by_index) {
                     $SQL .= ', order_no AS prev' . PHP_EOL;
                 }
                 $SQL .= 'FROM {PREFIX}models AS models ' . PHP_EOL;
                 if ($orderBy === \Routerunner\Routerunner::BY_TREE || $orderBy === \Routerunner\Routerunner::BY_TREE_DESC || $by_tree) {
                     $SQL .= 'LEFT JOIN {PREFIX}model_trees AS model_traverse ON model_traverse.reference = models.reference ' . PHP_EOL;
                 } elseif ($orderBy === \Routerunner\Routerunner::BY_INDEX || $orderBy === \Routerunner\Routerunner::BY_INDEX_DESC || $by_index) {
                     $SQL .= 'LEFT JOIN {PREFIX}model_orders AS model_traverse ON model_traverse.reference = models.reference ' . PHP_EOL;
                 }
                 $SQL .= 'WHERE ' . implode(' AND ', array_keys($where_reference)) . PHP_EOL;
                 if ($orderBy === \Routerunner\Routerunner::BY_INDEX || $by_index) {
                     $SQL .= 'ORDER BY model_traverse.parent_ref, model_traverse.order_no, models.reference';
                 }
             }
         }
         if ($strict && !empty($SQL) && ($result = \db::query($SQL, $params))) {
             // modify SQL params
             if (!$leftJoin) {
                 $leftJoin = array();
             }
             if (strpos($from, '{PREFIX}models') !== false || $from == 'models') {
                 $from = '`{PREFIX}models` AS models';
                 $model_class = 'models';
                 $primary_key = 'reference';
             } else {
                 array_unshift($leftJoin, '`' . $from . '` ON `' . $from . '`.`' . $primary_key . '` = models.table_id AND models.table_from = \'' . $from . '\'');
                 $model_class = trim($from, '`');
                 $primary_key = trim($primary_key, '`');
                 $from = '{PREFIX}models AS models';
             }
             if ($orderBy === \Routerunner\Routerunner::BY_INDEX || $orderBy === \Routerunner\Routerunner::BY_INDEX_DESC || $by_index) {
                 foreach ($result as $reference_row) {
                     $tree[] = $reference_row['reference'];
                     $parents[$reference_row["reference"]] = $reference_row["parent_ref"];
                     $prevs[$reference_row["reference"]] = $reference_row["prev"];
                 }
                 $orderBy = '`models`.`order_no`';
             } elseif ($orderBy === \Routerunner\Routerunner::BY_TREE || $orderBy === \Routerunner\Routerunner::BY_TREE_DESC || $by_tree) {
                 $orderByTree = $orderBy === \Routerunner\Routerunner::BY_TREE || $orderBy === \Routerunner\Routerunner::BY_TREE_DESC ? true : false;
                 if ($orderByTree) {
                     $orderBy = 'CASE `models`.`reference`';
                 }
                 $reorder_tree = array();
                 foreach ($result as $reference_row) {
                     $reorder_tree[$reference_row['prev']] = $reference_row;
                     $parents[$reference_row["reference"]] = $reference_row["parent_ref"];
                     $prevs[$reference_row["reference"]] = $reference_row["prev"];
                 }
                 if (count($reorder_tree) === 1) {
                     $prev = key($reorder_tree);
                     $index = 0;
                 } else {
                     $prev = 0;
                     $index = 0;
                 }
                 while (isset($reorder_tree[$prev])) {
                     $current = $reorder_tree[$prev]['reference'];
                     $tree[] = $current;
                     $prev = $current;
                     if ($orderByTree) {
                         $orderBy .= ' WHEN ' . $current . ' THEN ' . $index;
                     }
                     $index++;
                 }
                 if ($orderByTree) {
                     $orderBy .= ' END';
                 }
             } elseif (isset($where["direct"])) {
                 foreach ($result as $reference_row) {
                     $tree[] = $reference_row['reference'];
                 }
             }
             if ($ordering === \Routerunner\Routerunner::BY_INDEX_DESC || $ordering === \Routerunner\Routerunner::BY_TREE_DESC) {
                 $orderBy .= ' DESC';
             }
             if (!$where) {
                 $where = array();
             }
             $where['models.reference IN (' . implode(',', $tree) . ')'] = null;
             $where['`' . $model_class . '`.`' . $primary_key . '` IS NOT NULL'] = null;
         } elseif ($strict) {
             $where['1 = 0'] = null;
         }
         if ($config_reference = \runner::config('reference')) {
             $where['models.reference IN (' . $config_reference . ')'] = null;
         }
     } else {
         // join models table and filter to reference
     }
     \runner::stack("parents", $parents);
     \runner::stack("prevs", $prevs);
     $SQL = '';
     unset($where["direct"]);
     $visible_references = array();
     $params = array();
     if (\runner::config("mode") != "backend" && \runner::config("mode") != "sitemap" && !\runner::now("skip_state_check") && !$skip_state) {
         $_from = $from;
         if (strpos($_from, "AS") !== false) {
             $_from = substr($_from, 0, strpos($_from, "AS"));
         }
         $SQL = "SELECT models.reference FROM " . $_from;
         if (strpos($_from, "models") !== false) {
             $SQL .= " AS models";
         }
         $SQL .= PHP_EOL;
         if ($leftJoin) {
             foreach ($leftJoin as $join) {
                 $SQL .= 'LEFT JOIN ' . $join . PHP_EOL;
             }
         }
         if (strpos($_from, "models") === false) {
             $SQL .= "LEFT JOIN {PREFIX}models AS models ON models.table_from = '" . $_from . "' AND models.table_id = " . $_from . "." . $primary_key . PHP_EOL;
         }
         $_where = array();
         if (isset($where) && is_array($where)) {
             $_where = $where;
         }
         $time = time();
         $_where["models.reference NOT IN (SELECT model FROM {PREFIX}model_states AS states WHERE states.active = 0 OR " . $time . " NOT BETWEEN COALESCE(begin, " . $time . ") AND COALESCE(end, " . $time . "))"] = null;
         if (is_array($_where) && count($_where)) {
             $SQL .= 'WHERE ';
             $i = 0;
             foreach ($_where as $filter => $param) {
                 if (!is_numeric($filter)) {
                     $SQL .= $filter;
                 }
                 if (preg_match('/(:[a-z0-9]+)/i', $filter, $match)) {
                     $params[$match[0]] = $param;
                 } elseif (strpos($filter, '?') !== false) {
                     $params[] = $param;
                 }
                 $i++;
                 if (!is_numeric($filter) && $i < count($_where)) {
                     $SQL .= ' AND ';
                 }
                 $SQL .= PHP_EOL;
             }
         } elseif ($_where) {
             $SQL .= 'WHERE ' . $_where . PHP_EOL;
         }
         if ($state_results = \db::query($SQL, $params)) {
             foreach ($state_results as $state_result) {
                 if (!empty($state_result["reference"])) {
                     $visible_references[] = $state_result["reference"];
                 }
             }
         }
         $SQL = '';
         $params = array();
     }
     if ($orderBy !== \Routerunner\Routerunner::BY_INDEX && $orderBy !== \Routerunner\Routerunner::BY_INDEX_DESC && $orderBy !== \Routerunner\Routerunner::BY_TREE && $orderBy !== \Routerunner\Routerunner::BY_TREE_DESC || $where) {
         $SQL = 'SELECT ';
         array_walk($select, function (&$value, $key) {
             if (is_null($value)) {
                 $value = 'NULL AS `' . trim($key, '`') . '`';
             } else {
                 $value = $value . ' AS `' . trim($key, '`') . '`';
             }
         });
         $SQL .= implode(', ', $select);
         $SQL .= PHP_EOL;
         $SQL .= 'FROM ' . $from . PHP_EOL;
         if ($leftJoin) {
             foreach ($leftJoin as $join) {
                 $SQL .= 'LEFT JOIN ' . $join . PHP_EOL;
             }
         }
         if ($visible_references) {
             /*
             $SQL .= "LEFT JOIN {PREFIX}models AS models ON models.table_from = '" . $from .
             	"' AND models.table_id = " . $from . "." . $primary_key . PHP_EOL;
             */
             if (!isset($where) || !is_array($where)) {
                 $where = array();
             }
             $where["`" . $from . "`.`" . $primary_key . "` IN (SELECT models.table_id FROM {PREFIX}models AS models\nWHERE models.reference IN (" . implode(",", $visible_references) . "))"] = null;
         }
         if (is_array($where) && count($where)) {
             $SQL .= 'WHERE ';
             $i = 0;
             foreach ($where as $filter => $param) {
                 if (!is_numeric($filter)) {
                     $SQL .= $filter;
                 }
                 if (preg_match('/(:[a-z0-9]+)/i', $filter, $match)) {
                     $params[$match[0]] = $param;
                 } elseif (strpos($filter, '?') !== false) {
                     $params[] = $param;
                 }
                 $i++;
                 if (!is_numeric($filter) && $i < count($where)) {
                     $SQL .= ' AND ';
                 }
                 $SQL .= PHP_EOL;
             }
         } elseif ($where) {
             $SQL .= 'WHERE ' . $where . PHP_EOL;
         }
         if ($groupBy) {
             $SQL .= 'GROUP BY ' . $groupBy . PHP_EOL;
         }
         if ($orderBy != "BY_TREE" && $orderBy != "BY_TREE_DESC" && $orderBy != "BY_INDEX" && $orderBy != "BY_INDEX_DESC") {
             if ($orderBy) {
                 $SQL .= 'ORDER BY ' . $orderBy . PHP_EOL;
             } elseif ($orderBy !== false) {
                 $SQL .= 'ORDER BY ' . $primary_key . PHP_EOL;
             }
         }
         if ($limit !== false) {
             $SQL .= 'LIMIT ' . $limit . PHP_EOL;
             if ($offset !== false) {
                 $SQL .= 'OFFSET ' . $offset . PHP_EOL;
             }
         } elseif ($limit === false && $offset !== false) {
             $SQL .= 'LIMIT 18446744073709551615' . PHP_EOL;
             $SQL .= 'OFFSET ' . $offset . PHP_EOL;
         }
     }
     return $SQL;
 }
$open = false;
$select = false;
$traverse = \runner::stack('traverse');
$models_created = \runner::stack("models_created");
$open = isset($runner->context['open']) ? $runner->context['open'] : false;
$debug = 1;
?>
	<<?php 
echo $element . $html;
?>
>
	<?php 
$router = false;
if ($open) {
    $removed = array();
    $children = \Routerunner\Bootstrap::children($runner->context['reference']);
    foreach ($children as $index => $child) {
        $open = in_array($child['reference'], $traverse['parents_ref']) ? true : false;
        if ($models_created) {
            foreach ($models_created as $created_data) {
                if (in_array($child['reference'], $created_data["parent"])) {
                    $open = true;
                }
            }
        }
        $override = null;
        $child_context = array('reference' => $child['reference'], 'model_class' => $child['model_class'], 'table_id' => $child['table_id'], 'route' => $runner->context['route'], 'open' => $open);
        if (isset($child['label'])) {
            $override = array('label' => $child['label']);
            //$child_context['label'] = $child['label'];
        }
<?php

/**
 * Created by PhpStorm.
 * User: csibi
 * Date: 2014.10.23.
 * Time: 16:23
 */
$runner->backend_context['parents'] = \Routerunner\Bootstrap::parent($runner->context['reference']);
$current = $runner->context['reference'];
$runner->backend_context['siblings'] = \Routerunner\Bootstrap::siblings($runner->context['reference'], false, $current);
$runner->backend_context['current'] = $runner->backend_context['siblings'][$current];
$parents_ref = array();
foreach ($runner->backend_context['parents'] as $parent) {
    $parents_ref[] = $parent['reference'];
}
$runner->backend_context['parents_ref'] = $parents_ref;
\runner::stack('traverse', $runner->backend_context);
 private function backend_wrapper($html = '', $type = 'model', $context = false)
 {
     if ($context) {
         $backend_type_context = $context;
     } elseif (is_callable($this->backend_context[$type])) {
         $backend_type_context = $this->backend_context[$type]($this);
     } else {
         $backend_type_context = $this->backend_context[$type];
     }
     if (!($tree = \runner::config("tree"))) {
         $scaffold = $this->scaffold_root;
         $tree = @(include $scaffold . '/model/tree.php');
     }
     if ($type == 'container') {
         // get parent model
         $parent = 0;
         if (isset($backend_type_context['parent'])) {
             $parent = $backend_type_context['parent'];
         }
         if (!$parent && $this->model && $this->model->reference && ($parents = \Routerunner\Bootstrap::parent($this->model->reference))) {
             $array_pop = array_pop($parents);
             $parent = $array_pop['reference'];
         }
         if (!$parent && isset($backend_type_context['traverse']) && is_array($traverse = $backend_type_context['traverse'])) {
             if (count($traverse) && ($lvl = array_pop($traverse)) && ($parent_table_id = \bootstrap::get($lvl))) {
                 if (is_array($parent_table_id)) {
                     $tmp_parent_table_id = false;
                     foreach ($parent_table_id["parents"] as $tmp_parent) {
                         if ($tmp_parent["model_class"] == $lvl) {
                             $tmp_parent_table_id = $tmp_parent["reference"];
                         }
                     }
                     if ($tmp_parent_table_id) {
                         $parent_table_id = $tmp_parent_table_id;
                     }
                 }
                 $SQL = 'SELECT reference FROM {PREFIX}models WHERE model_class = :class AND table_id = :table_id';
                 if ($result = \db::query($SQL, array(':class' => $lvl, ':table_id' => $parent_table_id))) {
                     $parent = $result[0]['reference'];
                 }
             }
         }
         // get acceptable models
         $accept = array();
         if (isset($backend_type_context['accept'])) {
             $accept = $backend_type_context['accept'];
         } elseif (isset($backend_type_context['traverse']) && ($branch = \Routerunner\Helper::tree_route($tree, $backend_type_context['traverse'], $this->model))) {
             foreach ($branch['children'] as $child_class => $child_params) {
                 if (isset($child_params['blank'])) {
                     $blank[] = $child_class;
                     $accept[$child_class] = $child_params['blank'];
                 }
             }
         }
         $backend_type_context['parent'] = $parent;
         $backend_type_context['blank'] = $accept;
         if (!isset($backend_type_context['wrapper'])) {
             $backend_type_context['wrapper'] = array('class' => '');
         } elseif (!isset($backend_type_context['wrapper']['class'])) {
             $backend_type_context['wrapper']['class'] = '';
         }
         $classes = explode(' ', $backend_type_context['wrapper']['class']);
         $classes = array_merge($classes, array_keys($accept));
         $backend_type_context['wrapper']['class'] .= implode(' ', $classes);
     }
     $dom = false;
     if ($html) {
         if (isset($backend_type_context['template']['opening'])) {
             $dom = \phpQuery::newDocument($backend_type_context['template']['opening'] . $html . $backend_type_context['template']['closing']);
             if (!$dom) {
                 $dom = \phpQuery::newDocumentHTML($html);
             }
         } elseif (isset($backend_type_context['wrapper']['element'])) {
             $dom = \phpQuery::newDocumentHTML($html, $charset = 'utf-8');
             $dom = $this->dom_wrapper($dom, $backend_type_context['wrapper']['element'], null);
         } else {
             $dom = \phpQuery::newDocumentHTML($html);
         }
     } elseif (isset($backend_type_context['wrapper']['element'])) {
         $html = '<' . $backend_type_context['wrapper']['element'] . '></' . $backend_type_context['wrapper']['element'] . '>';
         $dom = \phpQuery::newDocumentHTML($html);
     } elseif (isset($backend_type_context['template']['opening'])) {
         $html = $backend_type_context['template']['opening'] . $backend_type_context['template']['closing'];
         $dom = \phpQuery::newDocumentHTML($html);
     }
     $root_nodes = array();
     if ($dom && isset($backend_type_context['selector'])) {
         $root_nodes = pq($backend_type_context['selector'] . ":not(.routerunner-" . $type . ")");
     } elseif ($dom) {
         $root_nodes = $dom->children(":not(.routerunner-" . $type . ")");
     }
     $model = false;
     if ($type == 'model' && isset($this->model)) {
         $model = $this->model;
     } elseif ($type == 'container' && isset($backend_type_context['blank'])) {
         $model = new \stdClass();
         $model->reference = 0;
         foreach ($backend_type_context['blank'] as $blank_field => $blank_value) {
             $model->{$blank_field} = $blank_value;
         }
     }
     foreach ($root_nodes as $index => $node) {
         if (!in_array(strtolower($node->tagName), array("html", "head", "body", "script", "style"))) {
             if (!$this->unique) {
                 $this->unique = uniqid();
             }
             $backend_class = 'routerunner-backend routerunner-inline routerunner-' . $type . ' routerunner-' . $type . '-wrapper ';
             if (isset($backend_type_context['wrapper']['class'])) {
                 $backend_class .= $backend_type_context['wrapper']['class'] . ' ';
             }
             $pqnode = pq($node);
             $backend_context = $backend_type_context;
             unset($backend_context['wrapper']['element'], $backend_context['wrapper']['class'], $backend_context['wrapper']['attr'], $backend_context['template']['opening'], $backend_context['template']['closing']);
             $pqnode->removeAttr('data-routerunner-id');
             $pqnode->removeAttr('data-route');
             $pqnode->removeAttr('data-table_id');
             if ($model) {
                 foreach ($model as $data => $value) {
                     $pqnode->removeAttr('data-' . $data);
                 }
             }
             if (isset($backend_type_context['wrapper']['attr']) && is_array($backend_type_context['wrapper']['attr'])) {
                 foreach (array_keys($backend_type_context['wrapper']['attr']) as $attr) {
                     $pqnode->removeAttr($attr);
                 }
             }
             if (isset($backend_context) && is_array($backend_context)) {
                 foreach (array_keys($backend_context) as $data) {
                     $pqnode->removeAttr('data-' . $data);
                 }
             }
             // modify model tag
             if ($type == 'model' && $model) {
                 $this->backend_id[$index] = 'ref' . $model->reference . '_' . $this->unique;
                 $model->backend_ref = $this->backend_id[$index];
                 $pqnode->attr('data-routerunner-id', $this->backend_id[$index]);
                 $pqnode->attr('data-route', $this->router->runner->path . $this->router->runner->route);
                 $pqnode->attr('data-url', $model->url());
                 if ($model) {
                     foreach ($model as $data => $value) {
                         if (is_array($value)) {
                             $value = json_encode($value, JSON_HEX_APOS);
                         } else {
                             $value = htmlentities(addslashes(preg_replace('/\\n|\\r/m', '', $value)));
                         }
                         $pqnode->attr('data-' . $data, $value);
                     }
                 }
             } elseif ($type == 'container') {
                 $this->backend_id[$index] = 'route_' . trim(str_replace('/', '_', $this->path . $this->route), '_') . '_' . $this->unique;
                 $pqnode->attr('data-routerunner-id', $this->backend_id[$index]);
                 $pqnode->attr('data-route', $this->router->runner->path . $this->router->runner->route);
                 if ($model) {
                     foreach ($model as $attr => $value) {
                         $traverse_child = isset($backend_type_context['traverse']) ? $backend_type_context['traverse'] : array();
                         $traverse_child[] = $attr;
                         if ($branch = \Routerunner\Helper::tree_route($tree, $traverse_child)) {
                             foreach ($branch as $branch_attr => $branch_value) {
                                 if (substr($branch_attr, 0, 4) == 'btn-' || $branch_attr == 'icon') {
                                     $value[$branch_attr] = $branch_value;
                                 }
                             }
                         }
                         if (is_array($value)) {
                             $value = json_encode($value, JSON_HEX_APOS);
                         } else {
                             $value = htmlentities(addslashes(preg_replace('/\\n|\\r/m', '', $value)));
                         }
                         $pqnode->attr('data-' . str_replace("/", "-", $attr), $value);
                     }
                 }
             }
             if (isset($backend_type_context['wrapper']['attr']) && is_array($backend_type_context['wrapper']['attr'])) {
                 foreach ($backend_type_context['wrapper']['attr'] as $attr => $value) {
                     $pqnode->attr($attr, $value);
                 }
             }
             $backend_classes = explode(' ', $backend_class);
             foreach ($backend_classes as $class) {
                 if (!$pqnode->hasClass($class)) {
                     $pqnode->addClass($class);
                 }
             }
             if (isset($backend_context) && is_array($backend_context)) {
                 foreach ($backend_context as $data => $value) {
                     if (is_array($value)) {
                         $value = json_encode($value, JSON_HEX_APOS);
                     } else {
                         $value = htmlentities(addslashes(preg_replace('/\\n|\\r/m', '', $value)));
                     }
                     $pqnode->attr('data-' . $data, $value);
                 }
             }
         }
     }
     $return = "";
     if ($dom) {
         $return = $dom->htmlOuter();
     }
     return $return;
 }
Пример #8
0
 \runner::stack("model_create", array("route" => $route));
 \runner::route($route, array("direct" => 0), $router, true, $model);
 $return["html"] = $router->runner->html_render;
 $return["html_before"] = $router->runner->html_before;
 $return["html_after"] = $router->runner->html_after;
 if (isset($router->runner->backend_context["model"])) {
     $return["backend_context"] = $router->runner->backend_context["model"];
 }
 \runner::stack("model_create", false);
 $models_created = \runner::stack("models_created");
 if (!$models_created) {
     $models_created = array();
 }
 $parent = array();
 if (isset($post["parent"])) {
     $parents = \Routerunner\Bootstrap::parent($post["parent"]);
     foreach ($parents as $cur_parent) {
         $parent[] = $cur_parent["reference"];
     }
     $parent[] = $post["parent"];
 }
 $models_created[$model->reference] = array("class" => $model->class, "route" => $model->route, "table_from" => $model->table_from, "table_id" => $model->table_id, "backend_ref" => $model->backend_ref, "parent" => $parent, "permission" => $model->permission);
 \runner::stack("models_created", $models_created, true);
 $return['success'] = true;
 if (isset($model->reference)) {
     $return['reference'] = $model->reference;
     $return['model'] = $model;
 } elseif (is_array($model) && count($model) == 1) {
     $return['reference'] = $model[0]->reference;
     $return['model'] = $model[0];
 } elseif (is_array($model) && count($model) > 1) {
Пример #9
0
     if ($treeroot) {
         $route[] = $treeroot["model_class"] . '/' . $treeroot["table_id"];
     }
     if (isset($post['route']) && is_array($post['route'])) {
         $treeroot_index = false;
         foreach ($post['route'] as $post_route_index => $post_route) {
             if ($post_route && ($post_route == $treeroot["model_class"] || strpos($post_route, $treeroot["model_class"] . '/') !== false)) {
                 $treeroot_index = $post_route_index;
                 break;
             }
         }
         if ($treeroot_index && count($post['route']) > $treeroot_index) {
             $route = array_merge($route, array_slice($post['route'], $treeroot_index + 1));
         }
     }
     $tree = \Routerunner\Bootstrap::getTree($post["current"]);
     $current = $tree["current"];
     //$route[] = $current["model_class"];
 }
 if ($treeroot && isset($treeroot["reference"])) {
     $treeroot = $treeroot["reference"];
 } else {
     $treeroot = $lang;
 }
 $context = array('reference' => isset($post["reference"]) && $post["reference"] ? $post["reference"] : $treeroot, 'model_class' => '', 'table_id' => 0, 'route' => $route ? $route : array(''), 'open' => true);
 if (isset($post['reference'], $post['model_class'], $post['table_id']) && $post['reference'] && $post['model_class'] && $post['table_id']) {
     $context['reference'] = $post['reference'];
     $context['model_class'] = $post['model_class'];
     $context['table_id'] = $post['table_id'];
     $context['route'] = $route;
 }
Пример #10
0
 public static function bootstrap()
 {
     return \Routerunner\Bootstrap::bootstrap();
 }
 public function middleware($routerunner_object, $arguments = array())
 {
     self::cache_connect();
     \Routerunner\Routerunner::$slim->flashKeep();
     \Routerunner\User::initialize();
     if ($uid = \Routerunner\User::me($email, $name, $gid)) {
         /*
         $this->uid = $uid;
         $this->gid = $gid;
         */
     }
     if (isset($routerunner_object->container['settings']['log.writer'])) {
         $log_class = $routerunner_object->container['settings']['log.writer'];
         $app = \Routerunner\Routerunner::$slim;
         $app->log->setWriter(new $log_class());
         $app->error(function (\Exception $e) use($app, $log_class) {
             new $log_class($e);
         });
     }
     if (!isset($arguments["bootstrap"]) || $arguments["bootstrap"] !== false) {
         \Routerunner\Bootstrap::initialize($routerunner_object->settings);
         $history = \Routerunner\Routerunner::$slim->flash('history');
         if (!is_array($history)) {
             $history = array();
         }
         if (count($history) > 20) {
             $history = array_slice($history, -20, 20);
         }
         if (!count($history) || count($history) && $history[count($history) - 1] != \Routerunner\Bootstrap::$fullUri) {
             $history[] = \Routerunner\Bootstrap::$fullUri;
         }
         \Routerunner\Bootstrap::$history = $history;
         \Routerunner\Routerunner::$slim->flash('history', \Routerunner\Bootstrap::$history);
         if (count($history) > 1) {
             \Routerunner\Routerunner::$slim->now('history.back', $history[count($history) - 2]);
         }
     }
     if (!isset($arguments["skip_route"]) || !$arguments["skip_redirect"]) {
         \Routerunner\Routerunner::route();
     }
     if (\Routerunner\Routerunner::$slim->now('redirect_url') && (!isset($arguments["skip_redirect"]) || !$arguments["skip_redirect"])) {
         \Routerunner\Routerunner::$slim->redirect(\Routerunner\Routerunner::$slim->now('redirect_url'));
     }
 }
 public function __construct()
 {
     $this->resource_types = array_merge($this->resource_types, $this->menus, $this->contents);
     $resources = \Routerunner\Bootstrap::$resources;
     $this->reference = \Routerunner\Bootstrap::$reference;
     $this->resource_url = trim(\Routerunner\Bootstrap::$resourceUri, ' /');
     $this->url = $this->resource_url;
     $this->urls = \Routerunner\Bootstrap::$urls;
     if (count($this->urls)) {
         $this->url = $this->urls[0];
     }
     $this->pageproperties = $this->pageproperties_default;
     foreach (\Routerunner\Bootstrap::$metas as $meta_key => $meta_value) {
         if ($meta_key == "meta" && is_array($meta_value)) {
             foreach ($meta_value as $row_key => $row_value) {
                 if (!is_array($this->pageproperties[$meta_key])) {
                     $this->pageproperties[$meta_key] = array();
                 }
                 if ($row_value !== false) {
                     $this->pageproperties[$meta_key][$row_key] = $row_value;
                 }
             }
         } elseif ($meta_value !== false) {
             $this->pageproperties[$meta_key] = $meta_value;
         }
     }
     $this->states = array_merge_recursive($this->states, \Routerunner\Bootstrap::$states);
     $this->lang = \Routerunner\Bootstrap::$lang;
     $this->tree = \Routerunner\Bootstrap::$tree;
     if ($this->tree['children']) {
         foreach ($this->tree['children'] as $child) {
             $this->children[$child['reference']] = array($child['table_id'] => $child['model_class']);
             if (in_array($child['model_class'], $this->contents)) {
                 $this->content_children[$child['reference']] = array($child['table_id'] => $child['model_class']);
             } elseif (in_array($child['model_class'], $this->menus)) {
                 $this->menu_children[$child['reference']] = array($child['table_id'] => $child['model_class']);
             }
             if (!$this->first_child) {
                 $this->first_child = $child;
             }
         }
         if (!$this->content_children && $this->menu_children) {
             foreach ($this->menu_children as $menu_reference => $menu_table) {
                 if ($menu_children = \Routerunner\Bootstrap::children($menu_reference)) {
                     foreach ($menu_children as $menu_child) {
                         if (in_array($menu_child['model_class'], $this->contents)) {
                             $this->sub_content_children[$menu_child['reference']] = array($menu_child['table_id'] => $menu_child['model_class']);
                         }
                     }
                 }
             }
         }
     }
     $parents = array();
     if (isset($this->tree['parents'])) {
         $parents = $this->tree['parents'];
     }
     $current = false;
     if (isset($this->tree['current'])) {
         $current = $this->tree['current'];
     } elseif (isset($resources[0], $resources[1])) {
         $this->current = array($resources[0] => $resources[1]);
     }
     if ($current && is_array($current)) {
         unset($current['ind']);
         $current['lvl'] = 0;
         $parents[] = $current;
     }
     foreach ($parents as $parent) {
         if (isset($parent['model_class']) && $parent['model_class'] !== "lang") {
             if (!isset($this->breadcrumb[$parent['model_class']])) {
                 $this->breadcrumb[$parent['model_class']] = $parent['table_id'];
             } else {
                 if (!is_array($this->breadcrumb[$parent['model_class']])) {
                     $this->breadcrumb[$parent['model_class']] = array($this->breadcrumb[$parent['model_class']]);
                 }
                 $this->breadcrumb[$parent['model_class']][] = $parent['table_id'];
             }
         }
     }
     if (isset($this->tree['current']['model_class'], $this->tree['current']['table_id'])) {
         $this->current = array($this->tree['current']['model_class'] => $this->tree['current']['table_id']);
     }
     $this->resource = $resources;
     $this->params = \Routerunner\Bootstrap::$params;
 }