如何在Jomsocial中创建新视图?



我很难弄清楚在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=helloworldindex.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。好运!

相关内容

  • 没有找到相关文章

最新更新