Создание Модели

Доброго времени суток!

Я понимаю, что задам сейчас довольно глупый вопрос, но выбора у меня не осталось :(

Подскажите пожалуйста, как правильно создавать модель в Yii?

Мне сейчас всего лишь нужны простейшие операции типа: Добавить запись в БД, редактировать запись, удалить запись.

Читал мануал - не понимаю ничего. Искал на сторонних ресурсах - понимание не пришло.

Есть понимание того, что имееются методы типа "save()" и тд. для работы с БД. Но я не могу понять как это в Yii организуется в модели.

На чистом PHP у меня проблем не вызывает создание подобного функционала, а тут что-то ничего не могу понять.

Прошу помощи :unsure:

Заранее благодарю!

Настройте себе Gii и генерируйте с его помощью модель. И если надо, CRUD-контроллер.

Модель в большинстве случаев и есть ActiveRecord

Я понимаю, что можно воспользоваться генератором моделей, контроллеров и тд. Но хочется самому понять, как это пишется в Yii.

Во всех примерах я видел, что в модели только обязательный код идёт:




class имя_модели extends CActiveRecord

{        

  

    public static function model($className=__CLASS__)

    {

        return parent::model($className);

    }

    

    public function tableName()

    {

        return 'имя_таблицы_в_БД'; 

    }



и функция правил валидации формы. А вызов методов типа "save()" и тд происходит уже в контроллере. Плюс ко всему в примерах видел, что в контроллере после создания объекта модели свойствам модели задают значения. Вот только объявления этих свойств в классе модели я не нашел.

Вот и вошел в ступор… :(

Вот сгенерируйте и изучайте.

У вашей модели есть родительский класс, который обеспечивает кучу функционала. Типы столбцов и их тип, к примеру, беруться из базы. При массовом присваивании в контроллере ($model->attributes= $_POST[‘myForm’]) присваиваются только те атрибуты, для которых заданы правила в моделе ( rules() ) и все это описано в учебнике.

Если вы знакомы с основами ООП то разобраться в данном коде несложно.

Ваша модель унаследует класс CActiveRecord , который в свою очередь является подклассом класса CModel. Собственно вы можете использовать методы родительских классов с помощью указателя ->.

Если же вам интересно как описаны эти методы обратитесь к API. http://www.yiiframework.com/doc/api/1.1/CModel.

Атрибуты это по сути поля вашей таблицы. Например можно задать label для атрибутов (attributeLabels()), можно задать соотношения между таблицами (relation()) ну и много еще чего.

save() кстати вызывает beforesave()->validation()->input()->aftersave().

Если это именно интересно посмотрите исходники фреймворка. И еще одна рекомендация - установите редактор который умеет индексировать фреймворки (phpstorm,netbeans), это спасает очень часто от лазания по api.

Дело в том, что, читая мануал, я смог разобраться с тем как реализовать внешний вывод разных разделов сайта. Т.е. внешний вид и формы (правда, формы пока написаны на чистом HTML, но это я поправлю) для ввода у мне готовы. Ступор наступил, когда начал пытаться вникнуть, как теперь реализовать запись в БД, удаление и прочие простейшие манипуляции с данными. Все свои контроллеры и виды с формами писал сам, без участия генератора, по мануалу. А вот теперь, когда надо работать с БД, у меня и настал сей ступор.

Так же, “непонятка” выросла в том, что в Yii обычно каждая страница - это отдельный набор MVC-файлов. А я себе в раздале работы со справочниками сделал один контроллер на несколько вьюшек. И вьюшки эти пеняются припомощи AJAX-запроса, который благодаря Вам у меня таки заработал (за него отдельный Вам поклон :) ).

Итого, сейчас у меня получается один контроллер и несколько вьюшек. Контроллер содержит в себе actionIndex, внутри которого стоит switch, по которому выбирается вьюшка требуемая AJAX-запросом.

Вот и не могу пока понять, можно ли делать так как я сделал или я себе грабли подкинул с привязанным к рукоятке топором :unsure:

Короче дается понимание Yii мне пока довольно тяжело. Сейчас прибегнул к самому жесткому методу обучения - видео-урок. Немного света в мою тьму понимания проливается, но маловато.

Если найдется хоть какая-то ссылочка на материал, в котором “по косточкам” разбирается реализация задач типа, записать в БД, считать, изменить, удалить, буду крайне признателен, бо изучение по мануалу Yii мне пока никак не даётся :(

Применение swich’ей где бы то ни было не очень хорошо, но затрудняюсь объяснить почему. Код не очень читаемый, принцип единой ответственности нарушается, это из того, что могу вспомнить. Если разбить одно действие с свичем на несколько разных действий, то вы чего-то теряете? Но зато приобретаете более “худые” действия.

Лучше уроков мне помогло в свое время изучение CRUD-контроллера генерируемого с помощью Gii, о котором упоминал выше. Умными людьми ведь сделано. Посмотрите как происходит создание записи, её изменение, удаление. Обратите внимание на то, что создание и редактирование используют общий партиал "_form.php", на то что для фильтрации используется объект DBCriteria который настраивается в моделе в методе search().

А потом скопируйте стандартный генератор и внесите изменения, которые вам нужны. Например я убрал actionShow, партиал _filter и почистил коментарии в коде.

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

Если хотите поговорить по "идеологии" контроллеров, то можете стукнуть в мой скайп. Может оказаться продуктивнее переписки.

Собственно товарищ Charger прав.

  1. Потратьте 1 день, сделайте с помощью gii 1 связку CRUD. Очень грамотно все описано и закоментировано. Разберитесь как это реализовано - попробуйте сделать тоже самое. Далее проблем быть недолжно. Если непоможет - берите книгу или создавайте демо блог. Вот заодно и посмотрите как правильно реализовывать формы. Поверьте стандартными методами yii намного проще и быстрее. Также там довольно прилично реализована простейшая работа с базой.

  2. Каждая страница это не отдельный набор MVC-файлов. Здесь вы заблуждаетесь. Тут существуют теории тонких моделей и тонких контроллеров и наоборот соответственно. Я предпочитаю работу с данными оставлять в модели (валидации, геттеры, фильтры и т.п.), а логику выносить в контроллер. Страница по сути action в контроллере(логика) и отрендериный view.

  3. Можна делать как угодно, но не факт что это верно. У моего коллеги например 1 контроллер на весь сайт размером в 20 тыс. строк. При этом он этим гордится и не принимает довод что это очень плохо. Если вам нужно организовать так называемый сайт одностраничник (сайт без переходов где меняется только контент), то этот вариант вам подходит. По сути у вас будет не 1 actionIndex, это называется точкой входа. Здесь вы в зависимости от действий пользователя выводите ему контент, с помощью ajax запросов. Ajax запрос обращается к URL (в этом случае рекомендую организовать свой AJAX-контроллер, так будет намного удобнее http://rmcreative.ru/blog/post/ajax-v-yii). Вы выдаете нужный контент без перехода меняете его. В этом случае вы уходите дальше от php к javascript/ajax технологиям. Работа с базой в этом варианте аналогична стандартной (возможно добавится 1 -2 проверки), но надо будет переписывать search() скорее всего.

Насчет топора - он тут есть, и вы скоро об этом узнаете если выводите контент с ajax запросов. Двойная подгрузка java-скриптов доставит массу удовольствия, но довольно легко обходится. Самое страшное jquery плагины. Для них надо будет инициализировать обьекты вручную, так как большинство делает это при document.ready() (а у нас нету перезагрузки страниц).

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

P.S. switch - более читаем и логичен нежели куча if - elseif, ? . Но это лично мои предпочтения и навязывать их небуду. Также если хотите можете добавится в скайп (ineersa). Я собственно начал работать с yii и php 4 месяца назад , и вначале было очень тяжело. До этого занимался версткой и немного android.

Собственно тут довольно внятно описано для начала CRUD связка по пунктам и что она делает. http://www.yiiframework.com/doc/guide/1.1/ru/form.model