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

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Пишу свой компонент для загрузки файлов.
Приходится немного изобретать велосипед, поскольку к загружаемому файлу необходимо добавить описание и еще куча доп.полей узко-специфичной направленности.

Возник вопрос.
Описание - поле ftext, для него показываю редактор, для редактора в XML объявляю:
Код: xml
    <field name="text" type="editor" label="JGLOBAL_FULL_TEXT" description="JGLOBAL_FULL_TEXT" buttons="true" filter="RAW"/>
Если я задаю имя поля как ftext, то - белый экран, приходится называть text, чтобы показать редактор, но тогда встает вопрос чтения/записи данных поля и показа их в редакторе.

Для показа значения поля в редакторе в модели:
Код: php
  public function getItem($id = null) {
    if ($item = parent::getItem($id))
      $item->text = $item->ftext;
    return $item;
  }
С этим проблем нет.

Для записи в базу в классе таблицы:
Код: php
  public function bind($array, $ignore = '') {
    $this->ftext = $array['text'];
    return parent::bind( $array, $ignore );
  }
И вот здесь получаю:
Notice: Undefined index: text
Не понял, что за индекс и где может быть мой косяк. Данные сохраняются, но сие замечание меня сильно напрягает.
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
а если  $array['ftext']= $array['text'];
и зачем делать это перегоняйте с ftext в text? используйте везде text!
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
а если  $array['ftext']= $array['text'];
вообще не считывает данные при открытии записи на редактировании - в редакторе пусто

и зачем делать это перегоняйте с ftext в text? используйте везде text!
с незапамятных времен у меня предубеждения против названий полей, совпадающих с зарезервированными словами
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
с незапамятных времен у меня предубеждения против названий полей, совпадающих с зарезервированными словами
Все проблемы с зарегистрированными словами лишаются с помощью кавычки: ` или $db->qn('text');
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Кстати, компонент создавал с помощью вашего сервиса, там в таблице по умолчанию используется introtext и fulltext, а поскольку подразделение контента описания не планируется на "до" и "после", я оба поля тупо заменил на свое.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
В оригинале было:
Код: php
		if ( isset( $array['text'] ) )
{
$pattern = '#<hr\s+id=("|\')system-readmore("|\')\s*\/*>#i';
$tagPos = preg_match($pattern, $array['text'] );

if ($tagPos == 0)
{
$this->introtext = $array['text'];
$this->fulltext = '';
}
else
{
list ($this->introtext, $this->fulltext) = preg_split( $pattern, $array['text'], 2 );
}
}
Тоже $array['text'], но на него не ругался!
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Блин, решил:
Код: php
    if (isset($array['text']))
      $this->ftext = $array['text'];
Но не понял, какую роль здесь isset() играет, ведь оно ни разу не было false
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Код: xml
<field name="limit" type="limitbox" class="inputbox input-mini" default="20" label="COM_CONTENT_LIST_LIMIT" description="COM_CONTENT_LIST_LIMIT_DESC" onchange="this.form.submit();" />
А как по умолчанию показывать все строки?

Кстати, указание значения, отличного от 20, не срабатывает - все равно по умолчанию 20.
« Последнее редактирование: 19.10.2014, 17:03:22 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
По какой причине во вьюхе редактирования записи в view.html.php может не передаваться значение полей редактируемой записи?
var_dump($this->get('Item')); => NULL
*

aspidy

  • Завсегдатай
  • 1008
  • 55 / 1
  • Миграция joomla 1.0-1.5-2.5
Есть стандартные функции. Если подключаете редактор-значит это редактор.
Example XML Definition

<field name="test1" label ="Test Field" type="editor" width="300" filter="safehtml" />
http://docs.joomla.org/Editor_form_field_type
http://docs.joomla.org/Standard_form_field_types :D
Мелкий ремонт. skype poisk-plus
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
По какой причине во вьюхе редактирования записи в view.html.php может не передаваться значение полей редактируемой записи?
var_dump($this->get('Item')); => NULL
Проверьте есть-ли и подключена ли модель с одноименным названием, есть ли XML для этого вида и т.п..
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
XML есть - поля во вьюхе отображаются. модель есть - как проверить, подключена ли?

В модели:
  protected function loadFormData() {
    $data = JFactory::getApplication()->getUserState('com_ai_mfo.edit.subscription.data', array());
    var_dump($data); => array(0) { }
    if (empty($data))
      $data = $this->getItem();
    return $data;
  }
« Последнее редактирование: 20.10.2014, 08:50:34 от AlekVolsk »
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
По идее если правильно названа, то должна подключаться, так-же надо посмотреть и одноименные файлы таблиц. В контроллере явного указания модели для итемной вьюхи вроде не надо.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Задача простая. Для зарегеных пользователей необходимо вести доп.учет, т.е. необходимы дополнительные поля для хранения данных.
Добавляю в базу таблцу с полями:
userid - ключевое поле, оно же - ссылка на id юзера, не автоинкремент, уникальное.
istatus, idt, iname, sstatus, sdt, sname - доп.поля.
Предварительно в базу ручками забил часть данных, прредполагается n-тыс.запсей.
В запросе в модели списка также вывожу имя и логин пользователя. Список отображается нормально, фильтруется, сортируется. Надимаю на редактирование итема или создание нового - и вот тут свистопляска...

Вроде все названо правильно, что и где накосячил - не пойму.
Данные в форму не подгружаются!
Прошу помощи.
« Последнее редактирование: 20.10.2014, 19:37:38 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
А ларчик просто открывался: action формы некорректен был + в модели списка в ссылке на итем ошибка была.

Такой еще момент: в запросе (в getListQuery в модели списка) выводятся данные с 2х таблиц, основной + 2 поля из #__users:
    $query->select('
      s.userid,
      s.istatus,
      s.idt,
      s.iname,
      s.sstatus,
      s.sdt,
      s.sname,
       u.username,
       u.name,

      u.id as uid');
    $query->leftJoin('#__users AS u ON u.id = s.userid');
    $query->from('#__aimfo_subscriptions as s');

В форме выделенные поля не отображают значения. xml:
Код: xml
    <field name="username" type="text" label="COM_AIMFO_SS_USERNAME" description="" readonly="true" />
    <field name="name" type="text" label="COM_AIMFO_SS_NAME" description="" readonly="true" />
Поля носят чисто информационный характер, но они нужны. Почему могут не отображаться данные, хотя во вьюхе списка они отображаются?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Такой еще момент: в запросе (в getListQuery в модели списка) выводятся данные с 2х таблиц, основной + 2 поля из #__users:
Не совсем понятно при чем getListQuery  (это же у вас вид и модель списка)
и элементы формы которые для одиночной записи!
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Так вроде все из одного запроса берется, или я ошибаюсь?
Сделал во вьюхе итема дамп $this->form:
object(JForm)#161 (6) {
  ["data":protected]=>
  object(Joomla\Registry\Registry)#160 (1) {
    ["data":protected]=>
    object(stdClass)#159 (7) {
      ["userid"]=>
      string(3) "146"
      ["istatus"]=>
      string(1) "1"
      ["idt"]=>
      string(10) "2014-10-31"
      ["iname"]=>
      string(0) ""
      ["sstatus"]=>
      string(1) "1"
      ["sdt"]=>
      string(10) "2014-10-24"
      ["sname"]=>
      string(0) ""
    }
  }
  ...
}
Там этих полей вообще нет...
« Последнее редактирование: 20.10.2014, 19:36:08 от AlekVolsk »
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Так вроде все из одного запроса берется, или я ошибаюсь?
Для списка и формы разные модели и разные запросы!
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Эмм, в модели формы у меня запроса нет:
Спойлер
[свернуть]
Или напрямую из TableAimfo_Subscriptions берется по userid?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Код: php
public function getItem($id = null) {
    $item = parent::getItem($id);
    return $item;
}
вот тут формируется запрос! Точнее берется класс JTable в котором банально load($pk)! и возврат объекта!
Вы можете сделать так:
Код: php
public function getItem( $id = null ){
   if ( $item = parent::getItem( $id ) ) {
      //вот тут сделать выборку нужного вам юзера и:
     $item->name = $user->name;
     $item->username = $user->username ;
   }
   return $item;
}
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Код: php
  public function getItem($id = null) {
    if ($item = parent::getItem($id)) {
      if (!empty($item->userid)) {
        $user = JFactory::getUser($item->userid);
        $item->name = $user->name;
        $item->username = $user->username;
      }
    }
    return $item;
  }

И такая еще фигня: при создании новой записи, в форме выбираю в поле пользователя, а значение в базу в userid не записывается, тоже самое при изменении значения поля при редактировании формы. Это в bind в таблице или еще где?
« Последнее редактирование: 20.10.2014, 21:36:17 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
В списке нажимаю "создать", в форме в поле, объявленного в XML как <field name="userid" type="user" required="true" />, выбираю пользователя, нажимаю "сохранить" - записывается в базу успешно 0 вместо id нужного пользователя. При редактировании существующей записи поле отображает корректного пользователя, однако при сохранении изменений значение в базе не меняется - остается старое id пользователя, хотя сохранение проходит успешно.
Куда смотреть, где может быть косяк?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Простите, а эта конструкция
Код: php-brief
if ($item = parent::getItem($id)) {

}
зачем здесь if в вашем коде
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Вы можете сделать так:
Код: php
public function getItem( $id = null ){
   if ( $item = parent::getItem( $id ) ) {
      //вот тут сделать выборку нужного вам юзера и:
     $item->name = $user->name;
     $item->username = $user->username ;
   }
   return $item;
}
Видимо, могут существовать моменты, когда условие может быть ложно. Делал просто по совету.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Цитировать
Видимо, могут существовать моменты, когда условие может быть ложно
если оно будет ложно то сработает второй if
по сути здесь кроится логическая ошибка вы запрашиваете объект а можете получить в ответ false
говорит о неправильной логике. Лучше вернуть пустой объект и проверить его свойство.
Это типичная ошибка, прийдется много раз с таким сталкиватся. А дорога она в поддержке. Если я собираюсь в ответ получить item объект, а получу false,  банальная проверка if($item->id == 10){} приведет к fatal error
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Код: php
  public function getItem($id = null) {
    $item = parent::getItem($id));
    if (isset($item)) {
      if (!empty($item->userid)) {
        $user = JFactory::getUser($item->userid);
        $item->name = $user->name;
        $item->username = $user->username;
      }
    }
    return $item;
  }
Будет ли так правильно?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Цитировать
Будет ли так правильно?
А я не скажу тебе. Поделился замечаниями которые могут привести к ошибке и почему не is_object
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Понял.

Вопрос с записью userid остается открытым: сейчас при нажатии "сохранить" форма успешно сохраняется, даже если в поле пользователь не выбран, хотя поле required="true"
Я в тупике.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Блин, вот понимаю, что на азбуке споткнулся, и носом ткнуть меня некому...
Что показать?
« Последнее редактирование: 21.10.2014, 02:06:58 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
[spoiler title=Модель]
Код: php
class Ai_MfoModelSubscription extends JModelAdmin {

  public function getForm($data = array(), $loadData = true) {
    $form = $this->loadForm('com_ai_mfo.subscription', 'subscription', array('control' => 'jform', 'load_data' => $loadData));
    if (empty($form)) return false;
    return $form;
  }

  public function getItem($id = null) {
    $item = parent::getItem($id);
    if (isset($item)) {
      if (!empty($item->userid)) {
        $user = JFactory::getUser($item->userid);
        $item->name = $user->name;
        $item->username = $user->username;
        $item->istatuss = $this->getStatusS($item->istatus);
        $item->sstatuss = $this->getStatusS($item->sstatus);
      }
    }
    return $item;
  }

  public function getTable($type = 'aimfo_subscriptions', $prefix = 'Table', $config = array()) {
    return JTable::getInstance($type, $prefix, $config);
  }

  protected function loadFormData() {
    $data = JFactory::getApplication()->getUserState('com_ai_mfo.edit.subscription.data', array());
    if (empty($data))
      $data = $this->getItem();
    return $data;
  }

  protected function canDelete($record) {
    //if (!empty($record->userid))
      return JFactory::getUser()->authorise('core.delete', 'com_ai_mfo.subscription.'.(int)$record->userid);
  }

  protected function canEditState($record) {
    $user = JFactory::getUser();
    if (!empty($record->userid)) {
      return $user->authorise('core.edit.state', 'com_ai_mfo.subscription.'.(int)$record->userid);
    } else {
      return parent::canEditState('com_ai_mfo');
    }
  }

  public function getStatusS($status) {
    switch ($status) {
      case 0: $result = JText::_('COM_AIMFO_SS_STAUS_0'); break;
      case 1: $result = JText::_('COM_AIMFO_SS_STAUS_1'); break;
      case 2: $result = JText::_('COM_AIMFO_SS_STAUS_2'); break;
    }
    return $result;
  }
}
[/spoiler]

[spoiler title=Вьюха edit.php]
Код: php
<?php defined('_JEXEC') or die;
JHtml::_('bootstrap.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('behavior.keepalive');
$input = JFactory::getApplication()->input;
//$keyfield = $this->isNew ? 'userid' : 'name';
$keyfield = 'userid';
?>

<script type="text/javascript">
Joomla.submitbutton = function (task) {
  if (task == 'subscription.cancel' || document.formvalidator.isValid(document.id('item-form'))) {
    Joomla.submitform(task, document.getElementById('item-form'));
  } else {
    alert('<?php echo $this->escape(JText::_('JGLOBAL_VALIDATION_FORM_FAILED')); ?>');
  }
}
</script>

<?php
echo '<form action="'.JRoute::_('index.php?option=com_ai_mfo&userid='.$this->form->getValue('userid')).'" method="post" name="adminForm" id="item-form" class="form-validate" enctype="multipart/form-data">';

  echo '<div class="form-horizontal">'.JHtml::_('bootstrap.startTabSet', 'myTab', array('active' => 'general'));

    echo JHtml::_('bootstrap.addTab', 'myTab', 'general', JText::_('COM_AIMFO_SEDIT_TAB_FILE', true)).
      '<div class="row-fluid form-horizontal-desktop">'.

        '<div class="span6">'.
          '<div class="control-group">'.
            '<div class="control-label">'.$this->form->getLabel('username').'</div>'.
            '<div class="controls">'.$this->form->getInput('username').'</div>'.
          '</div>'.
        '</div>'.
        '<div class="span6">'.
          '<div class="control-group">'.
            '<div class="control-label">'.$this->form->getLabel($keyfield).'</div>'.
            '<div class="controls">'.$this->form->getInput($keyfield).'</div>'.
          '</div>'.
        '</div>'.
      '</div><hr />'.
      '<div class="row-fluid form-horizontal-desktop">'.
        '<div class="span6">'.
          '<legend style="border:none;margin:0;">'.JText::_('COM_AIMFO_SS_ISTATUS_LABEL', true).'</legend>'.
          '<div class="control-group">'.
            '<div class="control-label">'.$this->form->getLabel('istatuss').'</div>'.
            '<div class="controls">'.$this->form->getInput('istatuss').'</div>'.
          '</div>'.
          '<div class="control-group">'.
            '<div class="control-label">'.$this->form->getLabel('idt').'</div>'.
            '<div class="controls">'.$this->form->getInput('idt').'</div>'.
          '</div>'.
          '<div class="control-group">'.
            '<div class="control-label">'.$this->form->getLabel('iname').'</div>'.
            '<div class="controls">'.$this->form->getInput('iname').'</div>'.
          '</div>'.
        '</div>'.
        '<div class="span6">'.
          '<legend style="border:none;margin:0;">'.JText::_('COM_AIMFO_SS_SSTATUS_LABEL', true).'</legend>'.
          '<div class="control-group">'.
            '<div class="control-label">'.$this->form->getLabel('sstatuss').'</div>'.
            '<div class="controls">'.$this->form->getInput('sstatuss').'</div>'.
          '</div>'.
          '<div class="control-group">'.
            '<div class="control-label">'.$this->form->getLabel('sdt').'</div>'.
            '<div class="controls">'.$this->form->getInput('sdt').'</div>'.
          '</div>'.
          '<div class="control-group">'.
            '<div class="control-label">'.$this->form->getLabel('sname').'</div>'.
            '<div class="controls">'.$this->form->getInput('sname').'</div>'.
          '</div>'.
        '</div>'.
       
      '</div>'.JHtml::_('bootstrap.endTab');

    echo JHtml::_('bootstrap.endTabSet');
  echo '</div>';

  echo '<input type="hidden" name="task" value="" />'.
    '<input type="hidden" name="return" value="'.$input->getCmd('return').'" />'.
    JHtml::_('form.token');

echo '</form>';
[/spoiler]

[spoiler title=поля]
Код: xml
<?xml version="1.0"?>
<form>
  <fieldset>
    <field name="username" type="text" label="COM_AIMFO_SS_USERNAME" class="inputbox" readonly="true" />
    <field name="userid" type="user" label="COM_AIMFO_SS_NAME" class="inputbox" required="true" />
    <field name="name" type="text" label="COM_AIMFO_SS_NAME" class="inputbox input-xlarge" readonly="true" />

    <field name="istatuss" type="text" label="COM_AIMFO_SS_ISTATUS_FLABEL" class="inputbox" readonly="true"/>
    <field name="idt" type="calendar" label="COM_AIMFO_SS_IDT" size="12" class="inputbox" format="%Y-%m-%d" filter="user_utc"/>
    <field name="iname" type="text" label="COM_AIMFO_SS_INAME" class="inputbox input-xlarge"/>

    <field name="sstatuss" type="text" label="COM_AIMFO_SS_SSTATUS_FLABEL" class="inputbox" readonly="true"/>
    <field name="sdt" type="calendar" label="COM_AIMFO_SS_SDT" size="12" class="inputbox" format="%Y-%m-%d" filter="user_utc"/>
    <field name="sname" type="text" label="COM_AIMFO_SS_SNAME" class="inputbox input-xlarge"/>
  </fieldset>
</form>
[/spoiler]

[spoiler title=view.html.php]
Код: php
class Ai_MfoViewSubscription extends JViewLegacy {

  public $form;
  public $item;
  public $user;
  public $state;

  public function display($tpl = null) {
    $this->form = $this->get('Form');
    $this->item = $this->get('Item');
    $this->user = JFactory::getUser();
    $this->state = $this->get('State');
    if (count($errors = $this->get('Errors'))) {
      JError::raiseError(500, implode('\n', $errors));
      return false;
    }
    $this->loadHelper('ai_mfo');
    $this->canDo = ai_mfoHelper::getActions('subscription', $this->item->userid);
    $this->_setToolBar();
    parent::display($tpl);
  }

  protected function _setToolBar() {
    JFactory::getApplication()->input->set('hidemainmenu', true);
    $isNew = ($this->item->userid == 0);
    $this->isNew = $isNew;
    $canDo = ai_mfoHelper::getActions('subscription', $this->item->userid);
    JToolBarHelper::title(JText::_('COM_AI_MFO').' <small>['.($isNew ? JText::_('JTOOLBAR_NEW') : JText::_('JTOOLBAR_EDIT')).']</small>');
    if ($isNew && (count($this->user->getAuthorisedCategories('com_ai_mfo', 'core.create')) > 0)) {
      JToolBarHelper::apply('subscription.apply');
      JToolBarHelper::save('subscription.save');
      JToolBarHelper::save2new('subscription.save2new');
      JToolBarHelper::cancel('subscription.cancel');
    } else {
      if ($canDo->get('core.edit')) {
        JToolBarHelper::apply('subscription.apply');
        JToolBarHelper::save('subscription.save');
        if ($canDo->get('core.create'))
          JToolBarHelper::save2new('subscription.save2new');
      }
      if ($canDo->get('core.create'))
        JToolBarHelper::save2copy('subscription.save2copy');
      JToolBarHelper::cancel('subscription.cancel', 'JTOOLBAR_CLOSE');
    }
  }
}
[/spoiler]

[spoiler title=Таблица в базе]
Код: sql
CREATE TABLE IF NOT EXISTS `ai_aimfo_subscriptions` (
  `userid` int(11) NOT NULL,
  `istatus` int(4) NOT NULL,
  `idt` date NOT NULL,
  `iname` varchar(255) NOT NULL,
  `sstatus` int(4) NOT NULL,
  `sdt` date NOT NULL,
  `sname` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `ai_aimfo_subscriptions`
 ADD PRIMARY KEY (`userid`), ADD UNIQUE KEY `userid` (`userid`);
[/spoiler]
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Отправка файлов через ajax в модуль Joomla

Автор hemicide

Ответов: 19
Просмотров: 1075
Последний ответ 11.04.2022, 08:44:33
от sivers
Создание компонента для табеля рабочего времени

Автор sashahz

Ответов: 7
Просмотров: 476
Последний ответ 12.04.2021, 11:12:11
от sashahz
Вызов формы компонента в pop-up, при клике по ссылке из любого места

Автор SkyAn

Ответов: 1
Просмотров: 394
Последний ответ 01.03.2021, 04:08:48
от gartes
Документация по разработки компонента для Joomla 3.x

Автор Aspik

Ответов: 9
Просмотров: 2900
Последний ответ 23.01.2021, 07:55:56
от hmr
Сборка инсталятора компонента файлами из разных папок с привлечением github

Автор borro

Ответов: 1
Просмотров: 414
Последний ответ 25.12.2020, 21:21:30
от platonische