1

JomSocial でルーティングが正確にどのように機能するかを理解するのに苦労しています。新しいビューを作成する方法を知っている人はいますか?

4

2 に答える 2

4

まず、ビューのリクエストを行うコントローラーを作成します。

ファイル: 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

    }
}

ファイル templates/default/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

これは、2013 年に @Thavia-Farias によって与えられた回答に対するコメントとして作成した可能性がありますが、私の評判はコメントできるほど高くありません。私の回答の内容は、Jomsocial 4.2.1 を使用した私の経験に基づいて、重要な新しい情報、修正、および機能強化とともに彼女の情報を再表示します。

まず、 @ Thavia-Farias が提供するcontrollers/hello.phpにエラーがあります。関数 hello()function helloWorld()と関数の両方で、最終行はですが、関数は である必要があります。現状では、*index.php?option=com_community&view=hello&task= helloworldindex.php?option=com_community&view=hello&task=helloの両方が、本来の hello ビューを呼び出す 2 番目のビューではなく、helloworld ビューを呼び出します。function helloWorld()echo $view->get('helloWorld');function hello()echo $view->get('hello');

また、私の経験では、テンプレートをパス/templates/default/hello.phpに配置するのではなく、/templates/customtemplatename/html/com_community/layouts (カスタム テンプレートまたは/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 のフェッチ関数に含まれています。

$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 ファイルを呼び出します。

/components/com_community/templates/jomsocial/layouts/hello.greeting.php->fetch ( 'hello.greeting' );呼び出しを使用します。

これらの新しいディレクトリを作成する場合は、/components/com_community/templates/jomsocial/layouts/hello/create.php->fetch ( 'hello/create' );を呼び出します 。

新しいコンポーネントのメニュー項目とエイリアスを作成する場合は、新しいファイルを作成する必要があります (メニュー項目で定義されたパラメーターをタスクに渡したい場合は、2 つ目のファイルと 3 つ目のファイルを変更します)。

ファイルを作成: /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タグを使用するa のないオプションは、前述の関数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>

これにより、ユーザーがデータベース内の使用可能なグループから 1 つのグループを指定できるタブが作成されます。グループの 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'];
                }

このようにして、タスクは、コンポーネント内から指定された場合は URL ( option=com_community&view=hello&task=hello&groupid=5 ) から必要な詳細を受け取るか、メイン メニューまたは jomsocial ツールバー アイテムの描画によって呼び出されて、保存されたパラメーターから受け取ることができます。そのメニュー項目のメニュー データベース テーブルで。

ここで作成したオプションとタブは、このタスクのすべてのメニュー項目で表示されます。メニュー オプションごとに異なるタブが必要な場合は、まったく異なるビューを作成する必要があります。すべてを 1 つのビューに表示すると、ユーザーが値を設定できるが、ユーザーが指定した実際のタスクでは使用されない、または使用されるべきではない、未使用の誤解を招く可能性のあるタブが表示される可能性があります。

統合されたコンポーネントでこのコードのすべての行をテストしていないことを許してください。私は自分の見解でこれらの機能をすべて実行しましたが、@ Thavia-Farias の回答からの最初のガイダンスで構築されたコードを要約しました。私の広範なコードを投稿するよりも明確ですが、機能については現在の形式でテストされていません。プロジェクトをデバッグするには、必ず php エラー ログを確認してください。root ( sudo su)としてログインし、システムのnano /var/log/mysqld/error_logを確認する必要があります。幸運を!

于 2016-06-08T14:15:40.533 に答える