Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
Итак, наш контроллер выполняет только две задачи: создание и изменение. Однако у нас есть кнопки также для сохранения, удаления записей, и отмены. Нужно написать соответствующий код для выполнения этих задач.
Следующим шагом логично будет реализовать сохранение записи. Это потребует использование выбора для обработки различных ситуаций, например, различия между созданием новой записи (запрос INSERT), и обновлением существующей записи (запрос UPDATE). Также существует несколько нюансов, связанных с получением данных из формы и помещения их в запрос.
Фреймворк Joomla! облегчает выполнение многих задач. Класс JTable упрощает управление записями в базе данных без необходимости заботится о написании SQL-кода, лежащего в основе этих операций. Он также облегчает перенос данных из HTML-форм в базу данных.
Класс JTable является абстрактным классом, от которого можно получить производные классы для работы с конкретными таблицами. Для его использования нужно просто создать класс, расширяющий класс JTable, добавить поля вашей базы данных как свойства, и переназначить конструктор для указания имени таблицы и первичного ключа.
Вот как выглядит наш класс JTable:
Как видите, здесь мы определили два поля: идентификатор и приветствие. Затем был определен конструктор, вызывающий конструктор родительского класса и передающий ему имя таблицы (#__hello), имя поля, являющегося первичным ключом (id), и объект коннектора базы данных.
Этот файл следует назвать hello.php и поместить в каталог tables в администраторском разделе нашего компонента.
Теперь мы готовы добавить метод в модель для сохранения записи. Назовем этот метод store. Метод store() будет выполнять три вещи: помещать данные из формы в объект TableHello, проверять корректность сформированной записи и сохранять запись в базе данных.
Метод будет выглядеть так:
Этот метод добавляется в модель hello.
Метод получает один параметр, являющийся ассоциативным массивом данных, которые мы сохраняем в базу данных. Эти данные могут быть легко получены из запроса, как будет показано далее.
Первая строка получает ссылку на объект JTable. Если таблица названа правильно, мы можем не указывать это имя - класс JModel знает, где его искать. Как вы помните, мы назвали наш класс таблицы TableHello и поместили его в файл hello.php в каталоге tables. Если вы следовали этим рекомендациям, класс JModel создаст объект автоматически.
Вторая строка получает данные из формы. Класс JRequest делает эту операцию очень легкой. В данном случае мы получаем все переменные, переданные с помощью метода POST. Они возвращаются в виде ассоциативного массива.
Остальное просто - мы получаем, проверяем и сохраняем. Метод bind() копирует значения из массива в соответствующие свойства объекта таблицы. В данном случае он копирует значения идентификатора и приветствия в объект TableHello.
Метод check() выполняет проверку данных. В классе JTable() этот метод просто возвращает true. Пока он не представляет какого-либо значения, но в будущем он позволит проверять данные с помощью класса TableHello. Этот метод может быть переназначен в классе TableHello методом, выполняющим необходимые проверки.
Метод store() будет помещать данные из объекта в базу данных. Если id равно нулю, будет создана новая запись (INSERT), в противном случае он обновит существующую запись (UPDATE).
Теперь все готово для добавления задачи в контроллер. Поскольку задача называется save, мы должны назвать метод "save". Это просто:
Все, что нам нужно - вызвать метод store() модели. Затем следует использовать метод setRedirect() для перенаправления к списку приветствий. Также мы задаем сообщение, которое будет отображено вверху страницы.
В модели мы получаем список ID для удаления и вызываем класс JTable для их удаления:
Мы вызываем метод JRequest::getVar() для получения данных из запроса, затем вызываем метод delete() для удаления каждой строки. Сохраняя ошибки в модели, мы обеспечиваем возможность получить их позже, если потребуется.
Это очень похоже на метод save(), выполняющий сохранение:
Все, что нужно для прерывания операции редактирования - перенаправление на главное представление:
Мы реализовали простой механизм для нашего компонента. Теперь у нас есть возможность редактировать элементы, отображаемые в представлении. Мы продемонстрировали взаимодействие между моделями, представлениями и контроллерами. Также мы показали, как класс JTable можно расширить для предоставления простого доступа к таблицам в базе данных. Также можно увидеть использование класса JToolBarHelper для создание панелей кнопок в компоненте для предоставления стандартного вида для различных компонентов.
Можно ли редактировать уже готовые компоненты? К примеру добавить или удалить поля в админке, ну и соответственно при выводе на экран.
Да, без проблем, а что вам мешает?)
Незнание. Подскажите как добавить поле (старт.номер к примеру). Добавить поле в таблицу БД, а где еще что прописать?
В данном примере рассматривается добавление только одной записи в базу, а если нужно добавить сразу несколько полей? Подскажите какие файлы и как нужно поменять?
Привет,
я тоже столкнулся с такой проблемой, нуждаюсь в вашей помощи если вы в силах помочь
А почему когда создаешь пункт в меню он не отображается в списке типов пункта меню? Как его создать в меню???
Почему-то не работает кнопка создания новой записи, выкидывает ошибку = Компонент не найден :(
Что я не так сделал?
Забыл поменять скрытое поле в шаблоне
<input type="hidden" name="option" value="com_hello" />
на свое значение, из-за это он не находил необходимого компонента :)
Благодарю за статью, однако стоит отметить что вы забыли про то как вызвать модуль из меню..
ведь вы явно не хотите чтобы начинающие строители модулей для джумлы вставляли в меню ссылки типа... http://test.torrenthot.com/index.php?option=com_hello&view=hello
Сергей, очень актуальный вопрос: как вызвать модуль из меню?
Спасибо
Вот здесь все четко написано:
http://www.goldensites.su/articles-joomla-16/sozdanie-komponenta-joomla-16-chast-3-dobavlyaem-tip-punkta-menyu
А как проще можно сделать, чтоб элементы в админке сразу списком выводились, а не переходить для редактирования по ссылке? У меня что-то не получается.