2014-10-01 15 views
7

Tôi có tiện ích mở rộng có danh sách và hiển thị hành động. Hiện nay phần mở rộng này có thể xuất hiện trên nhiều trang:RealURL: Xóa Bộ điều khiển và Hành động khỏi URL

/page-1/ 
/page-2/subpage/ 

Tôi đã cấu hình realurl như thế:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl']=array (
    'encodeSpURL_postProc' => array('user_encodeSpURL_postProc'), 
    'decodeSpURL_preProc' => array('user_decodeSpURL_preProc'), 
    '_DEFAULT' => array (
     … 
     'postVarSets' => array(
      '_DEFAULT' => array(
       'controller' => array(
        array(
         'GETvar' => 'tx_extension_plugin[controller]', 
         'noMatch' => 'bypass', 
        ), 
       ), 
       'extension' => array(
        array(
         'GETvar' => 'tx_extension_plugin[action]', 
        ), 
        array(
         'GETvar' => 'tx_extension_plugin[controller]', 
        ), 
        array(
         'GETvar' => 'tx_extension_plugin[value]', 
         'lookUpTable' => array(
          'table' => 'table', 
          'id_field' => 'uid', 
          'alias_field' => 'name', 
          'addWhereClause' => ' AND NOT deleted AND NOT hidden', 
          … 
); 

function user_decodeSpURL_preProc(&$params, &$ref) { 
    $params['URL'] = str_replace('page-1/', 'page-1/extension/', $params['URL']); 
} 

function user_encodeSpURL_postProc(&$params, &$ref) { 
    $params['URL'] = str_replace('page-1/extension/', 'page-1/', $params['URL']); 
} 

Bây giờ tôi nhận được URL như:

/page-1/ /* shows list */ 
/page-1/Action/show/name-of-single-element /* single view */ 

Những gì tôi thực sự muốn điều này là:

/page-1/name-of-single-element /* single view */ 

Làm cách nào để loại bỏ hành động và bộ điều khiển?

Nếu tôi loại bỏ:

array('GETvar' => 'tx_extension_plugin[action]'), 
array('GETvar' => 'tx_extension_plugin[controller]'), 

nó gắn thêm các thông số vào URL.

+0

Nó đòi hỏi cách tiếp cận khác, nó là phần mở rộng của bạn? bạn có thể thay đổi mã của nó không? chỉ cho tôi làm thế nào để bạn xây dựng các liên kết/url của bạn – biesior

+0

@biesior Vâng, đó là phần mở rộng của riêng tôi và có, tôi có thể thay đổi mọi thứ. Các liên kết được xây dựng như sau: ' hiển thị bài viết ' – lampshade

Trả lời

5

Bạn không thể tránh thêm tất cả những thứ khi sử dụng f:link.action VH, thay vào đó bạn cần phải sử dụng f:link.page và vượt qua params chỉ được yêu cầu, mẫu:

<f:link.page additionalParams="{article : article.uid}" class="more" title="{article.name}">show article</f:link.page> 

nó sẽ tạo url như

/current/page/?article=123 

hoặc

/current/page/we-added-realurl-support-for-article 

tiếp theo trong hành động đầu tiên của plugin (Có thể là list), bạn chỉ cần để chuyển tiếp yêu cầu đến show hành động nếu param cho tồn tại:

public function listAction() { 
    if (intval(\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('article'))>0) $this->forward('show'); 

    // Rest of code for list action... 
} 

và có lẽ thay đổi chữ ký của show

public function showAction() { 

    $article = $this->articleRepository->findByUid(intval(\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('article'))); 

    if ($article == null) { 
     $this->redirectToUri($this->uriBuilder->reset()->setTargetPageUid($GLOBALS['TSFE']->id)->build()); 
    } 


    // Rest of code for show action... 
} 
+1

+1 - hoạt động như một nét duyên dáng. Cảm ơn rất nhiều. Tôi đã thay đổi mã một chút để làm cho nó linh hoạt hơn. Tôi đã thay đổi chữ ký thành: 'public function showAction (\ namespace $ article = null)' và bọc phần mới được thêm vào đây: 'if (! $ Article) {…}'. – lampshade

+0

Tôi đang sử dụng thuộc tính @transient trong tiện ích mở rộng của mình (xem http://stackoverflow.com/questions/27274477/parse-an-existing-json-string-in-fluid-template) - có thể là nó không thành công với phương pháp trên?Khi tôi nhận được nó, tất cả dữ liệu "thoáng qua" đó không phải là đầu ra nữa – Urs

+0

Dường như extbase ít nghiêm ngặt hơn đối với loại tài sản (mà tôi đã đặt sai) khi sử dụng liên kết "hành động" hơn so với quy trình thay thế. Nó không liên quan gì đến "thoáng qua" – Urs

3

Nếu URIbuilder được sử dụng bạn cũng có thể sử dụng cấu hình:

features.skipDefaultArguments = 1 

ví dụ;

# if enabled, default controller and/or action is skipped when creating URIs through the URI Builder 
plugin.tx_extension.features.skipDefaultArguments = 1 

tôi sử dụng cấu hình này kết hợp với realurl bypass

'postVarSets' => array(
    '_DEFAULT' => array(
    'extbaseParameters' => array(
     array(
     'GETvar' => 'tx_extension_plugin[action]', 
     'noMatch' => 'bypass', 
    ), 
    ), 
), 
), 
Các vấn đề liên quan