Автор Тема: [MVC] Основни положения  (Прочетена 12440 пъти)

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #15 -: Dec 11, 2010, 00:41 »
Добре, че си ти да ме просветиш!

Какво според теб е MVP?!? Пак е MVC, но с различна имплементация ...
Спорове за това колко да е тънък/дебел комнтролерът, колко да е активeн/пасивeн изгледът и т.н. винаги ще има ... но пак ще е MVC!

Нещо неясно?

« Последна редакция: Dec 11, 2010, 01:01 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #16 -: Dec 11, 2010, 00:49 »
На мен понякога ми харесва Изгледът да има пълен достъп до Модела ... всичко зависи от случая.
Пример:

Controller
Код
GeSHi (PHP):
  1. class User extends CollectionController
  2. {
  3.    ...
  4.    public function getUsers
  5.    {
  6.        $this->model = new UserCollectionModel();
  7.        $this->view('getUsers', $this->model);
  8.    }
  9. }

View:
Код
GeSHi (PHP):
  1. $model = new GridCollection($this->model);
  2. $users = $model->getAll();
  3. ...
  4. (... DO SOMETHING WITH $users ...)

Изненада:
Код
GeSHi (PHP):
  1. class GridCollection extends DecoratorCollection_Model
  2. {
  3.        public function  __construct($model, $conf = null)
  4.        {
  5.                parent::__construct(new FilteredCollection(new OrderedCollection(new LimitedCollection($model, $conf), $conf), $conf), $conf);
  6.        }
  7. }

Моделът се подавя на Изгледа, който решава какъв декоратор ще му сложи. Все пак странициране, подреждане и т.н. са функции на Изгледа, не на Модела или Контролера... Пример: csv, excel изгледите не се нуждаят от странициране/филтриране(по принцип)/подреждане, докате html/pdf и други такива се нуждаят от някои от тези функции.

Та ... MVP концепцията не би свършила работа в този случай.
« Последна редакция: Dec 11, 2010, 01:12 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

SylaR

  • Участници
  • ***
  • Публикации: 10
    • Профил
Re: [MVC] Основни положения
« Отговор #17 -: Dec 16, 2010, 13:24 »
Здравейте,  имам проблем отностно локигата на MVC.Значи проверявам да ли потребителя е логнат и след това ме интересува във контролера ли да проверявам това или във view-то, т.е ако е логнат да ми се показва view-то с профила примерно а ако не е отново формата.

Код
GeSHi (PHP):
  1. if($this->session->userdata( ' is_logged_in ' )){
  2.      $this->load->view( ' profile ' );
  3.  }
  4.  else{
  5.      $this->load->view( ' login_view ' );
  6.  }

И ако го правя в контролера после във всеки метод на този контролер ли трябва
отново да проверявам? Моля за съвет нов съм в МVC и ползвам Codeigniter
« Последна редакция: Dec 16, 2010, 13:35 от VladSun »
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #18 -: Dec 16, 2010, 13:35 »
Аз бих създал клас наследник на Controller, който проверява дали потребителя е логнат или не (в конструктора).
След това всички контролери освен контролерът за login са наследници на този контролер и викат parent::__construct().

Може да разгледаш и това: http://www.linux-bg.org/forum/index.php?topic=38926.0
« Последна редакция: Dec 16, 2010, 15:00 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

ivo3d

  • Напреднали
  • *****
  • Публикации: 161
  • Distribution: Mint Linux
  • Window Manager: Gnome
    • Профил
Re: [MVC] Основни положения
« Отговор #19 -: Dec 16, 2010, 17:50 »
Брех пичове много хубаво си хортувате тук, ама май забравяте нещо. А? А това дето забравяте е, че сте изостанали с 10 години. Поне. Казвам поне да не Ви обидя. За MVP да сте чували? Не не го измислил М$, а IBM и Aplle го ползва в своя Smalltalk даже. А там ясно си е казано- вюто няма никаква работа с модела. Да така се спестява код, ама това си е процедурно писане в обекти, а не нещо ползваемо. Така, че никаква работа на вюто и точка. И какви са тия песни вюто да определя де, какво да се вижда. Това си е работа на контролера. Всички глави го казват. Вюто (изгледа) единствено и само представя данни, нищо друго. Изобщо скучна работа- няколко цикли вместени в html на дизайнерчето. Кой, какво и кога има право да вижда си е работа само на контролера и никой друг. Той определя и какво да даде на модела и какво от него и къде да даде на изгледа. А пък модела от своя страна си сверява и валидира там, каквото са му подали, обработва и връща. Ей толкова е просто, ама тук яко мешате спатийте и правите глупости.

Предвид, че apple ти казват и как имаш право да си държиш телефона, мисля, че щом са намесени в нещо е по-добре да не употребяваме думата "права". Освен това, нещо много си се объркал с броя на годините. А и всички известни рамки позволяват използването на модела в изгледа, което освен това е напълно логично.

Не мога да разбера какъв е точно проблемът - моделът предоставя информация, какъв е смисълът да копираш една информация в контролера и после да я пускаш на парчета (ами ако ми трябват 20 масива в една страница?) на изгледа, като можеш да му пратиш директно инстанцията на модела и във view-то да взимаш каквото ти трябва. Хем се спестява писане, хем бързодействие, хем памет. Няма никаква логика, освен начесване на OOP краста, да пишеш повече и да тормозиш сървъра. Рамката и без това достатъчно се грижи за влаченето на приложенията, поне нека я използваме за това, за което е предназначена - писане на по-малко код. Вярно, че няма смисъл да правиш нещо повече с модела от взимане на информация от него, ама все си мисля, че никой не би и тръгнал да прави друго, в противен случай очевидно работиш с идиоти.
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #20 -: Dec 16, 2010, 18:01 »
Има логика в това да се използва пасивен Изглед - използваемост на кода на Изгледа. По този начин Изгледа се "развързва" от Модела и може да се използва с други модели.
Но това е въпрос на лично предпочитание. Повечето от хората, които познавам ползват "чисто" MVC, а не MVP. Има и такив, които ползват MVP.

За мен Изгледът ще си остане винаги само "Декоратор" на Модела.

Неща от типа:

Код
GeSHi (PHP):
  1. class Controller
  2. {
  3.   function action()
  4.   {
  5.       $this->model->action();
  6.       $this->view->load('action', new View_Action_Array_Adapter($this->model));
  7.   }
  8. }

не ми харесват.
« Последна редакция: Dec 16, 2010, 18:07 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

ivo3d

  • Напреднали
  • *****
  • Публикации: 161
  • Distribution: Mint Linux
  • Window Manager: Gnome
    • Профил
Re: [MVC] Основни положения
« Отговор #21 -: Dec 17, 2010, 08:21 »
Имаш предвид да се използва един изглед за различни модели ли? То това са редки случаи, освен това, когато моделът в изгледа се казва например $model, стига интерфейсът да е един и същ, винаги можеш да подаваш различни модели... Освен ако не съм те разбрал правилно, както се случва обикновено при часовете, които започват с "0" :)
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #22 -: Dec 17, 2010, 12:34 »
Имаш предвид да се използва един изглед за различни модели ли? То това са редки случаи, освен това, когато моделът в изгледа се казва например $model, стига интерфейсът да е един и същ, винаги можеш да подаваш различни модели... Освен ако не съм те разбрал правилно, както се случва обикновено при часовете, които започват с "0" :)
Да, това имам предвид. Интерфейсът се "уеднаквява" чрез използването на Адаптери, както съм показал по-горе. Случаите наистина са рядкост (поне при мен). Макар че, като се замисля, винаги може да се използва Адаптер за самия Модел и пак да се "развърже" Изгледа от Модела - т.е. да се програмира по интерфейс.

Другото, което не ми харесва в MVP е, че трябва да се "пъхне" (push) информацията в Изгледа, а не той да си я "поиска" (pull) сам от Модела.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

ivo3d

  • Напреднали
  • *****
  • Публикации: 161
  • Distribution: Mint Linux
  • Window Manager: Gnome
    • Профил
Re: [MVC] Основни положения
« Отговор #23 -: Dec 17, 2010, 13:11 »
Другото, което не ми харесва в MVP е, че трябва да се "пъхне" (push) информацията в Изгледа, а не той да си я "поиска" (pull) сам от Модела.

Точно, аз затова говорех в по-предишния пост. Де факто информацията се копира (имаш я един път в контролера и един път в изгледа), пишеш два пъти повече, щото един път трябва да извадиш информацията в контролера и после да я използваш в изгледа, вместо директно да я поискаш от модела в изгледа.

Макар че има едно изключение, при което и в MVC трябва да пишеш повече - ако в изгледа използваш една информация няколко пъти, модела ти трябва да кешира информацията, в противен случай изпълняваш една заявка същия брой пъти. Но това също не се случва чак толкова често, така, че пак плюсът е за MVC.
Активен

ivo3d

  • Напреднали
  • *****
  • Публикации: 161
  • Distribution: Mint Linux
  • Window Manager: Gnome
    • Профил
Re: [MVC] Основни положения
« Отговор #24 -: Dec 17, 2010, 13:22 »
А, и още нещо, което пропуснах, нищо, че е малко offtopic:

ghoof, преди да се изкаваш компетенто, моля промени си малко стила на писане и понамали малко заяжданията. Тази тема е създадена за да коментираме MVC (както може би си забелязал в заглавието) и по-специално теоретичната част, а не кой използвал архаични технологии, колко сме били изостанали и бабената ти трънкена. Като си толкова добре запознат с MVP, пускаш една тема в раздела, в която разасняваш какво представлява, плюсовете спрямо MVC и т.н., а не да нападаш в типично тийнеджърски стил "аз съм мноооо голям, а вие сте смешни".

- Иво
Активен

SylaR

  • Участници
  • ***
  • Публикации: 10
    • Профил
Re: [MVC] Основни положения
« Отговор #25 -: Dec 17, 2010, 15:01 »
Аз бих създал клас наследник на Controller, който проверява дали потребителя е логнат или не (в конструктора).
След това всички контролери освен контролерът за login са наследници на този контролер и викат parent::__construct().

Може да разгледаш и това: http://www.linux-bg.org/forum/index.php?topic=38926.0


По принцип правилно ли съм се насочил към CI ? Когато избирах с какво да почна като + се изтъква много пълната документация  също че бил бърз лек и тн...
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #26 -: Dec 17, 2010, 15:26 »
В момента аз съм изоставил CI и ползвам Zend Framework.
CI ми хареса в началото и доста пописах с него. Така че, когато се появи въпрос за CI все още имам ресурс да помагам :)
CI се научава сравнително лесно според мен, което е друг голям плюс. Попиши малко с него и сам ще решиш дали ти харесва или не. Рано или късно ще минеш на нещо друго :)
« Последна редакция: Dec 17, 2010, 15:29 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

ivo3d

  • Напреднали
  • *****
  • Публикации: 161
  • Distribution: Mint Linux
  • Window Manager: Gnome
    • Профил
Re: [MVC] Основни положения
« Отговор #27 -: Dec 17, 2010, 15:39 »
Като за начало е добре, та даже и за постоянно ползване. Там не ми харесва че все още не е изцяло OOP, и повечето неща са направени съвместими с php4. Но пък има страхотна документация и бързо ще навлезеш.

Аз ползвам Yii, там всичко е много подредено и стриктно, обаче документацията им е малко китайска работа. Ама се развива все пак. Все пак можеш да го разгледаш, имат и книжка. Аз примерно за 2 дни направих генератор за административни панели за по-прости сайтове и само проектирам базата данни и после пипам тук там по кода ако има нещо специфично. И сега една безумно досадна работа, като писането на форми, се извършва напълно автоматично.

VladSun, евала ти правя, аз с тоя хипопотам не можах да се оправя. Прекалено тромав ми е, а и това едно нещо да можеш да го направиш по 10000 начина нещо не ми се понрави. Въпрос на вкус де, а и може би си по-напред в материала.
Активен

SylaR

  • Участници
  • ***
  • Публикации: 10
    • Профил
Re: [MVC] Основни положения
« Отговор #28 -: Dec 20, 2010, 12:39 »
Здравейте правя http://www.ifadey.com/2010/06/crud-using-jquery-and-codeigniter/ това обаче имам питана относно json защо в урока използва echo не е ли грешно или идва от това че се ползва и jquery tpl ?
Код
GeSHi (PHP):
  1. public function read() {
  2. echo json_encode( $this->mUsers->getAll() );
  3. }


и това е във view-то
Код
GeSHi (HTML):
  1. <script type="text/template" id="readTemplate">
  2.        <tr>
  3.            <td>${id}</td>
  4.            <td>${name}</td>
  5.            <td>${email}</td>
  6.        </tr>
  7.    </script>


Извинявам се, ако линка е в разрез с правилата просто за по-удоно
« Последна редакция: Dec 20, 2010, 13:47 от VladSun »
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: [MVC] Основни положения
« Отговор #29 -: Dec 20, 2010, 13:51 »
Правилно си забелязал, че е грешно :)
Би трябвало да е поне:


Код
GeSHi (PHP):
  1. class Home extends Controller {
  2.  
  3. public function __construct() {
  4. parent::__construct();
  5. $this->load->model( 'mUsers' );
  6. }
  7.  
  8. public function index()
  9. {
  10. $this->load->view( 'home' );
  11. }
  12.  
  13. public function read() {
  14. $this->load->view('json', array('data' =>$this->mUsers->getAll()));
  15. }
  16. }

/views/json.php
Код
GeSHi (PHP):
  1. echo json_encode( $data );

Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P