В предыдущем примере можно столкнуться с проблемой обрезания дефолтового языка и генерации роутеров. В этот раз уже выкладываю рабочий проект, только без дизайнов и прочего, т.к. снят с реально действующего сайта.
Все авторские права данного примера пренадлежат UDSTM, кроме тех частей кода, которые писались другими авторами и распространяются по GNU лицензии.
Языки мы храним в бд
language
-- phpMyAdmin SQL Dump
-- version 3.5.0-rc1
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Апр 10 2012 г., 13:34
-- Версия сервера: 5.1.40-community
-- Версия PHP: 5.3.3
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- База данных: `marki`
--
-- --------------------------------------------------------
--
-- Структура таблицы `language`
--
CREATE TABLE IF NOT EXISTS `language` (
`language_id` smallint(11) NOT NULL AUTO_INCREMENT,
`language_locale` varchar(5) NOT NULL,
`language_name` varchar(15) NOT NULL,
`language_pic` varchar(255) DEFAULT NULL,
`language_visible` enum('0','1') NOT NULL DEFAULT '0',
`language_pr` smallint(8) NOT NULL,
PRIMARY KEY (`language_id`),
KEY `languages_visible` (`language_visible`),
KEY `language_locale` (`language_locale`),
KEY `language_pr` (`language_pr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
--
-- Дамп данных таблицы `language`
--
INSERT INTO `language` (`language_id`, `language_locale`, `language_name`, `language_pic`, `language_visible`, `language_pr`) VALUES
(5, 'ru', 'Русский', '/images/languages/lang_1331901742.jpg', '0', 1),
(8, 'en', 'Английский', NULL, '1', 0);
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
таблица для текстовоых страниц:
-- phpMyAdmin SQL Dump
-- version 3.5.0-rc1
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Апр 10 2012 г., 13:34
-- Версия сервера: 5.1.40-community
-- Версия PHP: 5.3.3
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- База данных: `marki`
--
-- --------------------------------------------------------
--
-- Структура таблицы `pages`
--
CREATE TABLE IF NOT EXISTS `pages` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL,
`txt` text NOT NULL,
`title` varchar(255) NOT NULL,
`external_url` varchar(255) NOT NULL,
`url` varchar(255) NOT NULL,
`kw` varchar(255) NOT NULL,
`dw` varchar(255) NOT NULL,
`pr` int(5) NOT NULL DEFAULT '999',
`visible` enum('0','1') NOT NULL DEFAULT '1',
`pic` varchar(255) NOT NULL,
`lang_id` smallint(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`),
KEY `visible` (`visible`),
KEY `lang_id` (`lang_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;
--
-- Дамп данных таблицы `pages`
--
INSERT INTO `pages` (`id`, `parent_id`, `txt`, `title`, `external_url`, `url`, `kw`, `dw`, `pr`, `visible`, `pic`, `lang_id`) VALUES
(10, 0, '<p>\r\n wqerwqer</p>\r\n', 'английский тестовы', '', 'anglijskij-testovy', '', '', 999, '1', '', 8),
(11, 0, '', 'Главная', '/', 'Glavnaja', '', '', 999, '1', '', 5),
(12, 0, '', 'Каталог', 'catalog', 'Katalog', '', '', 999, '1', '', 5),
(13, 0, '', 'Новости', 'news', 'Novosti', '', '', 999, '1', '', 5),
(14, 0, '', 'Акции', '/stock/', 'Aktsii', '', '', 999, '1', '', 5),
(15, 0, '<p>\r\n Оплата и доставка</p>\r\n', 'Оплата и доставка', '', 'Oplata-i-dostavka', 'Оплата и доставка', 'Оплата и доставка', 999, '1', '', 5),
(16, 0, '<p>\r\n Контакты</p>\r\n', 'Контакты', '', 'Kontakty', 'Контакты', 'Контакты', 999, '1', '', 5);
--
-- Ограничения внешнего ключа сохраненных таблиц
--
--
-- Ограничения внешнего ключа таблицы `pages`
--
ALTER TABLE `pages`
ADD CONSTRAINT `pages_ibfk_1` FOREIGN KEY (`lang_id`) REFERENCES `language` (`language_id`) ON DELETE CASCADE ON UPDATE CASCADE;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Как видно, мы в pages имеем ключ langueage_id который ссылается на таблицу langueage. С помощью этого мы можем спокойно разделять контент по языкам.
В основной bootstrap:
protected function _initRoutes() {
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
//$router->removeDefaultRoutes();
$frontController = Zend_Controller_Front::getInstance();
$frontController->getRouter()->addRoute('default', new Zend_Controller_Router_Route(
'/:module/:controller/:action/*',
array(
'module' => 'default',
'controller' => 'index',
'action' => 'index',
'lang' => $lang
)
)
);
// add multilingual route
$frontController->getRouter()->addRoute('defaultMultilingual', new Zend_Controller_Router_Route(
':lang/:module/:controller/:action/*',
array(
'module' => 'default',
'controller' => 'index',
'action' => 'index',
'lang' => $lang
),
array(
'lang' => '\w{2}'
)
)
);
/* * *********************************** */
$route = new Zend_Controller_Router_Route(
'pages/:key',
array(
'lang' => '',
'module' => 'pages',
'controller' => 'show',
'action' => 'index',
'key' => ':key',
)
);
$router->addRoute('staticpages', $route);
$route = new Zend_Controller_Router_Route(
':lang/pages/:key',
array(
'lang' => '',
'module' => 'pages',
'controller' => 'show',
'action' => 'index',
'key' => ':key',
)
);
$router->addRoute('staticpagxes', $route);
/* * ********************** */
$router->addRoute(
'adminoller', new Zend_Controller_Router_Route('/admin',
array(
'module' => 'admin',
'controller' => 'index',
'action' => 'index'
)
)
);
$router->addRoute(
'admixnoller', new Zend_Controller_Router_Route('/admin/:controller',
array(
'module' => 'admin',
'controller' => 'index',
'action' => 'index'
)
)
);
$router->addRoute(
'axdmixnoller', new Zend_Controller_Router_Route('/admin/:controller/:action',
array(
'module' => 'admin',
'controller' => 'index',
'action' => 'index'
)
)
);
}
Больше можно посмотрев скачать проект. В этот раз скачать могут только зарегистрированные. Код сырой. Некоторые момент реализованы не совсем хорошо, залито много лишнего: например меню и т.д.. Но это хоть что-то. По крайней мере многие необходимые моменты в этом шаблоне собраны. Запустить можете не пытаться: моделей, стилей нет.