Hỏi cách sử dụng canonicalizeRequestUrl

Thảo luận trong 'XenForo Development' bắt đầu bởi Kid, 27/5/13.

1votes
5/5, 1 vote

  1. Kid

    Kid VIP Member

    Bài viết:
    863
    Likes :
    947
    Em đang làm cái mod và dựa trên bài hướng dẫn của Jaxel
    http://xenforo.com/community/threads/creating-advanced-sub-route-controllers.13605/
    Đã tạo được Route hoàn chỉnh cho mình. Tuy nhiên e đang gặp khó khăn:

    Cụ thể là link hiện tại của em là jobs/detail/$id/ thì chạy rất ổn, mọi thứ đều bình thường
    Nhưng em muốn tạo link dạng jobs/detail/$title.$id/

    Và em tìm được đoạn này mà Jaxel sử dụng ở trong các addon như Xenportal hoặc Media của ông ấy.
    $this->canonicalizeRequestUrl(XenForo_Link::buildPublicLink
    Em thử đưa đoạn này vào function Index của Class XFStoreNet_Jobs_ControllerPublic_Home_Detail
    Khi chạy gặp lỗi


    Bên dưới là toàn bộ code của em

    File XFStoreNet_Jobs_Route_Prefix_Home
    PHP:
    <?php
     
    class XFStoreNet_Jobs_Route_Prefix_Home implements XenForo_Route_Interface
    {
    public function 
    match($routePathZend_Controller_Request_Http $requestXenForo_Router $router)
        {
            
    $components explode('/'$routePath);
            
    $subPrefix strtolower(array_shift($components));
            
    $subSplits explode('.'$subPrefix);
     
            
    $controllerName '';
            
    $action '';
            
    $intParams '';
            
    $strParams '';
            
    $slice false;
     
            switch (
    $subPrefix)
            {
    case 
    'create':      $controllerName '_Create';  $intParams 'id';            $slice true;    break;
    case 
    'detail':      $controllerName '_Detail';  $intParams 'id';            $slice true;    break;
    case 
    'categories':    $controllerName '_Categories';          $slice true;    break;
                case 
    'category':    $controllerName '_Category';  $intParams 'cat_id';        $slice true;    break;
                case 
    'user':        $controllerName '_User';      $intParams 'user_id';          $slice true;    break;
                case 
    'find':        $controllerName '_Find';$strParams 'keyword_text';    $slice true;    break;
                default :
                    if (
    is_numeric(end($subSplits))) { $controllerName ''$intParams 'id'; }
            }
     
            
    $routePathAction = ($slice implode('/'array_slice($components02)) : $routePath).'/';
            
    $routePathAction str_replace('//''/'$routePathAction);
     
            if (
    $strParams)
            {
                
    $action $router->resolveActionWithStringParam($routePathAction$request$strParams);
            }
            else
            {
                
    $action $router->resolveActionWithIntegerParam($routePathAction$request$intParams);
            }
     
            
    $action $router->resolveActionAsPageNumber($action$request);
            return 
    $router->getRouteMatch('XFStoreNet_Jobs_ControllerPublic_Home'.$controllerName$action'jobs'$routePath);
        }
     
        public function 
    buildLink($originalPrefix$outputPrefix$action$extension$data, array &$extraParams)
        {
            
    $components explode('/'$action);
            
    $subPrefix strtolower(array_shift($components));
     
            
    $intParams '';
            
    $strParams '';
            
    $title '';
            
    $slice false;
     
            switch (
    $subPrefix)
            { 
    case 
    'create':$intParams 'id';$title 'title';    $slice true;    break;
    case 
    'detail':$intParams 'id';$title 'title';    $slice true;    break;
    case 
    'categories':    break;
                case 
    'category':    $intParams 'cat_id';$title 'cat_title';$slice true;    break;
                case 
    'user':        $intParams 'user_id';$title 'username';        $slice true;    break;
                case 
    'find':        $strParams 'keyword';                              $slice true;    break;
                default:            
    $intParams 'id';$title 'title';
            }
     
            if (
    $slice)
            {
                
    $outputPrefix .= '/'.$subPrefix;
                
    $action implode('/'$components);
            }
     
            
    $action XenForo_Link::getPageNumberAsAction($action$extraParams);
     
            if (
    $strParams)
            {
                return 
    XenForo_Link::buildBasicLinkWithStringParam($outputPrefix$action$extension$data$strParams);
            }
            else
            {
                return 
    XenForo_Link::buildBasicLinkWithIntegerParam($outputPrefix$action$extension$data$intParams$title);
            }
        }
    }
    File XFStoreNet_Jobs_ControllerPublic_Home_Detail
    PHP:
    <?php
     
    class XFStoreNet_Jobs_ControllerPublic_Home_Detail extends XenForo_ControllerPublic_Abstract
    {
        protected function 
    getdata()
        {
            return 
    $this->getModelFromCache('XFStoreNet_Jobs_Model_Model');
        }
        protected function 
    getdetail()
        {
            return 
    $this->getModelFromCache('XFStoreNet_Jobs_Model_Detail');
        }
     
     
        public function 
    actionIndex()
        {
            if (!
    $this->getdata()->canViewJobs())
            {
                throw 
    $this->getErrorOrNoPermissionResponseException('do_not_have_permission');
            }
       
       
            
    $jobID $this->_input->filterSingle('id'XenForo_Input::STRING);
            
    $details $this->getdetail()->getDetailByID($jobID);
     
       
     
            
    $this->canonicalizeRequestUrl(XenForo_Link::buildPublicLink('jobs/detail',$details,array()));
     
       
            
    $viewParams = array(
                
    'units'            => $this->getdata()->getAllUnit(),
                
    'id'            => $details['id'],
                
    'title'            => $details['title'],
                
    'description'    => $details['description'],
                
    'detail'    => $details['detail'],
            );
       
            return 
    $this->responseView('XFStoreNet_Jobs_ViewPublic_Detail''XFStoreNet_Jobs_Detail',$viewParams);
        }
     
     
    }

    code khá dài nên mong anh nào kiên nhẫn chỉ giúp em cách sửa hoặc cách làm với ạ :(
    Link: http://xfstore.net/jobs
    User: Test
    Pass: 123456
     
    Đang tải...
  2. svxf

    svxf New Member

    Bài viết:
    25
    Likes :
    7
    Kid thích bài này.
  3. Kid

    Kid VIP Member

    Bài viết:
    863
    Likes :
    947
    Vậy cho em hỏi cách để tạo link với ạ, em đang tập viết addon mà còn nhiều cái chưa biết quá :D

    Hiện tại em đã xóa dòng $this->canonicalizeRequestUrl(XenForo_Link::buildPublicLink...

    Trang của em đang xem bình thường được đây ạ http://xfstore.net/jobs/detail/1/
     
  4. Milano

    Milano Member

    Bài viết:
    46
    Likes :
    33
    build link là ở trong route,ko liên quan đến controller public, ở function buildLink, mở cái XenForo_Route_Prefix_Members ra xem là dễ nhất
    XenForo_Link::buildBasicLinkWithIntegerParam của nó đưa vào 2 params là user_id và username thế nên url của nó có cả 2
     
  5. Kid

    Kid VIP Member

    Bài viết:
    863
    Likes :
    947
    Em vẫn chưa hiểu lắm ạ, bởi vì đã có đoạn

    return XenForo_Link::buildBasicLinkWithIntegerParam($outputPrefix, $action, $extension, $data, $intParams, $title);

    Nhưng link của em chỉ có mỗi số mà ko có titile. Nên là em thử thay thành

    return XenForo_Link::buildBasicLinkWithIntegerParam($outputPrefix, $action, $extension, $data, $intParams,'Anh_giup_em_voi');

    Thì vẫn ko thấy có chữ Anh_giup_em_voi ở trên link

    Ko biết em hiểu sai hay là còn thiếu gì ạ
     
  6. Milano

    Milano Member

    Bài viết:
    46
    Likes :
    33
    nó là params mà mình lấy ra trong db, thường là tên của collum chứ là string thì ko đc
     
  7. Kid

    Kid VIP Member

    Bài viết:
    863
    Likes :
    947
    Table của em có nhiều row nhưng đã có row tên là id và title rồi anh ạ. Em chưa hiểu code lắm nhưng ở code bên trên em post, có đoạn là
    PHP:
    switch ($subPrefix)
    {
    case 
    'create':$intParams 'id';$title 'title';$slice true;
    break;
     
    case 
    'detail':$intParams 'id';$title 'title';    $slice true;
    break;
     
    case 
    'categories' break;
     
    case 
    'category'$intParams 'cat_id';$title 'cat_title';$slice true;
    break;
     
    case 
    'user':$intParams 'user_id';$title 'username'$slice true;
    break;
     
    case 
    'find'$strParams 'keyword'$slice true;
    break;
     
    default: 
    $intParams 'id';$title 'title';
    }
     
    if (
    $slice)
    {
    $outputPrefix .= '/'.$subPrefix;
    $action implode('/'$components);
    }
    Em đang dùng detail nhưng vẫn ko thấy hiện title trên link
     
  8. Milano

    Milano Member

    Bài viết:
    46
    Likes :
    33
    cái build link nó ngắn lắm, ko lằng nhằng như thế đâu, đơn giản nhất như cái a dùng là

    thay cái map_id và mapname thành id và title thôi. Cái code của thằng jaxel là nó muốn mỗi controller của nó build link 1 kiểu vì params để build link của nó khác nhau còn của e chỉ build theo detail thôi thì ko cần như nó đâu
     
    Kid thích bài này.
  9. Kid

    Kid VIP Member

    Bài viết:
    863
    Likes :
    947
    Em build nhiều link như bên dưới ấy ạ. Anh có cách nào nhanh gọn để dùng ko a.
    jobs
    jobs/detail/$id
    jobs/create
    jobs/categories
    jobs/category/$id
     
  10. Milano

    Milano Member

    Bài viết:
    46
    Likes :
    33
    thế thì dùng như XFRM nó có subComponent, bê cái route của XFRM vào thì e sẽ build đc category và details, thay lại cho chuẩn là đc
     
  11. Kid

    Kid VIP Member

    Bài viết:
    863
    Likes :
    947
    Hic, chắc hỏi thêm câu nữa là anh phát cáu nhưng mà thật sự .... em ko biết XFRM với subCompoment ở Xenforo nó là gì ạ/ XFRM là viết tắt từ gì thế a

    Cho em hỏi 1 cái nữa là
    Ở controllerPublic của em đã có
    PHP:
    $jobs $this->getdata()->getAllJobs();
     
    $viewParams = array(
    'jobs' => $jobs,
    )
    Trong template em viết
    PHP:
    <xen:foreach loop="$jobsvalue="$job">
     
    <
    a href="{xen:link 'jobs/detail', $job}">{$job.title}</a>
    <
    br/>
     
    </
    xen:foreach>
    Kết quả hiển thị lên trên trang tất cả các job trong database tuy nhiên phần link trỏ về thì tất cả đều trỏ về domain/jobs/detail mà đáng ra phải là domain/jobs/detail/$id

    Em đang gặp vấn đề gì vậy ạ
     
  12. Milano

    Milano Member

    Bài viết:
    46
    Likes :
    33
    bởi cái route của e nó có cái function match để kiểm tra xem có đúng cấu trúc link ko, nó ko match nên ko build dc đúng link
     
  13. Kid

    Kid VIP Member

    Bài viết:
    863
    Likes :
    947
    Em vẫn dùng cách của Jaxel nhưng làm lại cẩn thận từ đầu tới cuối, em làm được rồi ạ. Cảm ơn anh và anh svxf đã giải thích cho em :D

    http://xfstore.net/jobs/detail/1/
    Tự động chuyển sang http://xfstore.net/jobs/detail/sang-be-rua-da-ra-phoi-toi-be-vao.1/

    Anh cho em xin thông tin liên lạc đc ko ạ, em đang tập viết addon nên có nhiều cái thắc mắc...mà em lại ít thấy anh support trên forum
     
  14. Milano

    Milano Member

    Bài viết:
    46
    Likes :
    33
    có info trong profile mà :)
     
  15. Lê Tí

    Lê Tí Well-Known Member

    Bài viết:
    1,450
    Likes :
    620
    cứ như nước đổ đầu vịt :D
    chả hiểu gì, her her
     
  16. Kid

    Kid VIP Member

    Bài viết:
    863
    Likes :
    947
    Anh lăn lộn với forum bao nhiêu năm mà sao ko đọc code thử.
     
  17. Lê Tí

    Lê Tí Well-Known Member

    Bài viết:
    1,450
    Likes :
    620
    vài tháng thui mà :D
    a không thích code, hỉ thích chỉnh sửa temp thui :P
     
comments powered by Disqus

Chia sẻ trang này

Đang tải...