При доступе к сценарию, который я пишу, вы передаете путь категории к нему при доступе к странице.Затем сценарий сравнивает данные с массивом фактических категорий или ветвью, которая должна быть связана с этой категорией.
Я устанавливаю родителей и всех его детей в tree
, а затем снижаюфилиал и сравнение данных, чтобы убедиться, что клиент использует правильный URL.Вот краткий пример того, как работает код:
// Customer is accessing from site.com/store/some-cat/some-othercat
// We pass those variables with the htaccess to script.php?var=$1,$2
// We then explode that to make an array on $var[0] and $var[1]
$categoryMap = explode(",", $_GET['var']);
$categoryID = array();
$categoryInfoMap = array();
foreach ($categoryMap as $a) {
$categoryIDs[] = trim($a);
}
$getCategoryInfo = $db->fn->query("SELECT * FROM store_category");
....
// Inside while loop...
$categoryInfoMap[] = $db->result[]; // stored whole results as array
// End of the while loop
$masterKey = $mainClass->findKeyInDbArray($categoryInfoMap, 'c.path', $categoryMap[0]);
if ((isset($masterKey) && $masterKey === "0") || !empty($masterKey)) {
$thisId = $categoryInfoMap[$masterKey]['c.id'];
$thisPath = $categoryInfoMap[$masterKey]['c.path'];
$thisName = $categoryInfoMap[$masterKey]['c.name'];
$tree = $mainClass->buildTree($categoryInfoMap);
$children = $tree['children'][$thisId];
$childrenItems = "";
foreach ($categoryIDs as $cid) {
// One of the categories entered doesnt exist at all so we redirect,
// else we will go through them and make sure theyre apart of the branch
if (!$mainClass->recursive_array_search($cid, $tree)) {
... redirect them somewhere and die()
} else {
if (!$mainClass->recursive_array_search($cid, $children)) {
... redirect them somewhere and die()
} else {
!!!!!!!!!!!!============!!!!!!!!!!!!!!
THIS IS THE IMPORTANT PART HERE
!!!!!!!!!!!!============!!!!!!!!!!!!!!
}
}
}
}
... Rest of the script which works for now
Вот функции, использованные в приведенном выше коде
public function findKeyInDbArray($products, $field, $value) {
foreach($products as $key => $product) {
if ($product[$field] === $value) {
return "$key";
}
}
return NULL;
}
public function buildTree($arr) {
$tree = array(
'children' => array()
);
$index = array(0=>&$tree);
foreach ($arr as $key => $val) {
$parent = &$index[$val['c.parentcatid']];
$node = $val;
$parent['children'][$val['c.id']] = $node;
$index[$val['c.id']] = &$parent['children'][$val['c.id']];
}
return $tree;
}
public function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) && $this->recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}
А вот пример массива дерева из родительского узлавниз.Коротко из соображений видимости
Array(
[c.id] => 1
[c.name] => Radios
[c.path] => radios
[c.parentcatid] => 0
[children] => (
[2] => (
[0] => 2
....
[children] => (
[3] => (
[c.id] => 3
....
[c.parentcatid] => 2
),
[4] => (
[c.id] => 4
....
[c.parentcatid] => 2
)
)
)
......
[10] => (
[0] => 10
....
[c.parentcatid] => 1
)
)
SO на хорошие биты
В данный момент код работает, чтобы доказать, что ветви имеют совпадающие переменные из своего дерева.Если путь к элементу, который является переменной, которую мы используем для сравнения с URL $var
, совпадает, то он будет продолжаться и работать.так что если в ветке существуют следующие значения:
array(c.path => 'foo'),
array(c.path => 'bar')
И я посещаю скрипт как site.com/store/foo/bar
, тогда все прекрасно работает.Если я захожу на сайт как site.com/store/foo/notBar
, то это не удастся, так как переменная notBar не является членом этой ветки.Это идеально верно?Все должно работать!За исключением того, что это не так и по уважительной причине.
Проблема здесь
Если элемент соответствует в ветви, то он прошел проверку, и этоконец проверки.Не, если элемент передается в неправильном порядке, таком как site.com/store/bar/foo
, тогда он все еще технически имеет хорошие переменные в нем, но он НЕ ДОЛЖЕН проходить, так как структура не в том порядке, в котором она идет по родительскому массиву.Аналогично, если другая ветвь дальше по дереву, скажем, существует barwithNoChildren
, я могу поменять ее с foo
или bar
и все равно пройти, даже если ничего не должно быть .
Надеюсь, вы понимаете, о чем я спрашиваю, и можете помочь предложить способы обойти это.Последние несколько дней я ломал голову над этой системой, и, поскольку им нужны причудливые URL-адреса по seo и по другим причинам, это оказалось намного сложнее, чем я планировал.Спасибо за любые предложения!