Joomla 1.5には、CNCを作成するための多くのコンポーネントがあります。 これらのコンポーネントは、データベースへのすべてのリンクを記述することにより機能します。 多くのデータがデータベースに保存されるため、これは多数のページを持つサイトではまったく論理的ではありません。 また、これらのコンポーネントについては、コンポーネントのリンクを正しく綴るように、独自のプラグインを作成する必要があります。
一般的に、私はこれらのコンポーネントの支持者ではありません。 一度使用しただけで、これが私が使用したいことだとは言いません。 CNCのこのような構造を、私は「シャーマニズム」と呼びます。 そして、そのような「シャーマニズム」を書かないために、Joomla 1.5にはコンポーネントのCNCを作成する標準的な方法があります。
最初に、管理部分の構成で、CNCを有効にする必要があります。 JRoute :: _( 'link')を使用してすべてのリンクを表示します。 私のコンポーネントなど、CNCの作成を検討します。
コンポーネントについての小さな話。 このコンポーネントを作成して、検証システムでオリンピアードの問題のデータベースを作成しました。 コース用に書きました。 ご理解のとおり、これは有名なacm.timus.ruのようなものでなければなりません。 一般に、コンピュータサイエンスのオリンピックアルゴリズムの問題のデータベースがあります。 人はタスクを選択し、ソリューションを送信し、結果を見て、各タスクの統計を表示することができます。 しかし、CNCの例では、タスクを表示するためだけにビルドします。 質問がありましたら、もっとする方法を書いてください。 しかし、原則として、これは類推によって行われます。
したがって、コンポーネントはcom_tasksと呼ばれます 。 次に、コンポーネントのフォルダーにrouter.phpファイルを作成します。 このファイルは2つの関数で構成されています。関数(コンポーネント名)BuildRouteはリンクを構築するための関数であり、 (コンポーネント名)ParseRouteはリンクを認識するための関数です。 これらの機能を順番に検討します。
(コンポーネント名)BuildRoute-リンクを構築するための関数
機能の説明:
function TasksBuildRoute(&$query)
{}
次の形式のリンクがあります: /index.php?option=com_tasks&view=task&id= / {task_id►&Itemid=2 、タスクは/tasks/{task_idasket_{task_nameasure.htmlを作成することです
id = 1のタスクのリンク、 $クエリ配列を構築するために渡されるものを見てみましょう。
配列( [オプション] => com_tasks [表示] =>タスク [id] => 1 [Itemid] => 2 )
この関数は、必要なリンクの部分の配列を返し、Joomlaの部分の間に「/」を入れます。
function TasksBuildRoute(&$query)
{
$segments = array();
if ($query[ 'view' ] == 'task' ) {
$segments[] = $query[ 'id' ]. '_' .$name;
unset($query[ 'view' ]); //
unset($query[ 'id' ]);
}
return $segments;
}
この関数の助けを借りて、リンクは/component/tasks/1_.htmlという形式になりました 。
ご覧のとおり、私たちは望んでいたものを手に入れませんでした。 なぜなら、私たちにとってはあまり明確ではない何かを得たからです/コンポーネント/ 。 この単語は、アクセスするコンポーネントを知るためにJoomlaによって書かれました。 リンク内のタスクはコンポーネントの名前であることに注意してください。 コンポーネントを示すメニュー項目を作成し、この項目にエイリアスを設定し、出力時にリンクにItemid = {コンポーネントのID}を書き込むと、必要なものが得られます。
コンポーネントへの参照を持つTasksおよびalias tasksという名前のメニュー項目を作成し、次のリンクを得ました: tasks / 1_.html 。 ここでのタスクはメニュー項目のエイリアスです。
ビルド関数で書いたものに戻りましょう。 ご覧のとおり、配列の一部の要素を削除します。削除しない要素はJoomlaがパラメーターとして置換するためです。 たとえば、 unset($ query ['view'])と書かないと、 、次に/tasks/1_.html?view=taskという形式のリンクを取得します。
また、タスクの名前をまだ拡張していないという事実にも注目してください。 名前を取得するために、データベースに対して特定の$ query ['id']要求を行うことができます 。 しかし同時に、1ページにタスクへのリンクが100個ある場合、データベースへのクエリは100個になります。 そして、これは非常に論理的なステップではありません。 この場合、すべてのタスクの名前を収集するために別の関数を作成する必要があります。 コンポーネントのヘルパールートを作成します。 これを行うには、コンポーネントのフォルダーにhelpersフォルダーとroute.phpファイルを作成します。
jimport( 'joomla.application.component.helper' );
class TasksHelperRoute
{
public static $tasks = null ;
function getTasks()
{
if (self::$tasks) return self::$tasks;
$db = &JFactory::getDBO();
$query = "SELECT `id`, `name` FROM `#__tasks`" ;
$db->setQuery($query);
$res = $db->loadObjectList();
foreach ($res as $r) {
self::$tasks[$r->id] = $r->name;
}
return self::$tasks;
}
}
次に、このファイルを接続し、関数を呼び出して、タスクの名前を置き換えます。
include_once(JPATH_ROOT.DS. 'components' .DS. 'com_tasks' .DS. 'helpers' .DS. 'route.php' );
function TasksBuildRoute(&$query){
$segments = array();
$tasks = TasksHelperRoute::getTasks();
if ($query[ 'view' ] == 'task' ) {
$segments[] = $query[ 'id' ]. '_' .$tasks[$query[ 'id' ]];
unset($query[ 'view' ]);
unset($query[ 'id' ]);
}
return $segments;
}
これで/tasks/1_a_plus_b.htmlという形式のリンクができました 。 このタスクに対処しました。
helpereクラスに静的変数があるため、データベースへのリクエストは1回だけです。 同じヘルプで 、名前を処理できます。スペースを取り、すべての文字を小文字にするなど。
CNCが機能するためには、ビルドするだけでなく、リンクを解析する必要もあります。 これを行うには、このリンクをシステムに「紹介」します。
(コンポーネント名)ParseRoute-リンク認識の機能
この関数の説明は次のとおりです。
function TasksParseRoute($segments)
{}
$セグメント配列は、ビルド関数で返されたものとまったく同じです。 build関数で取得したのと同じように、 $ vars配列を返す必要があります。
この場合、次の$セグメントが与えられます。
配列( [0] => 1_a_plus_b )
このサンプルビューでは、常にtaskが必要であり、他の種類のリンクはありません。 そして、行{id} _ {name }から{id}を取得する必要があります。 これは、単に文字列関数を使用して行われます。
function TasksParseRoute($segments)
{
$vars[ 'view' ] = 'task' ;
$vars[ 'id' ] = substr($segments[0], 0, strpos( '_' , $segments[0])+1);
return $vars;
}
まあ、一般的には、リンクにシステムを導入しました。
最も簡単な例の1つを検討しました。 この例に基づいて、より複雑に自分で行うことができます。 質問、改善提案、批判を待っています。