2

カテゴリと製品を含む Web サイトを作成しています。カテゴリと製品はどちらもコンテンツ タイプです。Web サイトの編集者がカテゴリのデータを変更する必要があるため、カテゴリを分類タイプにすることはできません。この問題を解決するために、カスタム ルーティングを作成しました。

products:
    path: /{catslug}/{slug}
    defaults: { _controller: 'Bolt\Controllers\Frontend::record', contenttypeslug: 'products' }
    requirements:
         catslug: 'Bolt\Controllers\Routing::getAnyCategorieRequirement'

Routing.php に関数を追加しました (後で拡張機能に移動します)。

public function getAnyCategorieRequirement()
{        
    $slugs = array();
    foreach($this->app['storage']->getContent("categories") as $cat){
        $slugs[] = $cat['slug'];
    }
    return implode("|", $slugs);
}

しかし、私は問題にぶつかりました:

リクエスト スコープ外のリクエスト サービスにアクセスしました。その呼び出しを before ハンドラーまたはコントローラーに移動してみてください。

そこで、一時的にデータベース リクエストをコメント アウトし、デフォルトのスラッグを $slugs に追加しました。

public function getAnyCategorieRequirement()
{        
    $slugs = array();
    $slugs[] = "hollandse-kazen";
    return implode("|", $slugs);
}

このようにして、すべてが期待どおりに機能しました。ここで私の質問: ルーティング コントローラーでこのデータベース リクエストを行うにはどうすればよいですか、またはこの問題の回避策はありますか?


ロス・ライリーの最初の解決策は私のために働いた:

    $slugs = array();
    //Do complicated request because of [url to stackoverflow]
    $stmt = $this->app['db']->query('SELECT slug FROM bolt_categories');
    while($cat = $stmt->fetch()){
        $slugs[] = $cat['slug'];
    }
    return implode("|", $slugs);

このようにして、期待どおりに動作します:)

4

1 に答える 1