1

データベースで定義されたパラメーターを使用して、静的な .phtml サブページを提供するにはどうすればよいですか?

たとえば、データベースに次のエントリがあります。

table 'static_subpages' {  
    id: 1  
    url: /author  
    route: module=about;controller=index;action=subpage  
    params: page=author.phtml  
    layout: true  
}

これは簡単な例です。もちろん、module.config.php で maaaany ルートを作成できますが、(管理パネルで) データベースからページを動的に管理したいと考えています。SEO の URL は非常に重要です。/about/subpage/author のような URL は、/author よりも優れているわけではありません。

どのように私はそれを行うことができますか?

4

3 に答える 3

1

ルーティング構成で URL セグメントを使用して、静的ページを提供できます。

あなたのmodule.config.php

                'static' => array(
                    'type'    => 'Zend\Mvc\Router\Http\Segment',
                    'options' => array(
                        'route'    => 'about/:page_name',
                        'defaults' => array(
                            'controller' => 'About\Controller\Index',
                            'action'     => 'subpage',
                        ),
                    ),

あなたのAbout\Controller\IndexController

/**
 * Render static pages
 *
 * @return \Zend\View\Model\ViewModel
 */
public function staticAction()
{
    $pageName = $this->params('page_name');
    $view = new ViewModel();

    // loads views like view/static/author.phtml
    $view->setTemplate('static/' . $pageName); 

    return $view;
}

ビューでは、次のようなものを使用できます。

<a href="<?php echo $this->url('static', array('page_name' => 'author')); ?>">
    Author
</a>

これにより、次のような URL が生成されます。/about/author/

于 2013-09-13T07:16:56.930 に答える
0

解決策が見つかりました。上記の返信ありがとうございますが、それだけではありません。

indexまず、標準コントローラーとアクションを備えた新しいモジュール「サブページ」を作成しました。
次に、このためにルーターをセットアップします。

'router' => array(
    'routes' => array(
        'subpage' => array(
            'type' => 'segment',
            'options'   => array(
                'route'     => '/[:page[.html]]',
                'constraints' => array(
                    'page'  => '[a-zA-Z0-9]*',
                ),
                'defaults'  => array(
                    'controller'    => 'Subpage\Controller\Subpage',
                    'action'        => 'index',
                ),
            ),
        ),
    ),
),

しかし、application.config.phpにモジュールを追加すると、ルートを持つ実際のモジュールは利用できません。解決策は非常に簡単ですが、何時間もの実験が必要でした - サブページモジュールを最初に移動してください:)

application.config.php

'modules' => array(
    'Subpage',
    'Application',
    'Gallery',
),

現在、ルーター トレースは次のとおりです。

  1. アレイの最後から順に、既存のコントローラーとルーターの URL を照合します
  2. 見つからない場合は、Subpageコントローラーでルートを試してください。IndexActionこのモジュールではデータベースをチェックし、見つかった場合は静的ページを提供します
  3. URLが一致しない場合:
    • にいるときSubpage -> IndexController -> IndexAction(): にリダイレクトErrorController
    • または、URL がどのモジュールにも一致せず、サブページ モジュールのルーターにも一致しない場合は、次を実行します。ErrorController

これは、ZF2 の経験がある人にとっては簡単ですが、私にとってはそうではありません。私はそのようなものを見つけていません。

于 2013-09-27T14:30:16.023 に答える
0

さらに、ミハイドルの回答に加えて、必ずしも「/」を使用する必要はありません。パラメーターを任意の区切り文字にマップできます。ここに、「/」なしでわかりやすい URL を作成した小さな例があります。

'randomroute' => array(
            'type' => 'segment',
            'options' => array(
                'route'    => '/[:param].:id:.html',
                'constraints' => array(
                    'id'     => '[0-9]+',
                    'param' => '[a-zA-Z-0-9-_\/%]+',
                    ),
                'defaults' => array(
                    'controller' => 'Your\Name\Space',
                    'action'     => 'index',
                    ),   
                ),
            ),

私の例では、.html で終わる URL と Id 制約がここにマップされます。

your.url.application/test123.01.html or your.url.application/foobar.02.html etc.

この[:param]場合、「[:]」で示されるオプションです。

この URL にアクション パラメータを指定しない限り、すべてのルートに対してこれを行う必要があるため、探しているものとは正確には一致しない可能性があります。ルーティング構成は非常にうまく機能し、最初からそれほど面倒ではないと思うので、すべてのルートに対して作成します。

于 2013-09-13T07:44:14.880 に答える