Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 20 Ответов
  • 3400 Просмотров
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Доброго времени суток.

Столкнулся с тем, что никак не могу найти полноценный пример в Joomla 3.x как создать список множественного выбора.

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


Добавил XML - com_myworks\models\forms\set.xml поле.
Код: xml
        <!--код.....-->
<fieldset name="otherparams">

<!--код.....-->

<field name="tagid" type="worktags" extension="com_myworks"
label="COM_MYWORKS_FIELD_TAG_SET" description="COM_MYWORKS_FIELD_TAG_SET_DECS"
multiple="true"
addfieldpath="/administrator/components/com_myworks/models/fields" />
</fieldset>

Добавил вывод значений из таблицы тегов в com_myworks\models\fields\worktags.php
Код: php
JFormHelper::loadFieldClass('list');

class JFormFieldWorkTags extends JFormFieldList
{
public $type = 'WorkTags';

protected function getOptions()
{
$options = array();

$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('a.id AS value, a.name AS text')
->from('#__mywork_tags AS a');
$query->group('a.id, a.name');

$db->setQuery($query);

try
{
$options = $db->loadObjectList();
}
catch (RuntimeException $e)
{
JError::raiseWarning(500, $e->getMessage);
}

return $options;
}
}

Вопросы:
Как передать эти данные на запись в БД?
Как их обратно вывести из БД в компоненте?
Какого вида в таблице нужно создать поле?
« Последнее редактирование: 30.07.2014, 21:00:48 от ninth »
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
РЕШЕНО!

Ох ты ж... святые кошки... Пошарил по англоязычной части тырнета, сразу ответ нашёл (это с моим плачевным знанием ин. яз. ))))

Д обавляем в com_myworks\tables\set.php
Код: php
	public function bind($array, $ignore = '')
{
if (isset($array['tagid']) && is_array($array['tagid']))
{
$registry = new JRegistry;
$registry->loadArray($array['tagid']);
$array['tagid'] = (string) $registry;
}
  return parent::bind($array, $ignore);
}

Добавляем в модель com_myworks\models\set.php
Код: php
	 */
public function getItem($pk = null)
{
if ($item = parent::getItem($pk))
{
// Convert the metadata field to an array.
$registry = new JRegistry;
$registry->loadString($item->tagid);
$item->tagid = $registry->toArray();
}

return $item;
}


« Последнее редактирование: 07.08.2014, 16:14:51 от ninth »
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Что-то не дописал (((
Не даёт сохранять пустое поле.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Да все у вас правильно написано только условие такое
Код: php
if (isset($array['tagid']) && is_array($array['tagid']))
говорит что если не пустая переменная, или в переменная $array['tagid'] не массив, то нифига не писать )
А у вас приходит пустота )
Попробуйте добавить перед условием
Код: php
$array['tagid'] = '';
if (isset($array['tagid']) && is_array($array['tagid']))
{
$registry = new JRegistry;
$registry->loadArray($array['tagid']);
$array['tagid'] = (string) $registry;
}
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Спасибо большое. На элементарные вещи внимания не обратил, думал опять атрибут какой-то не знаю..
Но так тоже не получается... вообще ничего не пишет в таблицу.

Думаю можно как ниже. По крайне мере это работает вроде.

Код: php
		if (isset($array['tagid']) && !empty($array['tagid']))
{
if (is_array($array['tagid']))
{
$registry = new JRegistry;
$registry->loadArray($array['tagid']);
$array['tagid'] = (string) $registry;
}
}
else
{
$array['tagid'] = "";
}
« Последнее редактирование: 07.08.2014, 21:50:44 от ninth »
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
А ну да тут тоже я затупил..
нет лучше сделать так:
if (isset($array['tagid']) && is_array($array['tagid']))
{
   $registry = new JRegistry;
   $registry->loadArray($array['tagid']);
   $array['tagid'] = (string) $registry;
}else{
      $array['tagid'] = '';
}
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Пробовал сделать как у вас в последнем варианте.
Но тогда в админке поле всё время пустое, не подставляет результат из таблицы, хотя всё в неё записывает.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Пробовал сделать как у вас в последнем варианте.
Но тогда в админке поле всё время пустое, не подставляет результат из таблицы, хотя всё в неё записывает.
Метод bind не влияет на отображение данных, только на сохранение! Это подготовка данных перед записью!
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Не подскажет кто какой функцией записывать данные в таблицу не как JSON - {"#":"#","#":"#"} в одну ячейку, а каждое значение в новую строку? И перезаписывать?
« Последнее редактирование: 11.09.2014, 15:48:09 от ninth »
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Не подскажет кто какой функцией записывать данные в таблицу не как JSON - {"#":"#","#":"#"} в одну ячейку, а каждое значение в новую строку? И перезаписывать?
Ну дык $query->insert или я не верно понял?
http://joomlablog.ru/dokumentatsiya/dlya-razrabotchika/rabota-s-bazoj-dannykh
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
bind() сохраняет в одну таблицу в виде JSON - {"#":"#","#":"#"}...
А мне нужно в другую таблицу сохранить. каждый "#":"#" в отдельную строку.
И при сохранении проверять, если такой "связки item1 = 222 ("item1":"222")" нет, то удалять строку,
добавляя в таблицу только то, что есть в массиве. Но это соответственно только для выбранного одного item1, не трогая другие строки.
Не могу понять где запись в БД происходит, в модели или создавать файлик с JTable в папке tables или писать в существующем в функции bind()

Пойду пока у вас почитаю...
« Последнее редактирование: 12.09.2014, 13:18:25 от ninth »
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Не могу понять где запись в БД происходит, в модели или создавать файлик с JTable в папке tables или писать в существующем в функции bind()
Да, в модели. Можно с помощью таблицы, а можно просто напрямую в таблицу. Мне кажется, что bind() тут вообще не причем.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Причем тут tables или bind
1.  Делаем таблицу на три поля например называем её #__article_fields
item_id | title | value
2. В модели переопределить метод save (а точнее скопировать весь метод save  из класса JModelAdmin (libraries/legacy/model/admin.php) в свой класс
3. После строк
Код: php
// Store the data.
if (!$table->store())
{
$this->setError($table->getError());
return false;
}

Вставить подобный код:
Код: php
//Удаляем старые записи 
$this->getDbo()->getQuery( true )
->delete( '#__article_fields' )
->where( 'item_id=' . $table->id );
$this->getDbo()->setQuery( $query )->execute();
//Вставляем новые записи
$query->clear()
->insert('#__article_fields')
->values($table->id .', ' . $this->getDbo()->q('key1'). ', ' . $this->getDbo()->q('value1'))
->values($table->id .', ' . $this->getDbo()->q('key2'). ', ' . $this->getDbo()->q('value2'))
->values($table->id .', ' . $this->getDbo()->q('key3'). ', ' . $this->getDbo()->q('value3'));
$this->getDbo()->setQuery( $query )->execute();

Это основы программирования, Joomla тут не причем!
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Так можно правильно?
Код: php
if(!empty($table->tagid))
{
// Создаём массив
$arrayIdTags = json_decode($table->tagid, true);
// Получаем объект коннектора базы данных
$db = JFactory::getDbo();
// Получаем объект запроса
$query = $db->getQuery(true);
// Колонки для вставки
$columns = array(
   'tagid',
   'wrid'
);
// Удаляем все записи связанные с этим id
$query->delete( '#__mywork_tags_map' );
$query->where( 'wrid=' . (int)$table->id );
// Устанавливаем и выполняем запрос
$db->setQuery($query)->execute();
// Составляем запрос
$query->insert($db->quoteName('#__mywork_tags_map'));
$query->columns($db->quoteName($columns));
// Записываем необходимое количество сторок
for ($i=0; $i<count($arrayIdTags); $i++)
{
// Значения для вставки
$values = array(
    $arrayIdTags[$i],
    $table->id
);
// Запись строки
$query->values(implode(',', $values));
}
// Устанавливаем и выполняем запрос
$db->setQuery($query)->execute();
}

скопировал
2. В модели переопределить метод save (а точнее скопировать весь метод save  из класса JModelAdmin (libraries/legacy/model/admin.php) в свой класс
немного не понял зачем всё копировать?
« Последнее редактирование: 15.09.2014, 12:06:25 от ninth »
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
что бы использовать встроенный метод сохранения данных!
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
$arrayIdTags[$i], вот эта запись бесполезна (((... нужен Id тега.
Как в значение value Его прописать - ->select('a.id AS value, a.name AS text')?
......................

А нет, сори вру )))
У меня их просто мало, они по порядку шли как 1,2,3,4... подумал что это индексы масива

..................

Задача решена, можно закрывать тему. Если нет нареканий.
« Последнее редактирование: 12.09.2014, 23:37:33 от ninth »
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Заимейте привычку фильтровать -  (int) $table->id
Сори. Исправил.
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

lesh1j

  • Захожу иногда
  • 257
  • 35 / 0
Метод bind не влияет на отображение данных, только на сохранение! Это подготовка данных перед записью!
Кстати, на самом деле, если в методе bind пишу
Код: php
if ( isset( $array['catid'] ) && is_array( $array['catid'] ) )
{
$registry = new JRegistry;
$registry->loadArray( $array['catid'] );
$array['catid'] = (string) $registry;
}
то работает, но не сохраняет пустое значение(но это понятно - проверка на существование)
а вот если добавляю
Код: php
else{
$array['catid'] = '';
}
то сохраняет в БД всё нормально, но в админке ничего не выводится, else убираю - в админке выводится

Честно говоря, пока слабо понимаю, в чём прикол, сделал проверку вот так, всё работет
Код: php
if (isset( $array['catid']) && is_array($array['catid']))
{
$registry = new JRegistry;
$registry->loadArray( $array['catid'] );
$array['catid'] = (string) $registry;

}elseif(is_null($array['catid']))
{
$array['catid'] = '';
}
« Последнее редактирование: 11.11.2014, 14:13:19 от lesh1j »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Создание релиза компонента средствами GitHub

Автор SkyAn

Ответов: 4
Просмотров: 725
Последний ответ 01.11.2019, 17:42:04
от Septdir
Вывод отладочной информации системного плагина

Автор effrit

Ответов: 23
Просмотров: 1023
Последний ответ 02.10.2018, 10:24:46
от effrit
Два запроса к базе данных за раз можно делать?

Автор borro

Ответов: 4
Просмотров: 1139
Последний ответ 17.10.2017, 09:30:44
от SeBun
Стоит ли создавать отдельный запрос к базе данных?

Автор borro

Ответов: 4
Просмотров: 923
Последний ответ 10.07.2017, 13:03:03
от b2z
Вывод данных из MySQL на сайт

Автор Frics

Ответов: 5
Просмотров: 2612
Последний ответ 20.06.2017, 13:21:49
от Septdir