1

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

4

2 回答 2

4

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

文件:控制器/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>

就这样!

于 2013-09-11T01:42:18.897 回答
0

我可能将此作为对@Thavia-Farias 在 2013 年给出的答案的评论,但我的声誉还不够高,无法发表评论。根据我使用 Jomsocial 4.2.1 的经验,我的回答内容将重申她的信息以及重要的新信息、更正和增强功能:

首先,@Thavia-Farias 提供的 controllers/hello.php有一个错误:在hello()function helloWorld()function helloWorld()函数中,最后一行是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 视图。

此外,根据我的经验,如果您使用的是 cusomt 模板或/components/com_community/ ,我不会将模板放在路径/templates/default/hello.php中,而是将其放在/templates/customtemplatename/html/com_community/layouts 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>

此文件会将项目添加到管理员菜单面板中菜单的“社区”部分。选项values 是任务的名称。没有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 分配给列JSON 对象中#__menu数据库表中的参数字段作为键的值。为了让您的视图在呈现页面时使用该值,请在views/hello/view.html.php中包含以下代码:paramsitem_id

        $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检查。祝你好运!

于 2016-06-08T14:15:40.533 回答