Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: В постижении HMVC. Вопросы от новичка по Кохане

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Помогите разобраться, много вопросов и непоняток
nkl
Отправлено: 17 Апреля, 2013 - 08:23:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Здравствуй мой любимый форум! Начал работу над крупным проектом, относительно крупным. Стоит задача создать что-то вроде платформы 1С:Предприятие, только на php и под web, что бы базовый функционал Системы мог быть с легкостью расширен за счет "конфигураций". За плечами у меня только "процедурные" электронный магазин и система платных видеокурсов. Для решения задач в этих проектах ООП использовалось не более чем на 1%, но все таки использовалось.

Набив шишки на этих "тренировочных" проектах решил взяться за что-то действительно стоящее и долгоживущее (кстати, мои предыдущие проекты до сих пор исправно работают). Для решения столь масштабной задачи была выбрана архитектура HMVC воплощенная в фреймфорке Kohana.

Почитав немного (в частности прошел первые 2 раздела "Для начинающих" и "Углубленное изучение") русскоязычные уроки по Кохане от Дениса на сайте kohanaframework.su я так и не могу ничего толком понять. Да, по урокам у меня есть заготовка для блога, перепечатанная из примеров, все работает замечательно.

Но сейчас я, когда я начала писать свою систему, ничего не работает! Прошу помочь людей, разбирающихся в работе этого фреймворка в этой теме. В частности, сейчас у меня не получается реализовать базовый контроллер. Выглядит это все вот так:

Базовый контроллер /application/classes/Controller/ Common.php
PHP:
скопировать код в буфер обмена
  1. <?PHP defined('SYSPATH') or die('No direct script access.');
  2. /*
  3.  *Базовый контроллер системы
  4.  *Наследуют все контроллеры системы
  5.  */
  6.  
  7. abstract class Controller_Common extends Controller_Template {
  8.  
  9.         //Общий вид системы
  10.         public $template = 'common_view';
  11.        
  12.         public function before()
  13.         {
  14.                 parent::before();
  15.                 View::set_global('title', 'Главная');
  16.                 $this->template->content = '';
  17.         }
  18.  
  19. } // End Common


Базовый Вид /application/views/common_view.php:

PHP:
скопировать код в буфер обмена
  1.  
  2. <!DOCTYPE HTML>
  3. <html>
  4. <head>
  5.  
  6.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7.         <title><?PHP echo $title; ?></title>
  8.         <meta name="description" content="" />
  9.        
  10. </head>
  11.  
  12. <body>
  13.        
  14. </body>
  15. </html>
  16.  

Контроллер по умолчанию /application/classes/Controller/ Def.php
PHP:
скопировать код в буфер обмена
  1. <?PHP defined('SYSPATH') or die('No direct script access.');
  2. /*
  3.  *Контроллер по умолчанию
  4.  *
  5.  */
  6.  
  7. class Controller_Def extends Controller_Common {
  8.        
  9.         //Вывод контента по умолчанию
  10.         public $content = 'content';
  11.        
  12.         public function action_index()
  13.         {
  14.                 $content = View::factory('content');
  15.                 $this->template->content = $content;
  16.                
  17.         }
  18.  
  19. } //END OF Default

Вид системы по умолчанию /application/views/default_view.php:
PHP:
скопировать код в буфер обмена
  1. <div>Вид по умолчанию</div>


Файла bootstrap.php
PHP:
скопировать код в буфер обмена
  1. <?PHP defined('SYSPATH') or die('No direct script access.');
  2.  
  3. // -- Environment setup --------------------------------------------------------
  4.  
  5. // Load the core Kohana class
  6. require SYSPATH.'classes/Kohana/Core'.EXT;
  7.  
  8. if (is_file(APPPATH.'classes/Kohana'.EXT))
  9. {
  10.         // Application extends the core
  11.         require APPPATH.'classes/Kohana'.EXT;
  12. }
  13. else
  14. {
  15.         // Load empty core extension
  16.         require SYSPATH.'classes/Kohana'.EXT;
  17. }
  18.  
  19. /**
  20.  * Set the default time zone.
  21.  *
  22.  * @link http://kohanaframework.org/guide/using.configuration
  23.  * @link http://www.php.net/manual/timezones
  24.  */
  25. date_default_timezone_set('America/Chicago');
  26.  
  27. /**
  28.  * Set the default locale.
  29.  *
  30.  * @link http://kohanaframework.org/guide/using.configuration
  31.  * @link http://www.php.net/manual/function.setlocale
  32.  */
  33. setlocale(LC_ALL, 'en_US.utf-8');
  34.  
  35. /**
  36.  * Enable the Kohana auto-loader.
  37.  *
  38.  * @link http://kohanaframework.org/guide/using.autoloading
  39.  * @link http://www.php.net/manual/function.spl-autoload-register
  40.  */
  41. spl_autoload_register(array('Kohana', 'auto_load'));
  42.  
  43. /**
  44.  * Optionally, you can enable a compatibility auto-loader for use with
  45.  * older modules that have not been updated for PSR-0.
  46.  *
  47.  * It is recommended to not enable this unless absolutely necessary.
  48.  */
  49. //spl_autoload_register(array('Kohana', 'auto_load_lowercase'));
  50.  
  51. /**
  52.  * Enable the Kohana auto-loader for unserialization.
  53.  *
  54.  * @link http://www.php.net/manual/function.spl-autoload-call
  55.  * @link http://www.php.net/manual/var.configuration#unserialize-callback-func
  56.  */
  57. ini_set('unserialize_callback_func', 'spl_autoload_call');
  58.  
  59. // -- Configuration and initialization -----------------------------------------
  60.  
  61. /**
  62.  * Set the default language
  63.  */
  64. I18n::lang('en-us');
  65.  
  66. /**
  67.  * Set Kohana::$environment if a 'KOHANA_ENV' environment variable has been supplied.
  68.  *
  69.  * Note: If you supply an invalid environment name, a PHP warning will be thrown
  70.  * saying "Couldn't find constant Kohana::<INVALID_ENV_NAME>"
  71.  */
  72. Kohana::$environment = Kohana::DEVELOPMENT;
  73. if (isset($_SERVER['KOHANA_ENV']))
  74. {
  75.         Kohana::$environment = constant('Kohana::'.strtoupper($_SERVER['KOHANA_ENV']));
  76. }
  77.  
  78. /**
  79.  * Initialize Kohana, setting the default options.
  80.  *
  81.  * The following options are available:
  82.  *
  83.  * - string   base_url    path, and optionally domain, of your application   NULL
  84.  * - string   index_file  name of your index file, usually "index.php"       index.php
  85.  * - string   charset     internal character set used for input and output   utf-8
  86.  * - string   cache_dir   set the internal cache directory                   APPPATH/cache
  87.  * - integer  cache_life  lifetime, in seconds, of items cached              60
  88.  * - boolean  errors      enable or disable error handling                   TRUE
  89.  * - boolean  profile     enable or disable internal profiling               TRUE
  90.  * - boolean  caching     enable or disable internal caching                 FALSE
  91.  * - boolean  expose      set the X-Powered-By header                        FALSE
  92.  */
  93. Kohana::init(array(
  94.         'base_url'   => '/',
  95.         'index_file' => FALSE
  96. ));
  97.  
  98. /**
  99.  * Attach the file write to logging. Multiple writers are supported.
  100.  */
  101. Kohana::$log->attach(new Log_File(APPPATH.'logs'));
  102.  
  103. /**
  104.  * Attach a file reader to config. Multiple readers are supported.
  105.  */
  106. Kohana::$config->attach(new Config_File);
  107.  
  108. /**
  109.  * Enable modules. Modules are referenced by a relative or absolute path.
  110.  */
  111. Kohana::modules(array(
  112.         // 'auth'       => MODPATH.'auth',       // Basic authentication
  113.         // 'cache'      => MODPATH.'cache',      // Caching with multiple backends
  114.         // 'codebench'  => MODPATH.'codebench',  // Benchmarking tool
  115.         // 'database'   => MODPATH.'database',   // Database access
  116.         // 'image'      => MODPATH.'image',      // Image manipulation
  117.         // 'minion'     => MODPATH.'minion',     // CLI Tasks
  118.         // 'orm'        => MODPATH.'orm',        // Object Relationship Mapping
  119.         // 'unittest'   => MODPATH.'unittest',   // Unit testing
  120.         // 'userguide'  => MODPATH.'userguide',  // User guide and API documentation
  121.         ));
  122.  
  123. /**
  124.  * Set the routes. Each route must have a minimum of a name, a URI and a set of
  125.  * defaults for the URI.
  126.  */
  127. Route::set('default', '(<controller>(/<action>(/<id>)))')
  128.         ->defaults(array(
  129.                 'controller' => 'def',
  130.                 'action'     => 'index',
  131.         ));
  132.  


По адресу http://kohana[dot]my выдает ошибку View_Exception [ 0 ]: The requested view content could not be found

Сразу после установки по этому же адресу я получили избитый Hello World!, все работало, но стоило мне влезть и все перестало работать.
(Добавление)
Разобрался. Сам затупил, файлы неправильно обозвал.

(Отредактировано автором: 17 Апреля, 2013 - 08:27:45)

 
 Top
nkl
Отправлено: 18 Апреля, 2013 - 14:39:40
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




В продолжение изучения Коханы дошел до урока Запрос внутри запроса. И то ли я заработался, то ли действительно что-то не так с примером (хотя ни в камментах ни на форуме не нашел упоминания о подобной ситуации) не могу получить список камментов к статье и все тут! Более того, после модификации файлов по этому уроку, при переходе по любому адресу выдается ошибка Internal server error 500. Вот исходники:
конец файла bootstrap.php:
CODE (text):
скопировать код в буфер обмена
  1. Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')
  2.         ->defaults(array(
  3.                 'directory'  => 'admin',
  4.                 'controller' => 'main',
  5.                 'action'     => 'index',
  6.         ));
  7.  
  8. Route::set('comments', 'comments/<id>', array('id' => '.+'))
  9.         ->defaults(array(
  10.                 'controller' => 'comments',
  11.                 'action' => 'index';
  12.         ));
  13.  
  14. Route::set('articles', '<articles>(/<id>)', array('id' => '.+'))
  15.         ->defaults(array(
  16.                 'controller' => 'articles',
  17.                 'action' => 'index'
  18.         ));
  19.        
  20. if ( ! Route::cache())
  21. {
  22.         Route::set('static', '<action>(/<id>)', array('action' => 'about|contacts'))
  23.                 ->defaults(array(
  24.                         'controller' => 'static',
  25.                 ));
  26.         Route::cache(TRUE);
  27. }
  28.  
  29. Route::set('default', '<controller>(/<action>(/<id>))')
  30.         ->defaults(array(
  31.                 'controller' => 'page',
  32.                 'action'     => 'index',
  33.         ));
  34.  

Контроллер Articles.php:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?php defined('SYSPATH') or die('No direct script access.');
  3.  
  4. class Controller_Articles extends Controller_Common {
  5.        
  6.         public function action_index()
  7.         {
  8.                 $id = $this->request->param('id');
  9.                
  10.                 if($id)
  11.                 {
  12.                         $content = View::factory('/pages/article')
  13.                                 ->set('article', $id)
  14.                                 ->bind('comments', $comments);
  15.                                
  16.                         $comments_url = 'comments/' . $id;
  17.                         $comments = Request::factory($comments_url)->execute();
  18.                 }
  19.                 else
  20.                 {
  21.                         $content = View::factory('/pages/articles');
  22.                 }
  23.                        
  24.                 $this->template->content = $content;
  25.         }
  26.        
  27. } //END OF Articles
  28.  

Контроллер Comments.php:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?php defined('SYSPATH') or die('No direct script access.');
  3.  
  4. class Controller_Comments extends Controller {
  5.        
  6.         public function action_index()
  7.         {
  8.                 $id = $this->request->param('id');
  9.                
  10.                 $content = View::factory('/comments/show')
  11.                         ->bind('comments', $comments);
  12.                        
  13.                 switch($id)
  14.                 {
  15.                         case 'article1':
  16.                                 $comments = array(
  17.                                         array('name' => 'Вася', 'comment' => 'Привет, Петя'),
  18.                                         array('name' => 'Петя', 'comment' => 'Привет, Вася!'),
  19.                                 );
  20.                         break;
  21.                        
  22.                         case 'article2':
  23.                                 $comments = array(
  24.                                         array('name' => 'Гена', 'comment' => 'Привет, Мир!'),
  25.                                 );
  26.                         break;
  27.                        
  28.                         default:
  29.                                 $comments = array();
  30.                         break;
  31.                 }
  32.                
  33.                 $this->response->body($content);
  34.         }
  35.        
  36. } //END OF Comments
  37.  

Файл Вида show.php:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?php foreach($comments as $comment): ?>
  3.  
  4.         <strong>Имя пользователя:</strong>      <?php echo $comment['name']; ?> <strong>Комментарий пользователя:</strong>      <?php echo $comment['comment']; ?>
  5.         <br /><hr /><?php endforeach; ?>
  6.  

Если за комментировать роут
PHP:
скопировать код в буфер обмена
  1. Route::set('comments', 'comments/<id>', array('id' => '.+'))
  2.         ->defaults(array(
  3.                 'controller' => 'comments',
  4.                 'action' => 'index';
  5.         ));

то ошибка исчезает. Я уже стопицот раз проверил по символьно все файлы которые нужно изменить по этому уроку, не могу найти в чем ошибка и все тут. Может кто нить свежим глазом глянет на мой код и скажет в чем проблема?

(Отредактировано автором: 18 Апреля, 2013 - 14:41:08)

 
 Top
spsu
Отправлено: 19 Апреля, 2013 - 00:27:12
Post Id



Частый гость


Покинул форум
Сообщений всего: 176
Дата рег-ции: Нояб. 2012  


Помог: 3 раз(а)




Цитата:
Internal server error 500

Это указывает на то что ошибке в скриптах смотрите error_log на сервере.
Вообще вар-тов почему проявилась ошибка много, но раз появляется при изменении в скриптах зн. ошибка в них.
 
 Top
caballero
Отправлено: 19 Апреля, 2013 - 02:03:41
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Это указывает на то что ошибка в скриптах

очень ценное указание. Все равно что сказать - ошибка на сервере.

обычно Internal server error 500 вызывает ошибка в .htaccess


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
nkl
Отправлено: 19 Апреля, 2013 - 12:26:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Спасибо за столь информативные ответы, решил проблему заново переписав роут с самого начала. Все таки ошибка туда вкралась, но я так и не понял какая и куда именно. Хм
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB