Я использую PHP CMS, который я сделал сам. Он извлекает url
параметра $ _GET и превращает его в www.website.com/{url}
. Эта CMS использует параметр $ _GET для получения файла. Итак, если url
является index
, CMS ищет index
файла и возвращает содержимое файла. Но теперь я расширяю CMS, чтобы добавить параметр добавления, например profile/{username}
. Как я могу расширить его? Я хочу, чтобы мой URL-адрес сказал: www.website.com/profile/{username}
. Как мне это сделать? Это мой текущий htaccess:
RewriteEngine On RewriteRule ^(|/)$ index.php?url=$1 RewriteRule ^([a-zA-Z0-9_-]+)(|/)$ index.php?url=$1a
Вот система TPL.
public function addTpl() { global $zip; if(!isset($_GET['url']) || empty($_GET['url'])) { $_GET['url'] = 'index'; } if(file_exists('_zip/_templates/_front/'. $zip['Template']['Front'] . '/')) { if(file_exists('_zip/_templates/_front/'. $zip['Template']['Front'] . '/' . secure($_GET['url']) . '.php')) { ob_start(); include('_zip/_templates/_front/'. $zip['Template']['Front'] . '/' . secure($_GET['url']) . '.php'); $this->tpl .= ob_get_contents(); ob_end_clean(); } else { die(zipError('File Not Found', 'The file <b>' . secure($_GET['url']) . '</b> could not be found. Please re-check the URL; If you were directed here using a link, please report that link.')); } } else { die(zipError('Template Not Found', 'The template <b>' . $zip['Template']['Front'] . '</b> could not be found. Please check your configuration file for a mistake.')); } }
Есть ли какая-то другая информация, которую я должен предоставить? Мне нужно сделать это как можно скорее, поэтому любые советы будут высоко оценены.
Ответ на php_nub_qq чище: вам было бы лучше в долгосрочной перспективе сделать это, используя $_SERVER['REQUEST_URI']
вместо добавления дополнительных правил перезаписи каждый раз, когда вы хотите добавить новое подразделение в свою CMS. Но я все же ответил ниже, полагая, что вы не хотите слишком сильно менять свой существующий код, так как вы находитесь под пистолетом.
Также вы делаете большие длины, чтобы не устанавливать какие-либо переменные в addTpl (). Это по уважительной причине, поскольку php_nub_qq также уже указывал, что необходимо избегать любых переменных, которые устанавливаются в дочернем шаблоне, которые будут нарушать инкапсуляцию. Но теперь это громоздкая сдержанность, когда вам нужно добавить больше логики к этому методу, поэтому вам, вероятно, следует учесть включение шаблона в частный метод. Затем вы можете сделать любую сложную логику в addTpl (), которую хотите. Чтобы избежать установки каких-либо переменных вообще в файле шаблона, кроме $this
, вы можете установить путь к файлу шаблона непосредственно в самом объекте шаблона и использовать его при передаче его методу включения шаблона.
Итак, вы добавили бы другое правило перезаписи:
RewriteRule ^profile/([a-zA-Z0-9_-]+)(|/)$ index.php?username=$1
Изменить: я удалил лишнюю косую черту в начале регулярного выражения, которое нарушило это.
Это установит ключ имени пользователя в $_GET
, который вы можете использовать для переключения шаблона для загрузки. Затем внутри любого класса addTpl () находится следующее (это также предполагает, что вы меняете свой конфиг, чтобы добавить $zip['Template']['Profile']
который похож на $zip['Template']['Front']
чтобы установить каталог для шаблонов профиля:
class Template { public $tpl = ''; private $_template_file; public function addTpl() { global $zip; if(!isset($_GET['url']) || empty($_GET['url'])) { $_GET['url'] = 'index'; } $top_dir = '_zip/_templates/'; $type_dir = '_front/'; $configured = $zip['Template']['Front']; $file = $_GET['url']; // Check username val and use custom template: if (!empty($_GET['username'])) { $type_dir = '_profile/'; $configured = $zip['Template']['Profile']; // assuming you're configuring profile templates $file = $_GET['username']; } $full_dir = $top_dir . $type_dir . $configured . '/'; if(file_exists($full_dir)) { $full_file = $full_dir . secure($file) . '.php'; if(file_exists($full_file)) { $this->_template_file = $full_file; $this->tpl .= $this->loadTemplate(); } else { die(zipError('File Not Found', 'The file <b>' . secure($file) . '</b> could not be found. Please re-check the URL; If you were directed here using a link, please report that link.')); } } else { die(zipError('Template Not Found', 'The template <b>' . $configured . '</b> could not be found. Please check your configuration file for a mistake.')); } } private function loadTemplate() { ob_start(); include($this->_template_file); $result = ob_get_contents(); ob_end_clean(); return $result; } }
Второй параметр ({username)) может быть локальным, прежде чем включать этот файл, в который вы можете получить доступ к нему как к обычной переменной. Это нехорошо, если вы работаете с командой.
EDIT :
Что вы можете сделать, это следующее
RewriteEngine On RewriteRule ^ index.php
Тогда в index.php вы можете получить это
$url = str_replace('index.php','', $_SERVER['PHP_SELF']); $url = str_replace($url,'',$_SERVER['REQUEST_URI']); $url = explode('/',$url); $page = array_shift($url); foreach ($url as $val){ $args[] = urldecode($val); }
Теперь, если вы откроете ссылку www.website.com/profile/someuser/about
вас будет
$page = 'profile' $args[0] = 'someuser' $args[1] = 'about'
И так далее, у вас может быть столько аргументов, сколько вам нравится.