2012-06-16 3 views
0

Я начинаю разрабатывать с использованием Zend Framework, и у меня есть вопрос о маршрутах. Есть ли способ, чтобы вместо того, чтобы иметь URL вроде этого:Zend Route - удалить имя параметра из URL

www.mysite.com/newsletter/groups/edit/id/1

есть это:

www.mysite.com/newsletter/группы/редактировать/1

(без имени параметра идентификатор)

Я уже поставил этот код, чтобы объявить собственный маршрут в моем файле Bootstrap:

protected function _initRoutes() 
{ 
    $router = Zend_Controller_Front::getInstance()->getRouter();  

    /* Edit Groups */ 
    $route = new Zend_Controller_Router_Route('groups/edit/:group_id',array('controller' => 'groups','action' => 'edit')); 
    $router->addRoute('group_edit', $route); 

    return $router; 
} 

Тогда в моем файле вида я использую это эхо URL:

<a href="<?=$this->url(array('group_id' => $group->getId()), 'group_edit');?>" class=""><?=$group->getName()?></a> 

И гиперссылка это вторя, как я хочу:

<a href="/fuhrmann/newsletter/groups/edit/1" class="">Group 1</a> 

Это мой application.ini:

[production] 

appnamespace = "Application" 

; Debug output 
phpSettings.display_startup_errors = 0 
phpSettings.display_errors = 0 
resources.frontController.params.displayExceptions = 0 

;PHP Setings 
phpsettings.date.timezone = "America/Sao_Paulo" 

; Include path 
includePaths.models = APPLICATION_PATH "/models" 
includePaths.application = APPLICATION_PATH 
includePaths.library = APPLICATION_PATH "/../library" 

; Bootstrap 
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 


; Front Controller 
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" 
resources.frontController.env = APPLICATION_ENV 
resources.frontController.actionHelperPaths.Action_Helper = APPLICATION_PATH "/views/helpers" 
resources.frontController.moduleControllerDirectoryName = "actions" 
;resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 
resources.frontController.defaultControllerName = "index" 
resources.frontController.defaultAction = "index" 
resources.frontController.defaultModule = "default" 
;resources.frontController.baseUrl = "/newsletter" 
;resources.frontController.returnresponse = 1 

; Layout 
resources.layout.layout = "layout" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" 


; Views 
resources.view.helperPath = APPLICATION_PATH "/views/helpers" 
resources.view.encoding = "UTF-8" 
resources.view.basePath = APPLICATION_PATH "/views" 
resources.view.scriptPath.Default = APPLICATION_PATH "/views/scripts" 
resources.view.doctype = "HTML5" 
resources.view.contentType = "text/html;charset=utf-8" 
resources.view.helperPathPrefix = "Views_Helpers_" 
resources.view.filterPathPrefix = "Views_Filters_" 

resources.db.adapter = "PDO_SQLITE" 


[testing : production] 
phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 
resources.frontController.params.displayExceptions = 1 


[development : production] 
phpSettings.display_startup_errors = 1 
phpSettings.display_errors = 1 
resources.frontController.params.displayExceptions = 1 
resources.frontController.throwExceptions = true 

resources.db.adapter = "PDO_MYSQL" 
resources.db.params.host = "localhost" 
resources.db.params.dbname = "newsletter" 
resources.db.params.username = "root" 
resources.db.params.password = "" 
resources.db.isDefaultTableAdapter = true 
resources.db.params.charset = utf8 

Мой полный файл Boostrap:

Мой index.php файл (внутри общественности):

<?php 
// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

// Define application environment 
defined('APPLICATION_ENV') 
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); 

// Ensure library/ is on include_path 
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'), 
    get_include_path(), 
))); 

/** Zend_Application */ 
require_once 'Zend/Application.php'; 

// Create application, bootstrap, and run 
$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini' 
); 
$application->bootstrap() 
      ->run(); 

Проблема, когда я нажимаю, чтобы открыть эту страницу (страницу редактирования группы) Я получаю эту ошибку:

Fatal error: Uncaught exception 'Zend_Controller_Router_Exception' with message 'group_id is not specified' in C:\xampp\htdocs\fuhrmann\newsletter\library\Zend\Controller\Router\Route.php:354 Stack trace: #0 C:\xampp\htdocs\fuhrmann\newsletter\library\Zend\Controller\Router\Rewrite.php(470): Zend_Controller_Router_Route->assemble(Array, true, true) #1 C:\xampp\htdocs\fuhrmann\newsletter\library\Zend\View\Helper\Url.php(49): Zend_Controller_Router_Rewrite->assemble(Array, NULL, true, true) #2 [internal function]: Zend_View_Helper_Url->url(Array, NULL, true) #3 C:\xampp\htdocs\fuhrmann\newsletter\library\Zend\View\Abstract.php(350): call_user_func_array(Array, Array) #4 C:\xampp\htdocs\fuhrmann\newsletter\application\layouts\scripts\layout.phtml(22): Zend_View_Abstract->__call('url', Array) #5 C:\xampp\htdocs\fuhrmann\newsletter\application\layouts\scripts\layout.phtml(22): Zend_View->url(Array, NULL, true) #6 C:\xampp\htdocs\fuhrmann\newsletter\library\Zend\View.php(108): include('C:\xampp\htdocs...') #7 C:\xampp\htdocs\fu in C:\xampp\htdocs\fuhrmann\newsletter\library\Zend\Controller\Plugin\Broker.php on line 336 

Внутри моего действия EDIT я могу сделать var_dump во всех параметрах запроса, чтобы узнать, установлен ли groupId, и да, это так!

array(3) { ["groupId"]=> string(3) "555" ["controller"]=> string(6) "groups" ["action"]=> string(6) "edit" } 

Я уже искал много ответов здесь и, кстати, I found a question с ответом, но не решение для меня.

Спасибо!

+2

Пожалуйста, разместите свои решения как ответ, а не как отредактировать вопрос. –

ответ

3

ОК, решена!

Что я сделал, чтобы добавить значение по умолчанию (NULL) в group_id, так что в моем загрузочном файле у меня есть это сейчас:

$route = new Zend_Controller_Router_Route('/groups/edit/:group_id',array('controller' => 'groups','action' => 'edit', 'group_id' => NULL)); 

Благодаря @philien!

0

Вы можете попробовать, удалив подчеркивание:

protected function _initRoutes() 
{ 
    $router = Zend_Controller_Front::getInstance()->getRouter();  

    /* Edit Groups */ 
    $route = new Zend_Controller_Router_Route('groups/edit/:groupId',array('controller' => 'groups','action' => 'edit')); 
    $router->addRoute('group_edit', $route); 

    return $router; 
} 

И после того, как:

<a href="<?=$this->url(array('groupId' => $group->getId()), 'group_edit');?>" class=""><?=$group->getName()?></a> 

Подчеркивание плохо использовать в этом случае, я выбираю поставить имена в CamelCased.

+0

Я пытался изменить то, что вы сказали, но все еще получал ошибку. Может быть, что-то в моем файле boostrap ... Я отредактировал свой ответ с полным кодом файла начальной загрузки. Если я укажу на ** http: // localhost/newsletter/groups/edit/groupId/1 **, все работает. – Fuhrmann