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

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Доброго времени суток. Не давно я написал свой первый компонент (есесн по урокам из сети) для Joomla 3.0. Суть компонента проста - есть таблица в БД куда пишутся заказы пользователей на грузоперевозки.

В админке админ  может тот или иной заказ отредактировать или удалить или же создать новый. Компонент в принципе примитивен - работает с одной таблицей бд. Но не давно потребовалось сделать так - что бы при редактирования или создании новой записи в админке в поле ИМЯ было не просто текстовое поле -  а выпадающий список всех пользователей, которые зарегистрированы на сайте.

Вот теперь парюсь и не знаю как это реализовать - умом понимаю что для этого нужно прописать новое обращение к таблице users в модуле, нужно в контроллере написать код который будет обрабатывать данные для вьюхи и в XML rt с формой вывести список - но трабла в том, что из-за не совершенства знаний самого фреймворка Joomla не могу точно понять что и куда писать.

Подскажите плз как научить компонент тянуть данные из другой таблицы БД )
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Код: php
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('id', 'username')));
$query->from($db->quoteName('#__users'));
$db->setQuery($query);
$users = $db->loadAssocList();
var_dump($users);
Имя таблицы и поля выборки написал отбалды.
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Код: php
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('id', 'username')));
$query->from($db->quoteName('#__users'));
$db->setQuery($query);
$users = $db->loadAssocList();
var_dump($users);
Имя таблицы и поля выборки написал отбалды.
Код: php
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('id', 'username')));
$query->from($db->quoteName('#__users'));
$db->setQuery($query);
$users = $db->loadAssocList();
var_dump($users);
Имя таблицы и поля выборки написал отбалды.

это у нас получается просто выведет список ид пользователей если я не ошибаюсь ?
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Неужели никто не знает ? Как мне привязать к xmk с формами результат выборки пользователей из бд в форме ?
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Создаете кастомный типа поля в котором на основе выборки имен пользователей и их ид как выше показали формируете HTML select. Прописывате в вашей xml-ке путь к папке с этим полем.
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Создаете кастомный типа поля в котором на основе выборки имен пользователей и их ид как выше показали формируете HTML select. Прописывате в вашей xml-ке путь к этому полю. Все просто.

 простите а можно чуть подробнее. У меня в XML ка с формами путь нигде не указан - список полей в форме edit.php выведен в цикле


Код
  <?php foreach($this->form->getFieldset() as $field): ?>
  <?php if (!$field->hidden): ?>
  <?php echo '<b>'.$field->label.'</b>'; ?>
  <?php endif; ?>
  <?php echo $field->input; ?>
  <?php endforeach; ?>

если я создам в XML rt форму, то мне получается нужно как то в форму передать данные - и вот как раз в этом моменте я, простите за выражение, туплю по жесткому (
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
простите но все равно не все пронял. Вот смотрите - исходя из доков  мне нужно сделать по сути мульти запрос к бд - что бы данные выбирались из таблицы заказами + таблицы с пользователями

делаю
было

Код
   $query->select($db->quoteName('b.username'));
$query->leftJoin(
    $db->quoteName('#__users', 'b')
    . ' ON '
    . $db->quoteName('b.id')
    . ' = ' . $db->quoteName('a.created_by')
);

стало
Код
$query->select('a.*');
$query->from($db->quoteName('zdj5e_zakaz', 'a'));
// Присоединяем #__users
$query->select($db->quoteName('b.username'));
$query->leftJoin(
    $db->quoteName('zdj5e_users', 'b')
    . ' ON '
    . $db->quoteName('b.id')
   
);

запрос сам по себе рабочий. Его я провожу в файле administration/components/com_mycomponent/models/fields/mycomponent.php

На сколько я понимаю именно этот файл выводит данные для формы редактирования или создания материала - но теперь вопрос как мне в XML отдать данные ? Где находится этот переходный момент ?  :( >:(
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
В xml-ке добавляете поле с  вашем типом, в котором выборка значений и генерация селектов. Добавляете также addfieldPath в xml-ке который будет указывать на папку с этим типом. По ссылке все подробно расписано, что где добавить в xml-ке и как создавать файлик с вашем типом поля, что вам непонятно то? Ну если вам так сложно напишите нужный вам селект прямо в вашем коде и не морочтесь с XML
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
английский не понятен :)
На сколько я понимаю вы советуете  путь создания нового класса для поля - но я то делаю через тот класс который уже есть, что бы минимизировать работу (и багов не создавать :) ).
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Это вообще нормальная практика, что вы имеете ввиду под багами я незнаю. Не знаете английского, погуглите тоже самое на русском, думаю что материалов на эту тему немало, расписывать все это на форуме не вижу смысла.
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
вы поймите что я новичек в создании компонентов для Joomla - я до сих пор к примеру не могу понять смысла от 2ух файлов в контроллере или в моделе по типу mycomponentS и mycomponenT - по этому сейчас для меня это весьма трудоемко

Неужели нельзя сделать все в одном запросе ? Ну то есть к примеру есть запрос к бд который выводит все о заказе - к ниму Joinom  крепим данные из пользователей и все отправляем сразу в форму  ?
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Выборка данных из нескольких таблиц вполне возможна, если использовать джоины и подзапросы в sql, только вот каким боком это относится к сабжу? Если вам надо просто вывести форму с данными, cделайте выборку и сформируйте HTML на основе этих данных. Это никак не относится ни к XML ни к Joomla
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
с одной стороны да - я так и думал сделать - сделать запрос - выбрать данные и вставить во вьюху с редактированием - н что делать если мы не создаем а редактируем запись ? То есть при создании нового заказа проблем нет - вывелись пустые формы и список пользователей, а при редактировании записи получится что выведится форма с заполненными полями + список пользователей, при чем выбран будет не тот пользователь который в заказе, а будет результат простой выборки - по этому я и хочу реализовать через XML - на сколько я понимаю именно благодаря такой реализации в Joomla без лишних усилий можно реализовать  добавление новых полей
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Совершенно необязательно использовать xml-ку для создания/редактирования форм во фронтенде. Напротив, это вобщем-то лишний функционал. Разница между формами для создания новой записи и редактирования записей только в значениях по умолчанию, которые можно задать по условию.
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Хм, тогда простите но встречный вопрос - вот к примеру попробовал сделать таким образом - вывести и сгенерировать выпадающий список с пользователями в форме

Код
<form action="<?php echo JRoute::_('index.php?option=com_mycomponents&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="mycomponent-form" class="form-validate">
<div class=" fltlft">   
<fieldset class="adminform">
 
<!--Вывод данных из бд в форму + вкладки навигации в данном случае она одна-->
<ul class="nav nav-tabs">
<li class="active"><a href="#details" data-toggle="tab"><?php echo empty($this->item->id)? JText::_('COM_MYCOMPONENT_DETALIS') : JText::sprintf('COM_MYCOMPONENT_DETALIS', $this->item->id); ?></a></li>     
</ul>


 <?
$strSQL2 = "SELECT * FROM `zdj5e_users` Order by `id` ASC ";
$rs3 = mysql_query($strSQL2);
?>
<select name="name" >
<?
while($row = mysql_fetch_array($rs3)) { ?>
<option value="<? echo $row['name'] ?>"><? echo $row['name'] ?></option>
<?}?>
</select>




  <?php foreach($this->form->getFieldset() as $field): ?>
  <?php if (!$field->hidden): ?>
  <?php echo '<b>'.$field->label.'</b>'; ?>
  <?php endif; ?>
  <?php echo $field->input; ?>
  <?php endforeach; ?>
</fieldset>
</div>
 
 
 
<div>
  <input type="hidden" name="task" value="" />
  <?php echo JHtml::_('form.token'); ?>
</div>
</form>

при сохранении записи имя пользователя в бд не пишется
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
А потому что имя вашего селекта не совпадает с именем которая модель обрабатывает скорее всего посмотрите как называются другие поля в форме. Скорее всего что-то вроде name="jform[fieldname]"

Делайте форму на основе чего то одного, или даные из базы, или данные из XML. И не выполняйте запросы в виде, это дурной тон,  выполняйте их в модели или хелпере на крайняк.
« Последнее редактирование: 28.03.2015, 19:48:00 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
пробовал и так

Код
 <?
$strSQL2 = "SELECT * FROM `zdj5e_users` Order by `id` ASC ";
$rs3 = mysql_query($strSQL2);
?>
<select  name="jform[name]" id="jform_name"    >
<?
while($row = mysql_fetch_array($rs3)) { ?>
<option value="<? echo $row['name'] ?>"><? echo $row['name'] ?></option>
<?}?>
</select>

все равно не пишет - хотя имя такое же как и если бы я через XML  вывел бы поле name  >:( >:( >:(
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
А в таблице у вас есть поле с именем name? Проанализируйте какие данные принимает контроллер, какие данные он передает в модель при сохранении.
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
В таблице ячейка есть - с этим все норм. Но как мне промониторить работ модели ? (уж простите - совсем запутлся)
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Если у вас есть IDE, делайте точки останова и анализируйте переменные, раз уж вы разработкой занимаетесь, без этого вы особо не продвинетсь. Если вы упрямо пишите в блокнотике то делайте echo, print_r, var_dumb и отслеживайте цепочки вызовов методов. Когда в конец за...сь ставьте себе IDE :-)
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
А ведь все как всегда просто оказалось - и не стоит прописывать лишние запросы или ковырять поля - все элементарно.
В XML файле с формами можно прописать, как оказалось, запрос в бд с нужными данными. При этом запрос выведет нужный список с возможностью сохранения и редактирования. Вот пример того как сделал я


Код: xml
<field name="name"
  type="sql"
  default="10"
  label="Name"
  query="SELECT name FROM zdj5e_users"
  key_field="name"
  />

результат - в поле Имя есть выпадающий список с нужными параметрами  ^-^ ^-^ ^-^ ^-^ ^-^
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Zoo. Как в тизере под заголовком вывести обрезанную статью?

Автор lournrose

Ответов: 0
Просмотров: 695
Последний ответ 04.12.2021, 19:00:43
от lournrose
Обновить значения в таблице

Автор semen1707

Ответов: 0
Просмотров: 426
Последний ответ 12.04.2021, 18:46:13
от semen1707
Проблема с временем pm/am в компоненте sp soccer (шаблон shaper soccer)

Автор Mira

Ответов: 7
Просмотров: 1047
Последний ответ 21.04.2019, 13:52:42
от Mira
Аддон Контактная форма в компоненте Page Builder Pro

Автор svarg

Ответов: 0
Просмотров: 860
Последний ответ 21.02.2019, 10:06:39
от svarg
Проблемка с кодировкой в компоненте JotCache

Автор KSS

Ответов: 6
Просмотров: 1302
Последний ответ 03.12.2018, 12:18:58
от kdn79