Php Joomla组件路由器
我试图按照文档页面上的说明进行操作,但我似乎遗漏了一些东西: 需要更正的URI是:index.php?com_component&view=legal&page=customermasteragreementPhp Joomla组件路由器,php,joomla,joomla3.0,Php,Joomla,Joomla3.0,我试图按照文档页面上的说明进行操作,但我似乎遗漏了一些东西: 需要更正的URI是:index.php?com_component&view=legal&page=customermasteragreement class ComponentRouter extends JComponentRouterBase { public function build(&$query) { $segments = array(); $view = null
class ComponentRouter extends JComponentRouterBase {
public function build(&$query) {
$segments = array();
$view = null;
if (isset($query['view'])) {
$segments[] = $query['view'];
$view = $query['view'];
unset($query['view']);
}
if (isset($query['id'])) {
if ($view !== null) {
$segments[] = $query['id'];
} else {
$segments[] = $query['id'];
}
unset($query['id']);
}
return $segments;
}
public function parse(&$segments) {
$vars = array();
// View is always the first element of the array
$vars['view'] = array_shift($segments);
return $vars;
}
}
看起来路由功能应该很简单,但是页面只是显示默认值,而不是子视图
以下是我当前的代码:
function ComponentBuildRoute(&$query)
{
$segments = array();
if (isset($query['view'])) {
$segments[] = $query['view'];
unset($query['view']);
}
if (isset($query['page'])) {
$segments[] = $query['page'];
unset($query['page']);
}
return $segments;
}
function ComponentParseRoute($segments)
{
$vars = array();
switch($segments[0])
{
case 'legal':
$vars['view'] = 'legal';
break;
case 'customermasteragreement':
$vars['page'] = 'customermasteragreement';
break;
}
return $vars;
}
更新
这段代码用于显示子页面,但它给了我一个URI,如:legal agreements/legal?page=customermasteragreement
class ComponentRouter extends JComponentRouterBase {
public function build(&$query) {
$segments = array();
$view = null;
if (isset($query['view'])) {
$segments[] = $query['view'];
$view = $query['view'];
unset($query['view']);
}
if (isset($query['id'])) {
if ($view !== null) {
$segments[] = $query['id'];
} else {
$segments[] = $query['id'];
}
unset($query['id']);
}
return $segments;
}
public function parse(&$segments) {
$vars = array();
// View is always the first element of the array
$vars['view'] = array_shift($segments);
return $vars;
}
}
编辑2
如果有帮助,下面是我的模型和视图
models/legal.php
// import Joomla modelitem library
jimport('joomla.application.component.modelitem');
class ComponentModelLegal extends JModelItem {
public function __construct($config = array())
{
JLoader::register('ComponentHelper', JPATH_COMPONENT_ADMINISTRATOR . '/helpers/component.php');
parent::__construct($config);
}
/**
*
* @return string
*/
public function getLegal() {
$app = JFactory::getApplication();
$page = $app->input->get('page', '', 'STRING');
if ($page) {
ComponentHelper::add('type', $page); //This is an API request to an external service, returning JSON formatted data
$legal = ComponentHelper::getData('commons/legal-agreements.json', TRUE);
if (isset($legal[0]['status'])) {
JError::raiseError(400, $legal[0]['ERROR']);
return false;
} else {
if (!isset($this->legal)) {
$this->legal = $legal;
}
return $this->legal;
}
}
}
}
views/legal/view.html.php
class ComponentViewLegal extends JViewLegacy {
function display($tpl = null) {
// Assign data to the view
$this->legal = $this->get('legal');
// Check for errors.
if (count($errors = $this->get('Errors'))) {
JLog::add(implode('<br />', $errors), JLog::WARNING, 'jerror');
return false;
}
// Display the view
parent::display($tpl);
}
}
除非我完全误解了Joomla(我已经用它开发了四到五年了),否则没有实现“子视图”概念。我认为,试图利用这个想法会让你陷入困境 使用可视化调试器的想法如此不受欢迎,我感到震惊。 让自己有点像Netbeans(还有其他的),设置一个本地web和数据库服务器,并观察代码的运行。非常(好的,相对非常)快,你就会开始理解结构是如何连接在一起的
您可以在视图中放置代码,以拾取已设置的额外参数,并相应地显示或隐藏内容,但没有“子视图”。您有一个
视图
,但在捕获视图
参数时,实际上未正确设置页面
参数,但是你把page
当作另一种观点的国王。请您尝试一下并检查它是否有效:
function [componentname]ParseRoute($segments)
{
$vars = array();
switch($segments[0])
{
case 'legal':
$vars['view'] = 'legal';
$vars['page'] = $segments[1];
break;
}
return $vars;
}
class ComponentRouter extends JComponentRouterBase {
public function build(&$query) {
$segments = array();
$view = null;
if (isset($query['view'])) {
$segments[] = $query['view'];
$view = $query['view'];
unset($query['view']);
}
if (isset($query['page'])) {
$segments[] = $query['page'];
unset($query['page']);
}
return $segments;
}
public function parse(&$segments) {
$vars = array();
// View is always the first element of the array
$vars['view'] = array_shift($segments);
if(count($segments) > 0)
$vars['page'] = array_shift($segments);
return $vars;
}
}
此外,函数ComponentBuildRoute
,ComponentParseRoute
必须在开头有您的组件名称,而不是Component
编辑
[componentname]BuildRoute
和[componentname]ParseRoute
不推荐使用,您应该将扩展jComponentRoute
的类粘贴到更新后的第二个示例中。在这里试试这个,看看是否有效:
function [componentname]ParseRoute($segments)
{
$vars = array();
switch($segments[0])
{
case 'legal':
$vars['view'] = 'legal';
$vars['page'] = $segments[1];
break;
}
return $vars;
}
class ComponentRouter extends JComponentRouterBase {
public function build(&$query) {
$segments = array();
$view = null;
if (isset($query['view'])) {
$segments[] = $query['view'];
$view = $query['view'];
unset($query['view']);
}
if (isset($query['page'])) {
$segments[] = $query['page'];
unset($query['page']);
}
return $segments;
}
public function parse(&$segments) {
$vars = array();
// View is always the first element of the array
$vars['view'] = array_shift($segments);
if(count($segments) > 0)
$vars['page'] = array_shift($segments);
return $vars;
}
}
编辑2
我有一个测试Joomla 3站点,它有一个名为Ola
的简单组件
非SEO组件URL:
路由器类添加到Router.php
之前,由JRoute
生成的URL:
JRoute::(('index.php?option=com\u ola&page=test\u page&view=ola')返回的SEO URL
创建router.php
并使用上面的router类后:
如果您访问这些链接,您将看到所有这些都在工作,甚至可以看到调用组件的
页面
、视图
和JRoute
结果Ola
实际上我使用的是NetBeans,还有PHPStorm和Visual Studio代码。本例中的子视图只是普通视图,在JRequest::getVar('page')上有一个开关。从那里加载另一个文件只需将其作为$this->loadTemplate('legal')进行查找,请查看com_内容或com_新闻提要。它们都有相同的概念。除非我的组件的名称是“组件”。)@当然是杰米沙弗。我写这篇文章只是为了澄清正确的名称必须在类/函数的开头。请尝试我更新的类,看看它是否能正常工作。现在它出现了404错误:找不到视图[名称、类型、前缀]:视图、html、componentView。它对我有效。我创建了一个名为Ola
的测试组件,并添加了一个简单的默认视图、一个页面参数和路径,与我在答案中的内容完全相同。你是否加入了index.php
来测试SEO URL?我将接受你的回答,因为我的下一个问题似乎与路由器无关。谢谢