2012-03-01 2 views
2

내 웹 응용 프로그램의 테마 레이아웃을 디자인하고 있습니다.Codeigniter - 다른보기가있는 경우

내가 if($this->router->fetch_class() == 'A') { //display div A }

을 이용하여 DIV의 나에게 내가 컨트롤러 내부에서이를 설정하는 방법을 알고

표시됩니다 DIV A와 B보기를 표시하려면보기를 원하는 A와 B 두 개의 컨트롤러가있는 경우의가 있다고 가정 해 봅시다

그러나보기에서 이것을 달성하는 방법?

답변

3

안돼합니다. 그런 식으로하지 마십시오. ;) 이런 종류의 문자열을 하드 코딩하는 것은 거의 항상 나쁜 접근 방식입니다. 당신의 견해는 엉망이되어 행운을 빌어 컨트롤러 클래스의 이름을 바꿉니다.

먼저이 코드가 컨트롤러에 있으면 컨트롤러가 무엇인지 모르시겠습니까?

이렇게하면 여러 컨트롤러에서 사용하는 상속 된 메서드라고 가정합니다. 맞습니까? 이 경우에, 거기에 몇 가지 옵션 : 표시 할 div에 parent::some_action() 방법을 알려주는 당 - 자식으로에

  1. 재정을. 당신의 IDE가 당신을 위해 무거운를 할 수 있도록 instanceof (당신이 이제까지의 이름을 변경하는 경우 사용, 오히려 fetch_class()을 사용하는 것보다

  2. 를 ("권한"의 적절한 대표는 여기에 ... 나중에 당신에게 디커플링 두통을 저장합니다) 클래스).

  3. 이 항목을 하위보기 (즉, 부분)으로 분할합니다. 그것은 이 실제로보기에서 문자열 비교를 수행하게됩니다. 믿음. 나를. 여기

내가 추천 내용은 다음과 같습니다

<?php 
// Overridden core class 
class MY_Controller extends CI_Controller { 

    public function some_action() 
    { 
     //... 
     if ($this instanceof Controller_class_that_uses_div_a) 
     { 
      $this->load->view('view_for_div_A'); 
     } 
     else 
     { 
      $this->load->view('view_for_div_B'); 
     } 
     //... 
    } 
} 
+1

나는 스스로에게 당황 스러웠다. 나는 여기에 동의한다. 당신은보기에 컨트롤러 일을하는 습관에 들기를 원하지 않습니다. 이 코드를 엉망으로 만들어야하는 다른 모든 사람을 위해 간단하게 보관하십시오. –

3

당신은 컨트롤러에서 동일한 논리가 그냥보기에 아래로 값을 전달할 수 있습니다

$class = $this->router->fetch_class(); 

$this->load->view('myView', 
        array('class' => $class)); 

은 그럼 그냥보기에 그 변수를 사용

if ($class == 'A') ... 
+1

아야를, 그것은 정기적 인 문자열이 아닌해서, 나는 그것이 that..Thanks.will 같은 뷰에 전달 될 수 없습니다 생각을주고 시도하십시오 – foxns7

+0

예, 제한 사항이 없습니다. 다른 유형의 객체는 문자열 외의보기로 전달 될 수 있습니다. –

관련 문제