我很难弄清楚在JomSocial中路由是如何工作的。有人知道如何创建新视图吗?
首先,创建一个控制器来向视图发出请求:
文件:控制器/hello.php
<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
class CommunityHelloController extends CommunityBaseController
{
function helloWorld() //index.php?option=com_community&view=hello&task=helloWorld
{
$document = JFactory::getDocument();
$viewType = $document->getType();
$view = $this->getView('hello', '' , $viewType);
echo $view->get('helloWorld');
}
function hello() //index.php?option=com_community&view=hello&task=hello
{
$document = JFactory::getDocument();
$viewType = $document->getType();
$view = $this->getView('hello', '' , $viewType);
echo $view->get('helloWorld');
}
}
?>
视图:视图/hello/view.html.php在这里放置将传递给模板文件的变量例如:
<?php
defined('_JEXEC') or die('Restricted access');
jimport ( 'joomla.application.component.view' );
class CommunityViewHello extends CommunityView {
function helloWorld() //This function shows a "Hello World" without an template view
{
echo 'Hello World';
}
function hello()
{
$user = CFactory::getUser($userid);
$tmpl = new CTemplate( ); //Call a template file
echo $tmpl->set ( 'user', $user )
->fetch ( 'hello' ); // Returns the templates/default/hello.php file
}
}
文件模板/违约/hello.php:
<?php defined('_JEXEC') or die();?>
<h2> This is an example </h2>
<div class="container">
<p> Hello, <?php echo $user->name; ?></p>
</div>
就是这样!
我可能是在评论@Thavia-Farias在2013年给出的答案,但我的声誉不够高,无法评论。根据我使用Jomsocial 4.2.1的经验,我的回答内容将重述她的信息以及重要的新信息、更正和增强:
首先,@Thavia-Farias提供的controllers/hello.php有一个错误:在function helloWorld()
和function helloWorld()
函数hello()中,最后一行是echo $view->get('helloWorld');
,但function hello()
中的函数应该是echo $view->get('hello');
。目前,*index.php?option=com_community&view=hello&task=helloworld和index.php?option=com_community&view=hello&task=hello都将调用helloworld视图,而不是第二个调用hello视图。
此外,根据我的经验,而不是把模板放在路径/templates/default/hello.php,我把它放在/templates/customtemplatename/html/com_community/layouts如果你使用的是默认的jomsocial模板,或者/components/com_community/templates/jomsocial/layouts/。
创建/组件/com_community/控制器/hello.php :
<?php
defined('_JEXEC') or die();
class CommunityHelloController extends CommunityBaseController
{
public function renderView($viewfunc, $var = NULL) {
$my = CFactory::getUser();
$jinput = JFactory::getApplication()->input;
$document = JFactory::getDocument();
$viewType = $document->getType();
$viewName = $jinput->get('view', $this->getName());
$view = $this->getView($viewName, '', $viewType);
echo $view->get($viewfunc, $var);
}
function helloWorld()
{
$this->renderView(__FUNCTION__);
}
function hello()
{
$this->renderView(__FUNCTION__);
}
function display($cacheable = false, $urlparams = false) {
$this->renderView(__FUNCTION__);
}
}
?>
创建/var/www/html/组件/com_community/视图/hello/view.html.php :
<?php
defined('_JEXEC') or die('Restricted access');
jimport ( 'joomla.application.component.view' );
class CommunityViewHello extends CommunityView {
function helloWorld() //This function shows a "Hello World" without an template view
{
echo 'Hello World';
}
function display() //This function what happens when the hello view is called without a task
{
echo 'welcome to the main landing page for the hello view! There is nothing else shown here besides this message.';
}
function hello()
{
echo $tmpl->fetch('hello');
}
}
正如你所看到的,如果你想让你的视图有一个默认视图,即使没有任务被调用,类似于/index.php?option=com_community&view=groups,那么你将需要在控制器和视图中命名一个任务作为函数显示。
最后,创建/components/com_community/templates/jomsocial/layouts/hello.php:<?php defined('_JEXEC') or die();?>
<h2> This is an example </h2>
<div class="container">
<p> Hello, <?php echo $my->name; ?></p>
</div>
$my是在控制器中定义的!当您的视图和任务组足够大时,每个任务将有不同的文件。任务文件与view.html.php中的fetch函数一起。
$tmpl = new CTemplate( ); //Call a template file
echo $tmpl->set ( 'vars1', $vars1)
echo $tmpl->set ( 'vars2', $vars2)
echo $tmpl->set ( 'vars3', $vars3)
->fetch ( 'hello' );
调用/components/com_community/templates/jomsocial/layouts/hello.php文件。
使用->fetch ( 'hello.greeting' );
调用/components/com_community/templates/jomsocial/layouts/hello.greeting.php.
如果你想为这些创建一个新的目录,那么->fetch ( 'hello/create' );
调用/组件/com_community/模板/jomsocial/布局/hello/create.php
如果你想为你的新组件创建菜单项和别名,那么你需要创建一个新文件(如果你想把菜单项定义的参数传递给你的任务,你还需要创建第二个和修改第三个文件):
创建文件:/components/com_community/views/hello/metadata.xml:
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<view title="Groups">
<message>
<![CDATA[
Hello view
]]>
</message>
<options var="task">
<default name="Hello" msg="displays landing page" />
<option value="hello" name="- one greeting" msg="Display detail page of one greeting" />
<option value="helloWorld" name="- helloworldview" msg="Display whatever you have in the hello world task" />
</options>
</view>
<state>
<name>Hello Groups Layout</name>
<description>Hello Groups listings</description>
</state>
</metadata>
该文件将向管理员菜单面板中菜单的"community"部分添加项目。选项value
是任务的名称。没有value
的选项使用default
标记,将拉起前面描述的display
函数。
如果您需要向文件中添加参数,那么您需要做一些复杂的事情:
创建/组件/com_community/视图/hello/tmpl default.xml :
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="Name" option="View">
<message>
</message>
</layout>
<fields name="params">
<fieldset
name="basic"
label="Selected Group">
<field
name="item_id"
query="SELECT `id`, `name` FROM #__community_groups_category WHERE ORDER BY `id`"
type="sql"
key_field="id"
value_field="name"
label="Associated Group"
require="true"
description="Select the jomsocial group whose hello task this will be associated with">
</field>
</fieldset>
</fields>
</metadata>
这将创建一个选项卡,用户可以在其中指定数据库中可用组中的一个组。它将把组的id分配给params
列JSON对象中#__menu
数据库表中的parameters字段,作为item_id
键的值。为了让视图在呈现页面时使用该值,请在views/hello/view.html.php中包含以下代码:
$mainframe = JFactory::getApplication();
$jinput = $mainframe->input;
$document = JFactory::getDocument();
// Get category id from the query string if there are any.
$groupId = $jinput->getInt('group', 0);
// Load the parameters.
$params = $mainframe->getParams();
$params_array = $params->toArray();
if (isset($params_array['item_id']))
{
$groupId = $params_array['item_id'];
}
通过这种方式,您的任务可以从组件(option=com_community&view=hello&task=hello&groupid=5)中给定的URL接收必要的细节,也可以从主菜单或jomsocial工具栏项调用(绘制该菜单项的菜单数据库表中存储的参数)接收必要的细节。
您在这里创建的选项和选项卡将对此任务的所有菜单项可见。如果您希望不同的选项卡对应不同的菜单选项,则必须创建完全不同的视图。将所有内容放在一个视图中可能会导致未使用和潜在误导的选项卡,其中的值可以由用户设置,但不会或不应该由用户指定的实际任务使用。
请原谅我没有在集成组件中测试这段代码的每一行。在我看来,我已经完成了所有这些功能,但已经缩短了我的代码,这些代码是根据@Thavia-Farias的回答的初步指导构建的。虽然它比张贴我的大量代码更清楚,但它还没有以它的当前形式进行功能测试。一定要检查php错误日志以调试项目。我必须以root (sudo su
)身份登录,并在我的系统上检查nano/var/log/mysqld/error_log。好运!