2013-05-07 1 views
0

연습 및 사용자 결과를 관리하는 CakePHP에서 응용 프로그램을 만들고 싶습니다. 사용자와 결과는이 질문에서 중요하지 않습니다.CakePHP, 일반 컨트롤러를 사용하는 옵션 컨트롤러 용 라우팅

.ini 구성 파일에 특정 테이블과 행만 추가하는 연습을 추가하고 싶습니다. 특정 응용 프로그램이 없으면 응용 프로그램은 GenericExercisesController로 라우트해야합니다. 컨트롤러는 특정이 없으면 GenericExerciseModel을로드해야합니다. 나는 모델 로딩 부분적으로이 같은 컨트롤러와 라우팅과 관리했던 :

그래서

foreach(Configure::read('exercisesTables') as $exerciseName){ 
    if(App::import('Controller', Inflector::pluralize($exerciseName))){ 
     Router::connect('/exercises/'.Inflector::pluralize($exerciseName).'/:action', array('controller' => Inflector::pluralize($exerciseName))); 
    }else{ 
     Router::connect('/exercises/'.Inflector::pluralize($exerciseName).'/:action', array('controller' => 'GenericExercises', 'fakeModel' => $exerciseName)); 
    } 
} 

route.php에서 내가 주소를 사용해야 푸 운동 를로드하려면 :

http://example.com/exercises/Foos/view

특정 컨트롤러가 존재하면 문제가되지 않습니다.

역방향 라우팅을 사용하여보기에서 링크를 생성 할 때 문제가 시작됩니다. 운동 특정 컨트롤러가있는 경우이 제대로 작동 :

print $this->Html->url(array('controller' => Inflector::pluralize($exerciseName), 'action' => 'view')); 는 생산 : /exercises/Foos/view

그러나 운동 가 특정 컨트롤러가없는 경우 다음 같은 코드를 생성합니다 /Bars

이로 인해 문제가 발생하면 Bars 컨트롤러가 없습니다.

일시적 나는 수동으로 해당 링크를 생성하고있어,하지만 난이 최선의 해결책이라고 생각하지 않습니다

print $this->Html->url("/".Configure::read('exerciseRoutingPrefix')."/".Inflector::pluralize($exerciseName)."/view");

은 아마 당신의 사람이 더 나은 솔루션을 알고있다. 제 질문을 읽어 주셔서 감사합니다.

UPDATE 1 :

Router::connect('/', array('controller' => 'questions', 'action' => 'regulations')); 
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); 
Router::connect('/help', array('controller' => 'pages', 'action' => 'faq')); 
+0

왜 stackoverflow가 내 질문의 시작 부분에서 "안녕하세요"라는 문구를 삭제합니까? –

+0

일부 편집자는 불필요한 문구를 삭제합니다. "감사합니다"와 "안녕하세요"가 공손하고 훌륭하게 질문 할 수도 있지만 문제 자체에 도움이되지 않으므로 일부는이를 제거하는 것을 선호합니다. – Nunser

+0

여기서 foreach를 게시하기 전에'routes.php'에 다른 경로가 정의되어 있습니까? – Nunser

답변

1

내가 제대로 질문을 이해하면 당신은 "MyHtmlHelper"를 만드는 시도 할 수 있습니다 : 그들은 파일에있는 한

그 순서대로 foreach 전에 정의 route.php의 노선입니다 HtmlHelper::link();

에 옵션을 구문 분석하기 전에 몇 가지 마법을 수행하는 당신은 너무처럼 작업을 수행 할 수 있습니다

을 0

/app/View/Helpes/MyHtmlHelper.php

그래서 같은 "Html 헬퍼"확장하는 도우미 만들기 : 컨트롤러에서 이제

<?php 
App::uses('HtmlHelper', 'View/Helper'); 
class MyHtmlHelper extends HtmlHelper { 
    public function link($title, $url = null, $options = array(), $confirmMessage = false) { 
     //do your magic here and change the $title, $url or $options accordingly. 
     return parent::link($title, $url, $options, $confirmMessage); 
    } 
} 

, 당신은 그래서 같은 도우미를 포함해야한다을 ( aliasing) $helpers = array('Html'); 대신 $helpers = array('Html' => array('className' => 'MyHtml'));입니다.

공용 기능 링크에서 공란을 직접 채울 수 있습니다. 그렇지 않은 경우, 오프 물론 다른 모든 도우미 또는 당신이 떨어져 생각할 수있는 방법이 작업을 수행 할 수 있습니다 :

더 많은 도움을 물어 주시기 바랍니다. HtmlHelper :: link()는 예제로 사용됩니다.

+0

답변 해 주셔서 감사합니다. 그 트릭을 할 수도 있지만 이것이 최선의 방법인지 잘 모르겠습니다. 가능한 경우 cakePHP 기본 함수를 사용하고 싶습니다. 어쨌든 그것을 점검하고 결국 정답으로 표시 할 것입니다. –

+1

도우미를 확장하면 Cakephp 네이티브입니다. 나는 항상 그렇게합니다. 앨리어싱을 사용하면 핵심이 실패하지 않도록 동일한 이름을 사용할 수 있습니다. – Jelmer

+0

AppController에 MyHtml을 배치하면 모든 클래스가 기본적으로 MyHtml을 사용해야합니까? 권리? –