2012-08-22 20 views
9

prestar atención a que ANYTHING_ELSE lo tanto, tengo mis controladores y acciones que yo quiero que se comporten de forma normal en respuesta a ejemplos como este:Yii url avanzada reescribir

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

Pero para todo lo que no cae bajo controladores específicos y acciones, quiero que caigan bajo un controlador predeterminado y acciones como: BlogController y actionView. Ahí es donde 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

las respuestas actuales parecen bastante útiles (especialmente de bellota), ¿cuál es la URL que le da 404? –

Respuesta

11

Explicaré paso a paso cómo hacerlo funcionar.

Paso 1 - Crear una aplicación web Yii

Navegar hasta la ruta marco Yu en su consola y crear una nueva aplicación web. En mi caso he utilizado esto en mi consola:

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

donde c: \ Zeus \ yu-1.1.10.r3566 \ marco es mi camino a Yii framework PHP y C: \ Zeus \ www \ yiiblog es el camino a mi carpeta de prueba Yu webapp

Stept 2 - fingir mi dominio a dev.yiiblog.com

Ir a C: \ Windows \ System32 \ drivers \ etc y editar su archivo de hosts añadiendo esta línea:

127.0.0.1 dev.yiiblog.com 

Paso 3 - alter ap Dolor archivo httpd.conf

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

y reinicie el servicio apache. He utilizado en mi consola de ventanas:

net stop apache 
net start apache 

donde mi servicio de Apache 2 se denomina "Apache" no "apache2.2" como el que viene por defecto.

Paso 4 - Crear una base de datos y configurar una conexión de base de datos en Yii

He creado una base de datos y un yiitest yiitest usuario. Luego abrí mi archivo de configuración Yii ubicado ad/protected/config/main.php y editó la conexión a MySQL:

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

Paso 5 - descarga dburlmanager Yii extensión

Ir a Yii dburlmanager, descargar la extensión dburlmanager Yii http://www.yiiframework.com/extension/dburlmanager/ y extraer a su/protegidos/carpeta de extensiones

Paso 6 - Crear tablas de bases de datos MySQL y añadir datos ficticios

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

Paso 7 - Crear su controlador personalizado Yii s

constituir bajo/protegidas controladores/carpeta dos archivos de PHP llamada ArticleController.php y PageController.php: contenido

ArticleController.php: contenido

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

Paso 8: cree sus vistas Yii personalizadas

Crea tus archivos de vista correspondientes a esos controladores anterior con la ruta de acceso y /protected/views/article/view.php /protected/views/page/view.php:

Artículo vista de contenido:

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

Ver la página de contenido:

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

Paso 9 - añadir reglas personalizadas url Yii

abierto de nuevo el archivo de main.php Yii config y establecer su urlManager a algo similar 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, 
), 

Paso 10 - crear el archivo .htaccess

Crear un archivo .htaccess en virtud de la raíz de su aplicación web y su contenido a ETID:

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 

Paso 11 - prueba su SEO Friendly URLs

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

etc

Diviértete creando blogs increíbles u otras aplicaciones web con total poder de administración de url.

2

Lee mi artículo sobre cómo manejar ese escenario específico (además de otras cosas) con Wordpress: http://www.yiiframework.com/wiki/322/integrating-wordpress-and-yii-still-another-approach-using-yii-as-the-router-controller/

En esencia, con el fin de manejar un defecto de esa manera (y la mano que fuera a un sistema diferente), la forma más fácil de hacerlo es anular el sistema de manejo de excepciones de Yii, detectar errores 404 y entregarlos al controlador de tu blog.

Si envía personas a su controlador de blog configurando la acción de su controlador como un manejador de errores, Yii envía un encabezado de error 404 (incluso si maneja correctamente el error). Sí, he buscado mucho en esto. No, no creo que haya una respuesta más simple :-). Me gustaría saber si se encuentra algo más simple ...

+0

Volveré seguro una vez que encontré la mejor solución para este asunto –

3

Si os he dado cuenta correctamente, es posible usar algo como esto:

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

y el controlador:

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

En teoría se ve genial, en la práctica obtengo 404 –

+2

Eso no es una teoría, funciona. Así que me gustaría que adivinen qué es exactamente lo que ingresa como una URL. Te aconsejo que pruebes la última fila de la configuración en primer lugar, comentando las otras (y escribe abra-cadabra como una url). –

+0

También eche un vistazo a esta [pregunta que se asemeja] (http://stackoverflow.com/questions/11847451/yii-internationalization-i18n-and-dynamic-url-manager) –