Вставить значение БД в поле формы
Вопрос: Как вставить значения из таблицы базы данных (#__mytable) в текстовые поля формы (motitle
и modescription
), которые были отображены из XML файла на платформе Joomla 3.0?
-
Я пытался в течение нескольких дней решить эту "легкую" Joomla! на основе недокументированной задачи. Я следовал за Joomla! руководство по разработке MVC, прочитайте большую часть своей устаревшей документации и com_content
компонент com_content
но до сих пор не знаете, как заполнить мои поля.
Я играл с $this->form->bind($this->item);
,
Ниже я включил некоторые из моего кода, чтобы показать структуру, которую я использую. Пожалуйста, не стесняйтесь указывать на любые проблемы, которые вы видите на этом пути.
Модели\Forms\item.xml
<?xml version="1.0" encoding="UTF-8"?>
<form>
<fields name="groupOPTIONS">
<fieldset name="Options">
<field
type="text"
name="motitle"
id="motitle"
label="Title"
description="MY TEXT FIELD DESCRIPTION"
maxLength="255" />
<field
type="textarea"
name="modescription"
id="modescription"
label="Description"
description="MY TEXT FIELD DESCRIPTION"
rows="15"
cols="5"
maxLength="255" />
</fieldset>
</fields>
</form>
Модели\item.php
jimport('joomla.application.component.modelitem');
class MagicObjectsModelItem extends JModelForm {
public function getForm($data = array(), $loadData = true) {
// Get the form 'items'
$form = $this->loadForm('com_magicobjects.item', 'item',
array('control' => 'jform', 'load_data' => $loadData));
if (empty($form)) {
return false;
}
return $form;
}
protected function loadFormData() {
// Check the session for previously entered form data.
$data = JFactory::getApplication()->getUserState('com_magicobjects.item.edit.data', array());
if (empty($data)) {
$data = $this->getDBItem(1);
}
return $data;
}
public function getDBItem($pk) {
//Obtain JDatabase static connection
$oDb = JFactory::getDbo();
$oQuery = $oDb->getQuery(true);
$sValueToMatch = $pk;
$oQuery
->select(array('mid', 'name', 'keyword', 'description'))
->from('#__mytable')
->where('mid = "' . $sValueToMatch . '"')
->order('mid ASC');
$oDb->setQuery($oQuery);
return $oDb->loadObjectList();
}
просмотров\элемент\view.html.php
jimport('joomla.application.component.view');
function display($tpl = null) {
// Initialise variables.
$this->form = $this->get('Form');
$this->item = $this->get('Item');
//Display the view
parent::display($tpl);
}
Просмотров\элемент\TMPL\default.php
foreach ($this->form->getFieldset('Options') as $field) {
echo $field->label;
echo $field->input;
}
Выполняя функцию print_r(), я вижу, что у меня есть данные, но мне нужно вставить данные в показанные поля.
В случае, если это все еще проблема, поскольку определение формы определяет группу <fields/>
.
Это означает, что поля формы будут выводиться следующим образом:
input type="text" name="[groupOPTIONS][motitle]"
на основе приведенного выше примера. Если вы удалите группировку полей, это, вероятно, будет работать. Это раздражает, хотя определенные методы JForm работают только с группами...
Вероятно, вам нужно будет изменить способ передачи данных в форму, если вы хотите сохранить группировку полей (например, путем перегрузки getItem).
Надеюсь, это имеет смысл...
В Joomla 3 метод JForm::bind()
видимому, принимает как объект, так и ассоциативный массив в качестве параметра. Все поля объекта/массива затем сохраняются в защищенном JRegistry
данных типа JForm::$data
называемом JForm::$data
.
Когда вы пытаетесь отобразить поле формы (вызывая JForm::getInput()
), стек вызовов выглядит следующим образом
JForm::getInput() -> JForm::getField() -> JForm::loadField() -> JForm::getValue()
JForm::getValue()
возвращает значение из члена данных (вышеупомянутого JRegistry
) JForm::$data
. Метод JForm::loadField()
также передает значение по умолчанию (определенное формой) JForm::getValue()
в случае, если значение в переменной JForm::$data
не существует.
С точки зрения выполнения этого внутри модели вам может понадобиться генерировать массив объектов или элементов из запроса или таблицы базы данных (чтобы имена полей соответствовали именам полей, определенным в форме xml), а затем передайте их в JForm::bind()
в качестве параметра. Однако, если вы используете JModelForm
, я думаю, вы должны переопределить JModelForm::loadFormData()
чтобы передать объект/ассоциативный массив в загруженную форму.
См.: libraries/joomla/form/form.php
Надеюсь, это поможет :)
Я нашел эту статью: http://docs.joomla.org/Adding_custom_fields_to_the_article_component
однако, я не уверен, насколько он обновлен. он ссылается на J! 2.5, и нам обоим нужно J! 3
Вместо $oDb->loadObjectList();
использовать $oDb->loadAssoc();
в вашей функции getDBItem()
.
Проверьте это - http://docs.joomla.org/Accessing_the_database_using_JDatabase/1.5
Проверьте это также - joomla loadformdata
Надеюсь, это сработает.