Доброго всем времени суток!
Есть проблема, я описывал ее здесь Проблема активного меню с custom_rewrite
Вкратце:
создаем в меню пункт Вход, ставим тип "ссылка", сама ссылка вот такая /login.
Теперь у нас по клику по пункту меню Вход — можно зайти на сайт.
Кликаем по ней...
Но пункт меню ВХОД не стал активным!
Налицо ошибка в разборе меню, т.е. ссылки вида /login, /passremind b прочие не обрабатываются!
Вы скажете да зачем нам это нужно, у нас эти ссылки висят отдельно. Да, на самом деле, смысла вносить изменения ради этих ссылок нет никакого.
Смысл есть, если мы будем использовать custom_rewrite для своихнизменных важных целей. Например, сделать так, чтобы урл контента в каком-либо компоненте был не пятнадцать слов а два
Итак поехали.
сегодня правим файл cms.php
добавляем в начале файла строку
там закешируем правила rewrite
берем функцию loadMenuStruct (загрузка меню в память)
меняем цикл
на
это мы посчитали "настоящую" ссылку в меню
добавляем новую функцию -
А теперь в функции menuID() меняем цикл foreach
на
теперь меню работает правильно
делалось под 1.8 для 1.9 думаю будет аналогично
решение не претендует на красоту, но общая идея понятна
а по поводу "зачем все это нужно" я расскажу в следующих постах
Есть проблема, я описывал ее здесь Проблема активного меню с custom_rewrite
Вкратце:
создаем в меню пункт Вход, ставим тип "ссылка", сама ссылка вот такая /login.
Теперь у нас по клику по пункту меню Вход — можно зайти на сайт.
Кликаем по ней...
Но пункт меню ВХОД не стал активным!
Налицо ошибка в разборе меню, т.е. ссылки вида /login, /passremind b прочие не обрабатываются!
Вы скажете да зачем нам это нужно, у нас эти ссылки висят отдельно. Да, на самом деле, смысла вносить изменения ради этих ссылок нет никакого.
Смысл есть, если мы будем использовать custom_rewrite для своих
Итак поехали.
сегодня правим файл cms.php
добавляем в начале файла строку
private $rules;
берем функцию loadMenuStruct (загрузка меню в память)
меняем цикл
while ($item = $inDB->fetch_assoc($result)){ $this->menu_struct[$item['id']] = $item; }
while ($item = $inDB->fetch_assoc($result)){ $this->menu_struct[$item['id']] = $item; $realink='/'.$this->detectorMenuURI($item['link']); $this->menu_struct[$item['id']]['realink'] = $realink; }
добавляем новую функцию -
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private function detectorMenuURI($muri){ $uri = $muri; if (!$this->rules) { //подключаем список rewrite-правил $this->includeFile('url_rewrite.php'); //получаем правила $rules = rewrite_rules(); } } //подключаем список пользовательских rewrite-правил $this->includeFile('custom_rewrite.php'); //добавляем к полученным ранее правилам пользовательские } } if ($rules){ $this->rules=$rules;} } else { $rules=$this->rules; } $found = false; if ($rules){ //перебираем правила foreach($rules as $rule_id=>$rule) { //небольшая валидация правила if (!$rule['source'] || !$rule['target'] || !$rule['action']) { continue; } //проверяем совпадение выражения source с текущим uri //перебираем совпавшие сегменты и добавляем их в target //чтобы сохранить параметры из $uri в новом адресе foreach($matches as $key=>$value){ if (!$key) { continue; } } } //действие по-умолчанию: rewrite if (!$rule['action']) { $rule['action'] = 'rewrite'; } //выполняем действие switch($rule['action']){ case 'rewrite' : $uri = $rule['target']; $found = true; break; case 'redirect' : $this->redirect($rule['target']); break; case 'redirect-301' : $this->redirect($rule['target'], '301'); break; case 'alias' : $this->includeFile($rule['target']); $this->halt();break; } } if ($found) { break; } } } return $uri; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
foreach($menu as $item){ if (!$item['link']) { continue; } //полное совпадение ссылки и адреса? if ($uri == $item['link']){ $menuid = $item['id']; $is_strict = true; //полное совпадение break; } //частичное совпадение ссылки и адреса (по началу строки)? if ($uri_first_part == $item['link']){ $menuid = $item['id']; break; } }
foreach($menu as $item){ if (!$item['link']) { continue; } //полное совпадение ссылки и адреса? if ($uri == $item['link']){ $menuid = $item['id']; $is_strict = true; //полное совпадение break; } //////////////// Определяем правильную ссылку для пункта меню if ($uri == $item['realink']){ $menuid = $item['id']; $is_strict = true; //полное совпадение break; } ///////////////////////////////////////////////////////////////////////////// //частичное совпадение ссылки и адреса (по началу строки)? if ($uri_first_part == $item['link']){ $menuid = $item['id']; break; } //////////////// Определяем правильную ссылку для пункта меню ///////////// //частичное совпадение ссылки и адреса (по началу строки)? if ($uri_first_part == $item['realink']){ $menuid = $item['id']; break; } ////////////////////////////////////////////////////////////////////////////// }
делалось под 1.8 для 1.9 думаю будет аналогично
решение не претендует на красоту, но общая идея понятна
а по поводу "зачем все это нужно" я расскажу в следующих постах
Реклама #
universe 12 лет назад #
не понял про что это=)
Крот 12 лет назад #
http://сайт.ру/категория1/категория2/категория3/.../объект.html
а просто
http://сайт.ру/категория/объект.html вне зависимости от вложенности
это просто пример, через custom_rewrite много интересного сделать можно
universe 12 лет назад #
Крот 12 лет назад #
Крот 12 лет назад #
Алексей Т 12 лет назад #
Крот 12 лет назад #
Tarhun 12 лет назад #
Tarhun 12 лет назад #
После пункта "добавляем новую функцию"
Перестает вообще открываться сайт, происходит редирект - http://сайт.ру/сайт.ру/
BSB 12 лет назад #
Есть, правда, вероятность, что версию неполноценную выкачал (критерий был - utf-8). Кто-нить, дайте сцыль на .htaccess правильный? А то у меня такое впечатление, что в транках он левый.
Крот 12 лет назад #
функция detectorMenuURI() - на самом деле это просто подправленная копия detectURI - сделано для ускорения работы
можно использовать оригинальный detectURI - но тогда при каждом клике будет пересчитываться список uri
соотв-но при изменении списка в custom_rewrite нужно как-то сбрасывать закэшированное значение
Fuze 12 лет назад #
После
Крот 12 лет назад #
НО:
второе решение, также как и мое содержит один нюанс -
есть два пункта меню
1) /catalog/1001
2) /catalog
при клике на первое - активным становится второе. решается сначала перебором полных путей, а затем, если не найдено перебор частичных путей.
вот теперь меня метод menuID() устраивает полностью )))
Tarhun 12 лет назад #
Можете скинуть сам файл cms.php для 1.9?
Олег Васильевич я 12 лет назад #
Bubble Gumoff 12 лет назад #
ссылка статьи была host/statya
ссылка категории host/kategoriya
ссылка подкатегории host/podkategoriya
*wildbeez* 12 лет назад #
Крот 12 лет назад #