如何在Jomsocial中创建新视图

时间:2013-06-03 13:45:10

标签: jomsocial

我很难弄清楚路由在JomSocial中是如何工作的。有谁知道如何创建新视图?

2 个答案:

答案 0 :(得分:4)

首先,您创建一个控制器来发出视图请求:

file:controllers / 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');  
         }
       }
?>

查看:views / 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>

这就是全部!

答案 1 :(得分:0)

我可能已经将此作为对@ 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&amp; view = hello&amp; task = helloworld index.php?option = com_community&amp; view = hello&amp; task = hello 将调用helloworld视图,而不是调用hello视图的第二个视图。

另外,根据我的经验,我不是将模板放在路径 /templates/default/hello.php ,而是将其放在 / templates / customtemplatename / html / com_community / layouts 如果您使用的是cusomt模板,或者 / components / com_community / templates / jomsocial / layouts / ,如果您使用的是默认的jomsocial模板。

创建 /components/com_community/controllers/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/components/com_community/views/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' );调用创建新目录 /components/com_community/templates/jomsocial/layouts/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>

此文件会将项目添加到管理员菜单面板中菜单的“社区”部分。选项value是任务的名称。没有使用value标记的default的选项会提取前面描述的display函数。

如果你需要在文件中添加参数,那么你需要做一些有点复杂的事情:

创建 /components/com_community/views/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分配给#__menu colums JSON对象中params数据库表中的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'];
                }

通过这种方式,您的任务可以从您的组件中提供URL中的必要细节( option = com_community&amp; view = hello&amp; task = hello&amp; groupid = 5 ),或者从主菜单或jomsocial工具栏项目中调用该菜单项的菜单数据库表中存储的参数。

此处创建的选项和选项卡对于此任务的所有菜单项都是可见的。如果您想为不同的菜单选项使用不同的选项卡,则必须创建完全不同的视图。在一个视图中包含所有内容可能会导致未使用且可能具有误导性的选项卡,其中值可由用户设置,但不会或不应由用户指定的实际任务使用。

请原谅我没有在集成组件中测试此代码的每一行。我已经在我的视图中完成了所有这些功能,但是删除了我的代码,该代码是在@ Thavia-Farias的答案的初始指导下构建的。虽然它比发布我的广泛代码更清楚,但它尚未在其当前的功能形式中进行测试。请务必检查您的php错误日志以调试您的项目。我必须以root身份登录(sudo su)并在我的系统上使用 nano / var / log / mysqld / error_log 进行检查。祝你好运!