2013-03-22 3 views
3

У меня есть модуль, который называется статьей. Он существует в папке collowing:Выполнение модуля Yii без маршрута

- protected 
     - modules 
      - article 
       - controllers 
        ArticleController.php 
       - views 
         -article 
      articleModule.php 

Поскольку я делаю CMS. Я решил не использовать прямые ссылки на контроллеры или действия. Это означает вызов example.com/article/article/index. Не получится. Поскольку CMS рассматривает запрос URL как страницу. (Так что он ищет страницу под названием «index» с родительской статьей »и« статьей ». Такая страница не существует.

CMS загружает блоки для действительной страницы и для одного из этих блоков я хочу выполнить модуль статьи. Я попытался с помощью

Yii::app()->runController($route). 

Однако для этого вам нужен маршрут.

можно ли запустить модуль, как это так, что модуль работает так же, как идти к примеру URL. com/article/article?

Или, если это невозможно. o Я настраиваю диспетчер Url, чтобы он мог обрабатывать страницы ?. С чистыми адресами. Вот несколько примеров:

example.com/join_us 
example.com/join_us/contact 
example.com/news/ 
example.com/countries/us/healthcare 

Вышеупомянутые страницы, которые пользователь может создать и изменить. Я боролся с этим в течение долгого времени. Обычно это было бы легко. Но Yii делает это очень тяжело. В основном потому, что контроллер или модуль связаны с переходом на маршрут.

+0

Это не совсем понятно, что вы хотите. Должны ли все URL-адреса обслуживаться только из одного действия (в 'modules/article')? Если нет, какие URL-адреса следует исключить? –

+0

Покажите нам свои правила urlManager – soju

+0

@ MichaelHärtl Harti стандартное действие индекса и все другие действия с использованием параметров get – Minahalmon

ответ

1

Put это в основной конфигурации:

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

И это в .htaccess файле:

 
RewriteEngine on 

Если каталог или файл существует, использовать его непосредственно:

 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

... в противном случае переслать его на index.php:

 
RewriteRule . index.php 
+0

@Virtlink почему вы оцениваете мой ответ – Gunnit

+0

Да, зачем я? Я не знаю, должен быть кто-то другой. Я только редактировал его. – Virtlink

+0

@Virtlink Спасибо за предложение. Ссылка, например about_us, теперь теперь переходит к действию в siteController. И для каждой страницы мне нужно сделать действие в siteController сейчас. Также подстраницы не работают как join_us/contact. Не могли бы вы объяснить abit об этой идее. Еще раз спасибо за ответ. То, что я пытаюсь достичь, - запустить модуль, если он существует в этой папке. В противном случае отправьте url и sub url на стандартный контроллер, скажем, siteController. Это проверяет, является ли это действительной страницей. Такова идея, которую я сейчас имею. Обновление – Minahalmon

1

Вы можете перенаправить все на контроллер товаров. Yii использует правила от сверху вниз, поэтому сначала определите некоторые конкретные правила и, в конце концов, что-то вроде правила catch-all. Это должно работать:

// Url manager rules 
// Some of example non-article rules 
'login' => 'userModule/user/login' 
'logout' => 'userModule/user/login' 
// Below regex rule catch any string and pass it to $_GET['ariticlePath'] 
// and executes action `article` of controller `article` of module `article` 
'<ariticlePath:.+>' => 'article/article/article' 

В действии статьи вы можете делать все, что вы хотите с $_GET['ariticlePath'] прошло.

SIDE ПРИМЕЧАНИЕ: Для того, чтобы избежать двойного индексирования содержимого я рекомендую использовать мету canonical, так что некоторые, возможно, фиктивные адреса с строкой запроса или что-то некоторые пользователи могут войти, не будут рассматриваться как дублированный контент с помощью Google.

EDIT: Как мотивационный сочж, articlePath может также быть связан, как действия пары:

... 
public function actionArticle($articlePath) 
... 
+1

+1, но не используйте '$ _GET ['articlePath']', вам просто нужно добавить параметр '$ articlePath' в вашу функцию действия контроллера. – soju

+0

Приятно, кажется, новая функция, так как я читал основные принципы :) – 2013-03-22 17:55:17

+0

Все еще трахается, чтобы заставить его работать. Я написал три правила написания. И удалил мое (. *) Правило на страницуController. Но теперь он переходит на страницу входа. Так как это первые правила, то это происходит. Я попытался заполнить index.php /? Articlepath = get. Но теперь он идет на стандартное приветствие Yii, обрабатываемое siteController – Minahalmon