문제

배경

나는 자체 컨트롤러 (자체 동작)가있는 부분보기로 위젯을 사용하며 거의 모든 페이지에 배치됩니다. 나는 HMVC를 통해 이것의 렌더링을 구현합니다. 그것은 단지 훌륭합니다.

문제

이제 문제는 위젯 자체가 작업을 실행한다는 것입니다. 쇼핑 카트 위젯에 대해 생각해보십시오. 해당 위젯은 모든 페이지에 배치되어 사용자가 자신의 물건을 모두 볼 수 있습니다. 위젯에는 예를 들어 removeitem, refreshcart, appluddiscountcoupon 등과 관련된 조치가 있습니다. 이러한 작업은 버튼이나 링크에 의해 트리거되어야하며 링크는 (hmvc)와 비슷해야합니다.

<a href='<?site_url()?>/cart/cart/removeitem/the_item_id'>Remove this item</a>

확인. 이제 사용자는 해당 링크를 클릭하고 CART 모듈 및 카트 컨트롤러가로드되고 작업이 실행되면 작업이 다음과 같습니다.

function removeitem($itemid)
{
     // remove the item from db
     ...

     // "load the view"  ???
}

보시다시피, 내 질문은 HMVC 모듈에보기를로드하는 방법입니다. 문제는 카트보기 만로드하면 카트 만 표시되며 메인 페이지가 될 수 있기 때문에 메인 페이지를 리디렉션하거나로드 할 수 없다는 것입니다. 카트는 메인 페이지에있을 수 있습니다. (제품을 선택하고, 구매를 유지하고, 제품 세부 정보, 청구 정보, 결제 등을 참조하십시오). :/

또 다른 사항 : 요구 사항은이 프로젝트에서 Ajax를 사용할 수 없다는 것입니다.

HMVC가 이것을 어떻게 처리하는지 알고 있습니까?

미리 감사드립니다.

도움이 되었습니까?

해결책

확인. 커뮤니티와 운이 좋지 않습니다. 그럼에도 불구하고 나는 해결 방법을 찾았습니다. 희망은 누군가에게 도움이 될 것입니다.

HMVC에는 자연스러운 솔루션이 없습니다. 그래서 나는이 해결 방법을 사용하기로 결정했습니다.

  1. 각 메인 컨트롤러 (즉, 위젯, 부분보기 없음)에 나는이 방법으로 세션에서 현재 URL을 잡습니다. (/controllers/keep_buying.php):

    class Keep_buying extends Controller
    {
        function Keep_buying()
        {
            parent::Controller();
            $this->session->set_userdata('main_uri', uri_string()); 
        }
        ...
    }
    
  2. 그런 다음 부분보기 위젯 (HMVC 모듈보기)에서 위젯 컨트롤러에 대한 일반 링크가 있습니다. (/modules/cart/views/cart_show.php):

    <a class="button" href="cart/cart/additem">Add Item</a>  
    
  3. 컨트롤러 조치 (HMVC 모듈 컨트롤러 조치)에서 현재 메인 페이지를 검색하고, 작업을 수행 한 다음 해당 페이지로 리디렉션하여 암시 적으로 위젯 흐름 (HMVC로 인해)으로 이동합니다.

    class Cart extends Controller
    {
        ...
        function additem()
        {
            $to_redirect = $this->session->userdata('main_uri');
            // add-item work stuff...
            redirect($to_redirect);
        }
    }
    

그건. 이상적인 접근법 IMHO는 아니지만 작동합니다.

다른 팁

나는이 주제가 1 년이 넘었다는 것을 알고 있지만, HMVC 프로그램이 취해야 할 구조와 CI에서 구현 될 수있는 방법에 대한 통찰력을 얻기 위해 인터넷 검색을하고 있으며, 많은 답변을 찾지 못했습니다.

HMVC가 사이트의 모든 페이지에 여러 위젯이 통합되어 하나의 기본 컨트롤러에 의해 조정되어야한다고 확신합니다. 이것은 상속장의 최상위 레벨이 될 것입니다. 예를 들어 보겠습니다.

모든 페이지에 쇼핑 카트 위젯이있는 사이트가 있습니다. CART 기능을 사용하려면 CART 모듈의 메소드에 연결해야합니다.

<a href="cart/add/<?=$item?>">add</a>

이 링크를 사용하는 문제는 해당 모듈에서 나머지 사이트를 다시로드하지 않는다는 것입니다. 대신, 주 컨트롤러를 통해 링크를 라우팅하고 원하는 방법을 호출하여 모듈을 다시로드 할 수 있습니다. 예를 들어

<a href="site_controller/cart_add/<?=$item?>">add</a>

그런 다음 사이트 컨트롤러에서 메소드 호출을 기본보기로 전달합니다.

<?php
function cart_add($item){
$data['cart'] = 'cart/add/'.$item;
$this->load->view('main', $data);
}
?>

보기는 다음과 같이 카트 위젯을 호출합니다.

<?php echo modules::run($cart); ?>

분명히 이것은 단순화 된 설명이며, 기본 사이트 컨트롤러는 하나의 기본보기로 여러 위젯을 처리하는 것이므로, 올바른 데이터를 전달하는 것이 메소드 내에서 기본보기를 호출하는 것보다 더 잘 관리해야합니다. 그러나 바라건대 이것은 내가 언급하는 구조에 대한 아이디어를 제공합니다.

누군가가 이것을 읽고 내가 틀렸다고 생각한다면, 사람들 이이 문제에 대해 발견 한 다른 솔루션을 듣고 싶습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top