PHP.SU

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

Страниц (9): « 1 2 3 4 5 6 [7] 8 9 »

> Найдено сообщений: 131
razorg1991 Отправлено: 03 Июля, 2014 - 08:53:47 • Тема: Снова проблемы с роутером • Форум: Вопросы новичков

Ответов: 2
Просмотров: 99
Есть роутер (многие уже наверное не раз видели Радость )

PHP:
скопировать код в буфер обмена
  1.  
  2. class Route {
  3.        
  4.         // контроллер и действие по умолчанию
  5.         public $controller_name = 'Main';
  6.         public $action_name = 'index';
  7.         public $id;
  8.        
  9.         public function run()
  10.     {
  11.        
  12.         // получаем имя контроллера
  13.         if(!empty($_GET['view'])){     
  14.             $this->controller_name = trim(strip_tags($_GET['view']));}
  15.  
  16.         if(!class_exists($this->controller_name)) {self::ErrorPage404();}
  17.         // создаем объект контроллера
  18.             $controller = new $this->controller_name;
  19.                    
  20.         // получаем имя экшена
  21.         if(!empty($_GET['action'])) {
  22.             $this->action_name = trim(strip_tags($_GET['action']));}
  23.  
  24.         if(!method_exists($controller, $this->action_name)) {self::ErrorPage404();}
  25.             // создаем экшн
  26.             $action = $this->action_name;
  27.        
  28.         // получаем id элемента
  29.         if($_GET['id']) {
  30.             $this->id = (int)trim(strip_tags($_GET['id']));
  31.         }
  32.                        
  33.         // вызываем действие контроллера
  34.           call_user_func(array($controller, $action));
  35.              
  36.     }
  37.    
  38.         static function ErrorPage404() {
  39.            
  40.             header('Location:'.Config::$template_folder.Config::$template.'/error.php');
  41.             exit();
  42.     }
  43. }
  44.  


Соответсвенно в строке браузера для перехода ввожу к примеру ?view=main&action=index
По задумке если класса не существует, т.е. если неправильно вписан view=kdvjb то перекидывает на 404. Тут все работает.
А вот при следующей проверке метода к примеру action=jbkdjb меня не перебрасыват на 404, а остаюсь на той же странице и php выдает ошибку Cannot modify header information - headers already sent by (output started at W:\home\localhost\www\avtocms\templates\default\index.php:5) in W:\home\localhost\www\avtocms\core\router.php on line 44
В принципе понятно даже почему, в header уже передан заголовок (если не корректно или не правильно выразился, камнями просьба не закидывать Радость ).
Вот как мне побороть эту ситуацию ума не приложу?! Не понял
razorg1991 Отправлено: 26 Июня, 2014 - 08:16:26 • Тема: Видимость переменных • Форум: Вопросы новичков

Ответов: 6
Просмотров: 283
caballero пишет:
передавай модель вторым параметром в функцию view()


Спасибо, так и сделал, все заработало Радость
razorg1991 Отправлено: 24 Июня, 2014 - 22:08:36 • Тема: Видимость переменных • Форум: Вопросы новичков

Ответов: 6
Просмотров: 283
Мелкий пишет:
А почему должен?

А почему нет?
Ну хорошо, а как тогда мне сделать видимые переменные для вида? Или как мне вообще в вид делать вставки кода для вывода данных из контроллера?
razorg1991 Отправлено: 24 Июня, 2014 - 21:14:13 • Тема: Видимость переменных • Форум: Вопросы новичков

Ответов: 6
Просмотров: 283
Использую MVC
Контроллер выглядит так:

PHP:
скопировать код в буфер обмена
  1.  
  2. class mod_contact extends modBaseController {
  3.         protected $objmm = array("info" => "info");
  4.         public function getmodule() {
  5.             $a = $this->objmm["info"]->getdata();
  6.             var_dump($a);
  7.             $this->view("mod_contact");
  8.         }
  9.     }
  10.  


Модель:

PHP:
скопировать код в буфер обмена
  1.  
  2. class Info extends BaseModel {
  3.            public function getdata() {
  4.                return $this->sel("*","info");
  5.            }
  6.         }
  7.  


Вид:

PHP:
скопировать код в буфер обмена
  1.  
  2. э<h2>Это вид модуля контактов!</h2>
  3. <?PHP
  4.     echo $a['adress'];
  5. ?>
  6.  


Все работает, var_dump показывает все что хотел вывести
array(6) { ["adress"]=> string(43) "пр.Косиора, 2А, г.Харьков" ["nav"]=> string(0) "" ["phone"]=> string(19) "+38 (096) 042 78 38" ["day"]=> string(15) "Пн-Сб, Вс" ["time"]=> string(23) "9.00-18.00, 10.00-18.00" ["weekend"]=> string(23) "без выходных" }

А вот с с выводом в виде возникла проблема:
Notice: Undefined variable: a in W:\home\localhost\www\avtocms\templates\default\views\mod_contact.php on line 3

Почему вид не видит переменную "a" из контроллера, данные которой пришли из модели?

Базовый класс контроллера выглядит так:

PHP:
скопировать код в буфер обмена
  1.  
  2. abstract class modBaseController {
  3.        
  4.         // массив для объектов моделей используемых модулем
  5.         protected $objmm = array();
  6.        
  7.         public function __construct() {
  8.             // создаем объекты моделей при вызове контроллера модуля
  9.             foreach ($this->objmm as $obj => $classmodel) {
  10.                 $this->objmm[$obj] = new $classmodel;
  11.             }
  12.            
  13.         }
  14.        
  15.         // подключаем вид модуля
  16.         public function view($view) {
  17.             $path_view = Config::$template_folder.Config::$template.Config::$view_folder.$view.'.php';
  18.             $path_view_default = Config::$template_folder.Config::$template_default.Config::$view_folder.$view.'.php';
  19.            
  20.             if(file_exists($path_view)){
  21.                 require_once $path_view;
  22.             }
  23.            
  24.             elseif(!file_exists($path_view_default)) {
  25.                 echo 'Файл'.$view.'.php не существует!';
  26.             }
  27.             else {
  28.                 require_once $path_view_default;
  29.             }
  30.         }
  31.  
  32.     }
  33.  
razorg1991 Отправлено: 07 Июня, 2014 - 07:38:09 • Тема: Как правильно обратиться к моделе из контроллера • Форум: Вопросы новичков

Ответов: 55
Просмотров: 1655
Поболтали и разбежались Ха-ха
Просил ответить они тут "дискус" устроили А?!
Честно не вижу в фабрике никакого смысла, по крайней мере каждый раз при вызове фабрики код увеличивается на пару слов.
Пытаюсь просто реализовать так, чтобы как можно было меньше писать и автоматизировать в некотором роде процесс создания объектов для нужных классов.
Поэтому буду наверное использовать свой вариант, на мой взгляд он более короткий в написании и лаконичнее.
razorg1991 Отправлено: 04 Июня, 2014 - 21:41:02 • Тема: Как правильно обратиться к моделе из контроллера • Форум: Вопросы новичков

Ответов: 55
Просмотров: 1655
Вот сейчас кодил в итоге реализовал в принципе так как задумал:

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. // Базовый контроллер
  4. Сlass Base {
  5.         protected $objm = array();
  6.         public function __construct() {
  7.             foreach ($this->objm as $obj => $classmodel) {
  8.                 $this->objm[$obj] = new $classmodel;
  9.             }
  10.         }
  11.     }
  12.  
  13. // дочерний контроллер
  14. class Main extends Base {
  15.        protected $objm = array("obj" => "MOne","obj2" => "MyM");
  16.        public function modelone() {
  17.             //echo $this->mobj->modelprop;
  18.             echo $this->objm["obj"]->modelprop;
  19.        }
  20.        public function modelmym() {
  21.             //echo $this->mobj->modelprop;
  22.             echo $this->objm["obj2"]->modelprop;
  23.        }
  24. }
  25.  
  26.  
  27. // ну и модели соответсвенно
  28. class MOne {
  29.         public $modelprop = 'Это свойство модели One!';
  30.     }
  31.  
  32. class MyM {
  33.            public $modelprop = "Это свойство модели MyM!";
  34.         }
  35.  


Видимо про фабрику я нигде не читал, а можно ссылку с примером?
razorg1991 Отправлено: 04 Июня, 2014 - 20:49:52 • Тема: Как правильно обратиться к моделе из контроллера • Форум: Вопросы новичков

Ответов: 55
Просмотров: 1655
Мелкий пишет:
$rModelObject = \model::factory('дай мне модель такую-то');


Вообще не понял Не понял
razorg1991 Отправлено: 04 Июня, 2014 - 19:44:14 • Тема: Как правильно обратиться к моделе из контроллера • Форум: Вопросы новичков

Ответов: 55
Просмотров: 1655
В принципе думаю, что логичнее всего в конструкторе контроллера создавать объект модели и далее работать с ним.
В таком случае мне проще создать базовый контроллер с конструктором и наследовать от него, чтобы в каждом контроллере не вызывать каждый раз конструктор. А в дочернем, к примеру в свойстве, писать имя модели.
Набросав структуру БД на листочке и учитывая правило 1 модель = 1 таблица, пришел к выводу, что в моем случае один контроллер может работать и с 2-мя и даже с 3-мя моделями.
Вот здесь я и стал немного в тупик.
Как мне тогда в базовом классе контроллера описать это?
Создать свойство-массив, а в дочерних указывать в этом свойстве ключ-значение типа объект-модель?
Только не пойму как реализовать это через цикл foreach в конструкторе, точнее как мне тогда ключ массива преобразовать в переменную (имя объекта)?
Или не заморачиваться с этим и делать все свойства и методы моделей статическими?
Как Вы поступаете в данной ситуации, уверен что многим приходилось вызывать по несколько моделей из одного контроллера?
razorg1991 Отправлено: 01 Июня, 2014 - 11:17:04 • Тема: Вопрос по неймспейсам • Форум: Вопросы новичков

Ответов: 5
Просмотров: 256
caballero пишет:
как закодируешь так и разберется
не самый лучший ответ для новичка Растерялся

Мой автозагрузчик выглядит так:

PHP:
скопировать код в буфер обмена
  1.  
  2.         class Autoloader {
  3.         public static function loadControllers ($classname) {
  4.                 if (is_readable(Config::$controller.$classname.'Controller.php')) {
  5.                         require_once Config::$controller.$classname.'Controller.php';
  6.                 }
  7.         }
  8.         public static function loadModels ($classname) {
  9.                 if (is_readable(Config::$model.$classname.'Model.php')) {
  10.                         require_once Config::$model.$classname.'Model.php';
  11.                 }
  12.         }
  13.     }
  14.    
  15.     //регистрация функций автозагрузки
  16.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  17.     spl_autoload_register(array('Autoloader', 'loadModels'));
  18.  


Вот я и не пойму, если у меня будит два одинаковых названия класса (а они скорее всего будут) к примеру One в controllers и models. И вызову я этот самый класс, но мне нужен к примеру тот который модель. Автозагрузчик проверит все дирректории, которые я ему указал (т.е. models и controllers) и загрузит оба файла, или загрузит только тот файл который попадется ему первый и на этом остановится?
Достаточно мне в файлах обоих классов One указать разные пространства, а перед вызовом класса указать use и пространство, чтобы php понял какой класс One мне нужен в данный момент?
razorg1991 Отправлено: 31 Мая, 2014 - 22:43:54 • Тема: Вопрос по неймспейсам • Форум: Вопросы новичков

Ответов: 5
Просмотров: 256
Есть автозагрузчик классов. Точнее их три, реализовано через spl.
Возник вопрос по namespace.
к примеру в каждом файле класса буду писать что-то типа
PHP:
скопировать код в буфер обмена
  1.  
  2. namespace diferent\name\space
  3. class MY {
  4. }
  5.  


Ну и в разных классах ессесно где-то разные, где-то одинаковые неймспейсы.

При вызове класса или создании объекта срабатывает автозагрузчик и подключает файл.
Вот теперь не пойму один момент. К примеру у меня 2 одинаковых класса (названия), но в разных пространствах и при вызове класса или создании объекта я укажу use и то пространство которое мне нужно, то как в этом случае сработает автолоадер? Он найдет 2 класса и подключит оба файла (или один который попадется первым?). Или тут в бой войдет еще и сам php и разберется конкретно какой файл ему использовать?

Можете пояснить?
razorg1991 Отправлено: 29 Мая, 2014 - 08:33:58 • Тема: Использование методов одного класса в другом классе • Форум: Вопросы новичков

Ответов: 9
Просмотров: 520
LIME пишет:
кто тебе сказал?
(Добавление)
у статических членов область видимости везде


Ну да Закатив глазки Это я забыл )))
Кстати еще я забыл, что в свойство одного класса можно записать объект другого класса Радость
Кажись я нашел то что хотел Ха-ха
razorg1991 Отправлено: 27 Мая, 2014 - 22:15:50 • Тема: Использование методов одного класса в другом классе • Форум: Вопросы новичков

Ответов: 9
Просмотров: 520
boatswain пишет:
то почему бы не использовать статические методы?


Дык статические методы одного класса, я ведь тоже не могу использовать в другом классе.
razorg1991 Отправлено: 27 Мая, 2014 - 20:30:32 • Тема: Использование методов одного класса в другом классе • Форум: Вопросы новичков

Ответов: 9
Просмотров: 520
Я вот тут подумал. А что если в каталоге core писать просто функции, которые выполняют общие задачи, т.е. использовать процедурный подход. А далее использовать эти функции уже непосредственно в методах классов.

Только вот как тогда с автолоадером функций быть?
razorg1991 Отправлено: 26 Мая, 2014 - 21:09:11 • Тема: Использование методов одного класса в другом классе • Форум: Вопросы новичков

Ответов: 9
Просмотров: 520
Panoptik пишет:
есть готовые решения


Я вначале вообще хотел использовать yii, начал даже изучать, но потом сделал для себя вывод, что моих знаний еще маловато (много непонятно) да и весь функционал фреймворка мне нужен. Поэтому для лучшего понимания и изучения ООП думаю лучше писать свое, в чем точно разберусь, ну а потом в будущем уже посмотрим, может и Zend осилю Радость

А вообще пока не хочу использовать готовые решения, ни ORM'ы, хочу написать свой велосипед, сейчас для меня будит так понятнее
razorg1991 Отправлено: 26 Мая, 2014 - 20:18:51 • Тема: Использование методов одного класса в другом классе • Форум: Вопросы новичков

Ответов: 9
Просмотров: 520
Может сейчас и ересь написал, изучаю ООП, пытаюсь нацарапать, что-то похожее на CMS Ха-ха по MVC
Нужно решить следующую задачу:

К примеру в контроллере или модели используются часто одни и те же функции (конкретно в моделе выборка из базы, delete, update и т.п.).
Писать в каждой модели данные функции (ок методы Хорошо ) не разумно, по-моему проще их вызывать из другого класса и передать им данные на вход для обработки (ну или как-то по-другому, собственно это и пытаюсь узнать).
Про наследование классов знаю, но это не совсем то что мне нужно в данном случае. В моем случае скорее всего будут по одному базовому классу для контроллеров и моделей соответственно, от которых будут наследоваться все остальные. Описывать в них все общие методы мне бы тоже не хотелось (я понимаю что это снова звучит как ересь, иначе зачем тогда создавать базовые классы, но снова повторюсь суть не в том).
Поясню чего хочу добиться...
Структура моего приложения:
/core
/controllers
/models
/views

В каталоге core будут находиться как раз таки все общие классы с методами и свойствами. Эта папка в последующем при разработке и наполнении станет своего-рода фреймворком (моим), который я в будущем хочу использовать в других проектах.
Остальные папки говорят сами за себя.
Базовый контроллер и базовая модель (т.е. родительские классы) будут как бы уникальными для конкретного проекта, а вот все содержимое core будет неизменно и универсально (возможно иногда дополнятся).

Читал про интерфейсы, но это не то. Что-то похожее __call, но как я понял его можно использовать только после создания объекта, а не в классе.

В общем поделитесь пожалуйста опытом, может кто-то решал подобные задачи или подскажите что-то получше.

Страниц (9): « 1 2 3 4 5 6 [7] 8 9 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB