2012-08-22 16 views
9

prestare attenzione a che ANYTHING_ELSE Così, ho i miei controllori e le azioni che voglio a comportarsi come normale in risposta a esempi come questo:Yii Advanced URL riscrivere

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

Ma per tutto ciò che non rientra sotto specifici controllori e azioni voglio farli rientrare in un controller predefinito e azioni come: BlogController e actionView. È qui che viene ANYTHING_ELSE.

// 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

le risposte correnti sembrano abbastanza utili (specialmente ghiande), qual è l'url che ti dà 404? –

risposta

11

Spiegherò passo dopo passo come farlo funzionare.

Fase 1 - Creazione di un web app Yii

Accedere al vostro Yii percorso quadro nella vostra console e creare una nuova webapp. Nel mio caso ho usato questo nella mia console:

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

dove c: \ zeus \ Yii-1.1.10.r3566 \ quadro è il mio percorso per Yii framework PHP e C: \ zeus \ www \ yiiblog è la percorso al mio Yii cartella di prova webapp

Stept 2 - falso il mio dominio dev.yiiblog.com

Vai a C: \ Windows \ System32 \ drivers \ etc e modificare il file hosts aggiungendo questa linea:

127.0.0.1 dev.yiiblog.com 

Passaggio 3 - altera mal di file di

<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> 

e riavviare il servizio apache httpd.conf. Ho usato nella mia console di Windows:

net stop apache 
net start apache 

dove il mio servizio Apache 2 è denominato "apache", non "apache2.2", come quello di default.

Fase 4 - creare un database e configurare una connessione al database in Yii

ho creato un database e un yiitest yiitest utente. Quindi ho aperto il mio file di configurazione Yii posizionato ad/protected/config/main.php e curato la connessione a MySQL:

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

Fase 5 - scaricare dburlmanager Yii estensione

Vai a Yii dburlmanager, scaricare il dburlmanager estensione Yii http://www.yiiframework.com/extension/dburlmanager/ ed estrarlo per il vostro/protezione/cartella Estensioni

Fase 6 - Creare tabelle di database MySQL e aggiungere dati fittizi

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'); 

Fase 7 - Crea il tuo controller Yii personalizzato s

Crea in/protette/controller cartella due file PHP chiamata ArticleController.php e PageController.php: contenuti

ArticleController.php: contenuti

<?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']:'', 
    )); 
    } 
} 

Step 8 - crea la tua personalizzata Yii visualizzazioni

Creare i file di visualizzazione corrispondenti a tali controllori di cui sopra con la /protected/views/article/view.php percorso e /protected/views/page/view.php:

contenuto dell'articolo vista:

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

contenuti pagina:

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

Fase 9 - aggiungere personalizzati regole URL Yii

Aprire nuovamente il file di main.php Yii config e impostare l'urlManager a qualcosa di simile a:

'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, 
), 

Fase 10 - creare il file .htaccess

Creare un file .htaccess sotto la root del server web app e etid suo contenuto:

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 

Punto 11 - prova la tua SEO Friendly URL

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

ecc

Divertiti a creare blog fantastici o altre app Web con un potere di gestione completo.

2

Leggi il mio articolo su come gestire questo scenario specifico (più altre cose) con Wordpress: http://www.yiiframework.com/wiki/322/integrating-wordpress-and-yii-still-another-approach-using-yii-as-the-router-controller/

In sostanza, al fine di gestire un default del genere (e consegnarla fuori ad un sistema diverso), il modo più semplice per farlo è ignorare il sistema di gestione delle eccezioni di Yii, rilevare gli errori 404 e consegnarli al controller del blog.

Se si inviano persone al controller del blog impostando l'azione del controllore come gestore degli errori, Yii invia un'intestazione 404 (anche se gestisci correttamente l'errore). Sì, ci ho scavato molto. No, non credo che ci sia una risposta più semplice :-). Mi piacerebbe sapere se si fa trovare qualcosa di più semplice ...

+0

Tornerò di sicuro una volta trovata la migliore soluzione a questo argomento –

3

Se ti ho capito correttamente, si può usare qualcosa di simile:

'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'), 
), 

E il controllore:

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

In teoria sembra fantastico, in pratica ottengo 404 –

+2

Questa non è una teoria, funziona. Quindi vorrei che tu aggiungessi esattamente ciò che inserisci come URL. Ti consiglio di testare prima l'ultima riga di configurazione, commentando gli altri (e inserisci abra-cadabra come url). –

+0

Dai anche un'occhiata a [simile alla domanda] (http://stackoverflow.com/questions/11847451/yii-internationalization-i18n-and-dynamic-url-manager) –