2012-08-22 36 views
9

chú ý đến ANYTHING_ELSE rằng Vì vậy, tôi có điều khiển và hành động của tôi mà tôi muốn cư xử như bình thường để đáp ứng với những ví dụ như thế này:Yii url tiên tiến viết lại

// for UserContoller with actionList and actionEdit 
user/list 
user/edit/25 

Nhưng đối với tất cả mọi thứ mà không rơi dưới các bộ điều khiển và hành động cụ thể, tôi muốn chúng nằm trong một bộ điều khiển mặc định và hành động như: BlogController và actionView. Đó là nơi ANYTHING_ELSE đến.

// ANYTHING_ELSE can be: 
this-is-a-test-page 
this/is/another/page/with/lots/of/slashes 
this-has-extension.html 


'urlManager' => array(
    'urlFormat' => 'path', 
    'showScriptName' => false, 
    'rules' => array(
    '<controller:\w+>/<id:\d+>' => '<controller>/view', 
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', 
    '<controller:\w+>/<action:\w+>' => '<controller>/<action>', 
    'ANYTHING_ELSE' => 'blog/view', 
    ), 
), 
+0

câu trả lời hiện tại có vẻ khá hữu ích (đặc biệt là acorn's), url cung cấp cho bạn 404 là gì? –

Trả lời

11

Tôi sẽ giải thích từng bước cách làm việc này.

Bước 1 - Tạo ứng dụng web Yii

Điều hướng đến đường dẫn khung Yii trong bảng điều khiển của bạn và tạo webapp mới. Trong trường hợp của tôi, tôi đã sử dụng này trong giao diện điều khiển của tôi:

cd c:\zeus\yii-1.1.10.r3566\framework 
yiic webapp c:\zeus\www\yiiblog 

trong đó c: \ zeus \ yii-1.1.10.r3566 \ khuôn khổ là con đường để khuôn khổ php Yii và c: \ zeus \ www \ yiiblog là đường dẫn đến thư mục Yii thử nghiệm webapp của tôi

Stept 2 - giả miền của tôi để dev.yiiblog.com

đến C: \ Windows \ System32 \ drivers \ etc và chỉnh sửa file host của bạn bằng cách thêm dòng này:

127.0.0.1 dev.yiiblog.com 

Bước 3 - thay đổi ap Tệp httpd.conf ache

<VirtualHost *:80> 
    DocumentRoot "c:/zeus/www/yiiblog" 
    ServerName dev.yiiblog.com 
    ErrorLog "logs/dev.yiiblog.com-error.log" 
    CustomLog "logs/dev.yiiblog.com-access.log" common 
</VirtualHost> 

và khởi động lại dịch vụ apache. Tôi đã sử dụng trong giao diện điều khiển cửa sổ của mình:

net stop apache 
net start apache 

nơi dịch vụ Apache 2 của tôi có tên "apache" không phải là "apache2.2" như mặc định.

Bước 4 - tạo ra một cơ sở dữ liệu và cấu hình một kết nối cơ sở dữ liệu vào Yii

tôi đã tạo ra một cơ sở dữ liệu yiitest và yiitest người dùng. Sau đó, tôi mở tập tin cấu hình Yii của tôi nằm ad/protected/config/main.php và chỉnh sửa các kết nối đến MySQL:

'db'=>array(
    'connectionString' => 'mysql:host=localhost;dbname=yiitest', 
    'emulatePrepare' => true, 
    'username' => 'yiitest', 
    'password' => 'password', 
    'charset' => 'utf8', 
), 

Bước 5 - tải dburlmanager Yii mở rộng

Đến Yii dburlmanager, tiến hành download dburlmanager mở rộng Yii http://www.yiiframework.com/extension/dburlmanager/ và giải nén nó vào bạn/bảo vệ/extensions thư mục

Bước 6 - Tạo bảng cơ sở dữ liệu MySQL và thêm dữ liệu giả

CREATE TABLE IF NOT EXISTS `articles` (
    `seoURL` varchar(100) NOT NULL 
) ENGINE=InnoDB; 

INSERT INTO `articles` (`seoURL`) VALUES 
('first-post'), 
('another-post'), 
('post/value'), 
('website/page1'); 

CREATE TABLE IF NOT EXISTS `pages` (
    `seoURL` varchar(100) NOT NULL 
) ENGINE=InnoDB; 

INSERT INTO `pages` (`seoURL`) VALUES 
('page-first-post'), 
('page-another-post'), 
('page/post/value.html'), 
('page-website/page1'); 

Bước 7 - Tạo bộ điều khiển tùy chỉnh Yii của bạn s

Tạo dưới/bảo vệ/kiểm soát thư mục hai tập tin php tên ArticleController.php và PageController.php: Nội dung

ArticleController.php: Nội dung

<?php 
/** 
* @filename ArticleController.php 
*/ 

class ArticleController extends CController { 
    public function actionView() { 
    $this->render('view', array(
     'article' => isset($_GET['article'])?$_GET['article']:'', 
    )); 
    } 
} 

PageController.php:

<?php 
/** 
* @filename PageController.php 
*/ 
class PageController extends CController { 
    public function actionView() { 
    $this->render('view', array(
     'page' => isset($_GET['page'])?$_GET['page']:'', 
    )); 
    } 
} 

Bước 8 - tạo chế độ xem Yii tùy chỉnh của bạn

Tạo file view của bạn tương ứng với những điều khiển trên với /protected/views/article/view.php đường dẫn và /protected/views/page/view.php:

Điều xem nội dung:

<h1>Article View Test</h1> 
<br /> 
<?php 
    if (isset ($article)) echo "article: $article"; 
?> 

page view nội dung:

<h1>Page View Test</h1> 
<br /> 
<?php 
    if (isset ($page)) echo "page: $page"; 
?> 

Bước 9 - thêm tùy chỉnh Yii quy tắc url

mở lại main.php của bạn tập tin Yii cấu hình và thiết lập urlManager của bạn để một cái gì đó tương tự như: 01.230.

'urlManager'=>array(
    'urlFormat'=>'path', 
    'class'=>'ext.DbUrlManager.EDbUrlManager', 
    'connectionID'=>'db', 
    'rules'=>array(
    '<article:[\w\/.-]+>'=>array(
     'article/view', 
     'type'=>'db', 
     'fields'=>array(
     'article'=>array(
      'table'=>'articles', 
      'field'=>'seoURL' 
     ), 
    ), 
    ), 

    '<page:[\w\/.-]+>'=>array(
     'page/view', 
     'type'=>'db', 
     'fields'=>array(
     'page'=>array(
      'table'=>'pages', 
      'field'=>'seoURL' 
     ), 
    ), 
    ), 

    '<controller:\w+>/<id:\d+>' => '<controller>/view', 
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', 
    '<controller:\w+>/<action:\w+>' => '<controller>/<action>', 
), 
    'showScriptName'=>false, 
), 

Bước 10 - tạo .htaccess tập tin

Tạo một file .htaccess dưới gốc ứng dụng web của bạn và etid nội dung của nó để:

Options +FollowSymLinks 
IndexIgnore */* 
RewriteEngine on 

# if a directory or a file exists, use it directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

# otherwise forward it to index.php 
RewriteRule . index.php 

Bước 11 - kiểm tra SEO của bạn URL thân thiện

dev.yiiblog.com/first-post 
dev.yiiblog.com/page-first-post 

vv

Hãy vui vẻ khi tạo các blog tuyệt vời hoặc các ứng dụng web khác với khả năng quản lý url hoàn chỉnh.

2

đã đọc bài viết của tôi về cách xử lý rằng kịch bản cụ thể (cộng với những thứ khác) với Wordpress: http://www.yiiframework.com/wiki/322/integrating-wordpress-and-yii-still-another-approach-using-yii-as-the-router-controller/

Về bản chất, để xử lý một mặc định như vậy (và tay nó đi đến một hệ thống khác nhau), tr cách dễ nhất để làm điều đó là để ghi đè lên hệ thống xử lý ngoại lệ của Yii, bắt lỗi 404 và trao chúng cho bộ điều khiển blog của bạn.

Nếu bạn gửi mọi người đến bộ điều khiển blog bằng cách đặt hành động điều khiển của bạn làm trình xử lý lỗi, Yii sẽ gửi tiêu đề lỗi 404 (ngay cả khi bạn xử lý đúng lỗi). Vâng, tôi đã đào sâu vào điều này rất nhiều. Không, tôi không tin có một câu trả lời đơn giản hơn :-). Tôi rất muốn biết nếu bạn tìm thấy một cái gì đó đơn giản hơn ...

+0

Tôi sẽ quay trở lại để chắc chắn khi tôi tìm ra giải pháp tốt nhất cho vấn đề này –

3

Nếu tôi đã nhận ra bạn một cách chính xác, bạn có thể sử dụng một cái gì đó như thế này:

'rules' => array(
    //You should define all the controllers exactly: 
    '<controller:user|archive|office>/<action:\w+>' => '<controller>/<action>', 
    //Or more complicated rule: 
    '<lang:(es|it|en)>/(turismo|visita|travel)/<slug:>' => array('visit/page', 'urlSuffix' => '.html'), 

    //After that you can process all remaining urls as you want: 
    '<alias:[\w\d\-_\/]+>' => array('blog/view', 'urlSuffix' => '.html'), 
), 

Và bộ điều khiển:

class BlogController extends Controller 
{ 
    public function actionView($alias) 
    { 
     echo $alias; 
    } 
} 
+1

Về lý thuyết nó trông rất tuyệt, trong thực tế tôi nhận được 404 –

+2

Đó không phải là một lý thuyết, nó hoạt động. Vì vậy, tôi muốn bạn thêm chính xác những gì bạn nhập vào như một URL. Tôi khuyên bạn nên kiểm tra hàng cấu hình cuối cùng trước tiên, bằng cách bình luận những người khác (và nhập abra-cadabra làm url). –

+0

Ngoài ra, hãy xem [câu hỏi tương tự] này (http://stackoverflow.com/questions/11847451/yii-internationalization-i18n-and-dynamic-url-manager) –

Các vấn đề liên quan