Новости Joomla

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

Dram

  • Захожу иногда
  • 211
  • 0 / 0
Есть самописный компонент для Joomla 3. В админке компонента заходя в админку из админки Joomla вижу одно поле которое есть, но не используется.
Решил его переделать под новую задумку.
Записал напрямую в базу цифры от балды - проверил, они показываются в админке.
Теперь решил проверить обратное сохранение из админки в базу и вот тут не работает, не сохраняет.
Если компонент написан по канонам где должна быть функция сохранения?
Изначально я нашел это поле таким
Цитировать
         <tr>
            <td width="100" align="right" class="key">
               <label for="city">
                  <?php echo JText::_('Город'); ?>:
               </label>
            </td>
            <td>
               <input class="text_area" type="text" name="city" id="city" style="width: 500px; padding: 3px;" value="<?php if(!empty($this->item->city)) echo htmlspecialchars($this->item->city); ?>" />
            </td>
         </tr>
Поля city в таблице cl6_firm_items никогда не было, я добавил туда поле inn и код переделал в такой. Теперь данные из базы показываются но не записываются
Цитировать
         <tr>
            <td width="100" align="right" class="key">
               <label for="inn">
                  <?php echo JText::_('ИНН'); ?>:
               </label>
            </td>
            <td>
               <input class="text_area" type="text" name="inn" id="inn" style="width: 500px; padding: 3px;" value="<?php if(!empty($this->item->inn)) echo htmlspecialchars($this->item->inn); ?>" />
            </td>
         </tr>
         <tr>
Вероятно нужно написать функцию сохранения в файле /administrator/components/com_firm/models/action.php ? А как туда значение ИНН из файла default.php
передать?
По идее он уже передается, ведть код что я привел выше находится нутри
Цитировать
<form action="index.php" method="post" name="adminForm" id="adminForm" class="form-validate">
« Последнее редактирование: 06.01.2020, 15:21:08 от Dram »
*

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
Если самописный, любые сюрпризы могут быть.
Проинспектируйте кнопку "Сохранить". Там должно быть имя task, подставляемого в form перед отправкой. До точки - имя контроллера, после - метод в нем. Ищите, скорее всего, в контроллере будет обращение к модели / таблице, по цепочке раскручивайте код.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

Dram

  • Захожу иногда
  • 211
  • 0 / 0
Нашел тут /administrator/components/com_firm/tables в паре файлов
*

Dram

  • Захожу иногда
  • 211
  • 0 / 0
Снова я с этой же проблемой. Нужно модифицировать существующий самописный компонент (тот же). Но теперь данные нужно сохранить в другую таблицу - не в _firm_items

Опять я без проблем вывел нужные данные в админку, но хоть убейте не понимаю как прописать сохранение.
В папке /administrator/components/com_firm/controllers  есть файл item.php

в нем есть функция

Код
	function apply()
{
$id = JRequest::getVar('id');
$model = $this->getModel('item');

if ($model->store()) {
$msg = JText::_( 'Item Apply!' );
} else {
$msg = JText::_( 'Error Apply Item' );
}
$this->setRedirect('index.php?option=com_firm&controller=item&view=item&task=edit&cid[]='.$id, $msg);
}
Сообщение Item Apply! я как раз получаю при успешном сохранении данных в админке по кнопке "Сохранить".
У меня в голове не укладывается - как может работать сохранение, если поиск по всем файлам не нашел запроса на UPDATE таблицы _firm_items

Поля в админке в файле /administrator/components/com_firm/views/item/tmpl/default.php
Находятся внутри формы
<form action="index.php" method="post" name="adminForm" id="adminForm" class="form-validate">

Подскажите, как все же понять что именно отвечает за сохранение и как там можно добавить сохранение не в таблицу итемс для некоторых полей?

В файле /administrator/components/com_firm/tables/item.php  такой код
Код
<?php

defined('_JEXEC') or die('Restricted access');

class TableItem extends JTable
{
var $id = null;
var $category_id = null;
var $section_id = null;
var $created = null;
var $modified = null;
var $alias = null;
var $name = null;
var $title = null;
var $keywords = null;
var $description = null;
var $header = null;
var $affiliation = null;
var $text = null;
var $preview_alt = null;
var $preview_title = null;
    var $inn = null;
function TableItem(& $db) {
parent::__construct('#__firm_items', 'id', $db);
}
}
Я так понимаю именно он и отвечает за сохранение всех тех полей из админки?
А как сюда добавить сохранение пары других переменных в другую таблицу?
« Последнее редактирование: 17.10.2020, 22:28:28 от Dram »
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
В какие таблицы и что сохранять собираетесь ?
Модели отвечают за работу с базой данных, в вашем случае или вызывать триггеры на сохранение доп данных, либо переопределить метод store(), либо поискать, возможно в лжумле есть методы для записи в несколько таблиц.
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Есть самописный компонент для Joomla 3.
Решение для вас зависит от левела - самописности вашего компонента !
т.е. - на сколько тот кто писал - отошел от стандартов Joomla  и MVC !

По нормальному - то сохраняемые данные обрабатываются в модели вида ! - затем должен сработать метод родительского класса (где то так parent::save() )
после родительский объект(класс) - вызывает объект Table для представления - в котором происходит сохранения ! ! 

- это конечно крайне поверхностно - но так для общего понимания в двух словах !
*

Dram

  • Захожу иногда
  • 211
  • 0 / 0
Мне нужно из админки в тот момент когда я открыл материал на редактирование (материалс стороннего самописного компонента) сохранять данные (обновлять) как и раньше в таблицу итемс данного компонента + в другую таблицу
Правильно я понимаю что по адресу /administrator/components/com_firm/tables/item.php  нужно добавить новый класс для сохранения в новую таблицу?
по типу
Код
//это было раньше
class TableItem extends JTable
{
    public $id = null;
    public $category_id = null;
    public $section_id = null;
    public $created = null;
    public $modified = null;
    public $alias = null;
    public $name = null;
    public $title = null;
function TableItem(& $db) {
parent::__construct('#__firm_items', 'id', $db);
}
}
//примерно так добавить?
class TableStat extends JTable
{
    public $infoUp = null;
    public $workers = null;
    public $budget = null;
    function TableStat(& $db) {
            parent::__construct('#__firm_stat', 'id', $db);
    }
}
id в #__firm_items  это item_id #__firm_stat и по идее обновлять данные на основе item_id, но в описании к классу JTable втормы параметром нужно передавать поле с автоинкрементом.. Короче тут я опять запутался...
*

Dram

  • Захожу иногда
  • 211
  • 0 / 0
Все еще пытаюсь понять цепочку - как сохраняются данные.
Подскажите, пожалуйста, если в админке, в форме прописано

Цитировать
    <input type="hidden" name="option" value="com_firm"/>
    <input type="hidden" name="id" value="<?php echo $this->item->id; ?>"/>
    <input type="hidden" name="task" value=""/>
    <input type="hidden" name="controller" value="item"/>
</form>
То данные для сохранения куда дальше передаются, котроллеру?
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Ну скорее  контроллеру а потом в модель этого же вида ! - А потом в parent Class - модели !
Но может быть и такое что и в самом контроллере будут сохранятся !

Вы когда нажимаете на кнопочку сохранить - то там javascript - обработчик - который подставит нужное значение в <input name="task" /> и отправит форму !
Вот то значение(value) которое будет в <input name="task" /> это будет название метода(функции) в Вашем контроллере. Скорее всего - это должно быть либо "save" || "apply"
*

Dram

  • Захожу иногда
  • 211
  • 0 / 0
В папке контроллеров (в админке) есть item.php  в нем есть функция
Код
	function apply()
{
$id = JRequest::getVar('id');
$model = $this->getModel('item');

if ($model->store()) {
$msg = JText::_( 'Item Apply!' );
} else {
$msg = JText::_( 'Error Apply Item' );
}
$this->setRedirect('index.php?option=com_firm&controller=item&view=item&task=edit&cid[]='.$id, $msg);
}
Именно Item Apply! я вижу в админке когда сохраняю материал.

В модели (а это первое что я проверил) нет совсем функций которые делают апдейт нужных таблиц.

Далее смотрю папку tables в файле item.php есть класс - я так понимаю именно он и сохраняет данные. И вот тут у меня загвоздка.
Если мне нужно например добавить новое поле в таблицу #__firm_items то это 100% делается тут, уже проверил и сохранение работает.

Код
class TableItem extends JTable
{
    public $id = null;
    public $category_id = null;
    public $section_id = null;
    public $created = null;
    public $modified = null;
function TableItem(& $db) {
parent::__construct('#__firm_items', 'id', $db);
}
}

Но моя задача сохранить данные в другую таблицу.
Я по аналогии создал класс ниже в этом же файле
Код
class TableStat extends JTable
{
    public $infoUp = null;
    public $workers = null;
    public $budget = null;
    public $salary = null;
    function TableStat(& $db) {
        parent::__construct('#__firm_stat', 'item_id', $db);
    }
}

И вот теперь не пойму - мои поля, которые я бы хотел сохранять в админке находятся в форме, о которой я писал выше, которая заканчивается
Цитировать
<input type="hidden" name="option" value="com_firm"/>
    <input type="hidden" name="id" value="<?php echo $this->item->id; ?>"/>
    <input type="hidden" name="task" value=""/>
    <input type="hidden" name="controller" value="item"/>
</form>

Как мне данные нужных полей отправить в класс TableStat?
И еще вопрос, в описании класса JTable от которого идет наследование указано что parent::__construct должен работать с уникальным полем на котором есть автоинкримент. А мн не нужен инсерт, мне нужен только апдейт и я хотел бы использовать поле item_id без автоинкримента.... Вот на этом пока и завис.
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Подождите - а  с чего Вы взяли что кто то будет вызывать Ваш класс таблицы class TableStat ?
При этом еще и в файле из другого представления - View !!
если хотите просто не парьтесь с JTable -А просто запрос напишите что бы он  обновляв вам данные в другой таблице !
Так как по сути то вам в контроллере - тогда нужно будет вызвать свою модель или контроллер  (Stat) и это будет для Вас не самым понятным процессом - за последние дни ! )))
Делайте как вам проще !
*

Dram

  • Захожу иногда
  • 211
  • 0 / 0
Мы бы проще в модели написать функцию для обновления нужной таблицы, но тут я опять не понимаю как оправить нужные поля из формы в админке сразу в функцию модели при нажатии кнопки сохранить.
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
Что приходит в
Код
$modelStat = $this->getModel('stat');
Если верно забито, должно создать модель, вызовом store() можно записать в бд.
На худой конец, через JRequest::getVar() можно получить любую переменную и дальше как угодно играться.
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
JRequest::getVar()
Не  много некорректно - это так можно было на Joola 2 делать !
А если сильно хочется что то там сохранить или обновить запись то можно так :
Код
$app = \Joomla\CMS\Factory::getApplication();

// Перечесляем в мвссиве поля формы и сразу
// указываем фильтр типа данных к полю
$formFieldsArr = [
     'id' => 'INT' ,
     'category_id' => 'INT' ,
     'section_id' => 'INT' ,
     'alias' => 'STRING' ,
     'name' => 'STRING' ,
     'title' => 'STRING' ,
];
// Получаем массив данных 
$data = $app->input->getArray( $formFieldsArr ) ;
// Переворачиваем массив в stdClass object .
$Registry = new \Joomla\Registry\Registry( $data ) ;
$dataObj = $Registry->toObject();
try
{
// обновляем данные - id в качестве первичного ключа
    $result = \Joomla\CMS\Factory::getDbo()->updateObject('#__firm_stat', $dataObj , 'id');
}
catch (Exception $e)
{
    echo 'Что то не нак с обновлением: ',  $e->getMessage(), "\n";
    echo'<pre>';print_r( $e );echo'</pre>'.__FILE__.' '.__LINE__;
    die(__FILE__ .' '. __LINE__ );
}

Ну это для обновления - !
А вот еще что  - поля в DB - должны соответствовать ключам из массива $formFieldsArr - !
« Последнее редактирование: 26.10.2020, 00:47:52 от gartes »
*

Dram

  • Захожу иногда
  • 211
  • 0 / 0
Спасибо все за советы и помощь, я почти все сделал через модель.
Осталось понять в каком виде туда приходит пост массив и приходит ли вообще.
Не подскажите - как дебажить переменные в модели? Как там var_dump() сделать?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Шорткоды baforms в кастомном компоненте

Автор oxbeat

Ответов: 2
Просмотров: 309
Последний ответ 20.02.2024, 00:41:29
от oxbeat
Я создал пользователя Author, но он не может зайти в редактирование

Автор Olegus79

Ответов: 7
Просмотров: 497
Последний ответ 19.10.2023, 20:48:52
от Vastriet
Как может?

Автор DuaneFord

Ответов: 2
Просмотров: 435
Последний ответ 04.08.2023, 08:05:06
от Vastriet
Знакомый почему-то не может войти в учетную запись Joomla со своего компьютера

Автор admi5575

Ответов: 6
Просмотров: 777
Последний ответ 18.12.2021, 20:34:59
от draff
Объект класса stdClass не может быть преобразован в строку

Автор dida

Ответов: 0
Просмотров: 508
Последний ответ 25.09.2021, 09:07:05
от dida