Новости Joomla

Вышел плагин CFI v.2.0.0 - экспорт/импорт материалов Joomla в таблицы.

Вышел плагин CFI v.2.0.0 - экспорт/импорт материалов Joomla в таблицы.

Плагин позволяет делать экспорт материалов Joomla в CSV файл, после чего вы можете отредактировать данные в табличном редакторе (например, Excel или OpenOffice Calc) и затем загрузить файл обратно. В некоторых случаях это удобнее и быстрее.

Плагин позволяет выгружать ID тегов, а также работать с пользовательскими полями материалов Joomla и обычно нередактируемыми свойствами материалов: просмотры, дата изменения и т.д.

Первые версии плагина CFI создал разработчик AlekVolsk для Joomline. Он разработал версии 1.0.0–1.0.16 для Joomla 3. Затем, в 2026 году, плагин был передан компании WebTolk для дальнейшего развития.

CFI v.2.0.0 — Что нового?

  1. Рефакторинг. Плагин полностью переписан заново.
  2. Новый интерфейс импорта/экспорта. Экспорт и импорт открываются в модальном окне. Появилась возможность выбора свойств материала, тегов и пользовательских полей для экспорта непосредственно перед началом экспорта.
  3. Фильтрация материалов при экспорте. Вы можете отфильтровать нужные материалы с помощью стандартных параметров поиска в панели администратора и экспортировать только их: избранные, опубликованные, материалы из определённых категорий, с заданным тегом и т.д.
  4. Импорт и экспорт всех данных материала. Ранее плагин позволял экспортировать только часть данных. Теперь можно изменять все данные материала, доступные в форме редактирования, включая нередактируемые (просмотры, дата изменения и др.). Это позволяет быстро обновлять meta-description или только данные пользовательских полей.
  5. Импорт только пользовательских полей. Обязательным полем для импорта остаётся только articleid. Это позволяет импортировать исключительно данные пользовательских полей без изменения основного содержимого материала.
  6. Joomla 6. Плагин переписан в соответствии с актуальной архитектурой Joomla 4+ и успешно протестирован на Joomla 6.
  7. Для разработчиков: предобработка плагинами. Возможна обработка данных собственными плагинами группы cfi непосредственно перед импортом или экспортом. Доступные события:
    • onExportPrepareData($event)
    • onImportPrepareArticleData($event)

Системные требования

  • Joomla 4.3+
  • PHP 8.1+

Для обновления со старых версий выпущен релиз 1.0.16, в котором добавлен новый сервер обновлений.

Ссылки

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Сдам проект - переименуем :)
*

b2z

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Ну и книгу тогда сразу писать :)
Нет уж, книгу я оставлю на Вас :) а вот материальчика на нее возможно еще подкину  ;) *DRINK*
*

aspidy

  • Завсегдатай
  • 1008
  • 55 / 1
  • Миграция joomla 1.0-1.5-2.5
Нет уж, книгу я оставлю на Вас :) а вот материальчика на нее возможно еще подкину  ;) *DRINK*
Давайте, книги я писать люблю...
Мелкий ремонт. skype poisk-plus
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
А у кого есть опыт работы с 1С 8.3, настройка сервера для доступа из инета?

Вопрос в корне: доступ в серверу 1С и дальнейшая работа с базой 1С из J любыми доступными для 1С средствами/методами/технологиями/etc... (api/прямой доступ/прочее).

Все-таки ftp - крайне тормознутая штука, к тому же тормоза 1С не позволяют обрабатывать более 1 запроса за 3 секунды (150 000 записей договоров, в 7 раз больше записей документов по договорам, раскиданных по десятку регистров, сервак на E7-4860v2 с 32 гигами озу при отсутствующей нагрузки, сервер ftp там же, на соседнем разделе с базой, доступ в инет - оптика напрямую, полный безлимит), так тестовый запрос с J ожидает ответа порядка 7,5 секунд... Бред, а не скорость. Срочно ищу альтернативу.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Мега тема еще жива!

2 таблицы в базе:
#__mfo_credit_offers
id    offername             status    sm_from    sm_to    prc_from    prc_to    term_from    term_to    term_type
1    Аннуитетный          1       5000.00    50000.00    12.0000    12.0000    12       13       2
2    Добро пожаловать!       1       1000.00    15000.00    1.5000    1.5000    10       30       1
3    Вексель             1       1000.00    15000.00    1.5000    1.5000    10       30       1
4    До востребования       1       1000.00    15000.00    1.5000    1.5000    10       30       1
5    Аннуитет Брянск       1       500.00    15000.00    12.0000    12.0000    1       5       2
6    Аннуитет(неделя+неделя)    1       1000.00    15400.00    12.0000    12.0000    12       14       3
7    Аннуитет(неделя+день)    1       100.00    10000.00    14.0000    14.0000    1       12       3
8    С возвращением!       1       20000.00    50000.00    0.0000    0.0000    10       30       1

#__mfo_credit_offers_conditions
co_id    condition    
2       Только для потенциальных клиентов.
2       От вас паспорт и справка с работы!
8       С возвращением!
8       Минимальная сумма  20000 руб, максимальная 50000 р...
8       Минимальный срок 10 дней, Максимальный срок 30 дне...


Процедура выборки:
Код: php
  protected function getListQuery()
  {
    $db = JFactory::getDBO();
    $query = $db->getQuery(true);
    $query->select('id, offername, status, sm_from, sm_to, prc_from, prc_to, term_from, term_to, term_type')
          ->from('#__mfo_credit_offers');
    return $query;
  }
  
  public function getItems()
  {
    $store = $this->getStoreId();
    if (isset($this->cache[$store])) return $this->cache[$store];
 
    $query = $this->_getListQuery();
    try
    {
      $items = $this->getDbo()->setQuery($query)->loadObjectList('id');
      $query = $this->getDbo()->getQuery(true)->select('co_id, `condition`')->from('#__mfo_credit_offers_conditions');
      $conditions = $this->getDbo()->setQuery($query)->loadObjectList();
      foreach ($conditions as $condition) {
        if (isset($items[$condition->co_id]))
          $items[$condition->co_id]->conditions[] = $condition;
      }
    }
    catch (RuntimeException $e)
    {
      $this->setError($e->getMessage());
      return false;
    }
 
    $this->cache[$store] = $items;
    return $this->cache[$store];
  }

Вывод во вьюхе:
Код: php
      <tbody>
        <?php if (count($this->items)) {
          foreach ($this->items as $i => $item) {
            if (isset($item->conditions) && count($item->conditions)) $list = $item->conditions;
            switch ($item->term_type) {
              case 1: $term_type_str = JText::_('COM_MFO_TABLE_CO_TERM_TYPE_DAY'); break;
              case 2: $term_type_str = JText::_('COM_MFO_TABLE_CO_TERM_TYPE_WEEK'); break;
              case 3: $term_type_str = JText::_('COM_MFO_TABLE_CO_TERM_TYPE_MONTH'); break;
              case 4: $term_type_str = JText::_('COM_MFO_TABLE_CO_TERM_TYPE_FREE'); break;
            }
          ?>
            <tr>
              <td class="top-brd" rowspan="2"><?php echo $item->id; ?></td>
              <td class="top-brd"><?php echo $item->offername; ?></td>
              <td class="top-brd hc"><?php echo $item->status; ?></td>
              <td class="top-brd hr"><?php if ($item->sm_from != 0) {echo number_format($item->sm_from,2,$dcs,$ths);} ?></td>
              <td class="top-brd hr"><?php if ($item->sm_to != 0) {echo number_format($item->sm_to,2,$dcs,$ths);} ?></td>
              <td class="top-brd hr"><?php if ($item->prc_from != 0) {echo number_format($item->prc_from,4,'.','');} ?></td>
              <td class="top-brd hr"><?php if ($item->prc_to != 0) {echo number_format($item->prc_to,4,'.','');} ?></td>
              <td class="top-brd hr"><?php if ($item->term_from != 0) {echo $item->term_from;} ?></td>
              <td class="top-brd hr"><?php if ($item->term_to != 0) {echo $item->term_to;} ?></td>
              <td class="top-brd hc"><?php echo $term_type_str; ?></td>
            </tr>
            <tr><td colspan="9"><i>
              <?php if (isset($list) && count($list)) {
                $list_cnt = count($list);
                $list_ii = 1;
                foreach ($list as $listitem) {
                  if ($list_ii == $list_cnt)
                    {echo $listitem->condition;} else
                    {echo $listitem->condition.'<br />';}
                  $list_ii++;
                }
              } else {echo JText::_('COM_MFO_TABLE_CO_CONDITIONALITY_NONE');}
            echo '</i></td></tr>';
          }
        } else {echo '<tr><td colspan="10" class="top-brd">'.JText::_('COM_MFO_TABLE_CO_NO_DATA').'</td></tr>';} ?>
      </tbody>

Поведение по факту:
у итемов с 3 по 7 включительно выводятся conditions от 2-го итема, а должно быть пусто (т.е. JText::_('COM_MFO_TABLE_CO_CONDITIONALITY_NONE'); ).

В чем мой косяк?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Как всегда, 3 часа помучаюсь, потом задам вопрос, потом тут же сам найду ошибку...
В конце цикла foreach ($this->items as $i => $item) {.....  $list = null;}
« Последнее редактирование: 19.09.2014, 08:21:03 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Как записать значение переменной в параметр компонента?
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Как записать значение переменной в параметр компонента?
В смысле в конфигурацию? Смотря где храняться... Если в config.xml, то добавлять прямо в него. Если в базе своя таблица, то туда.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
В конфиг, программно (при импорте из xml).

Попробовать напрямую открыть config.xml и прописать в нужное место значение (имеется ввиду не в ручную, а на php)?
« Последнее редактирование: 19.09.2014, 11:45:13 от AlekVolsk »
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Попробовать напрямую открыть config.xml и прописать в нужное место значение (имеется ввиду не в ручную, а на php)?
Походу я тебя обманул. Сами параметры хранятся в базе (таблица '#__extensions', поле params). В config.xml только форма. Получается, если новое значение, то добавлять в config.xml соответствующее поле.
Если текущее, то видимо params дергать.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
А там json, с которым пока ни разу не сталкивался. JResponseJson в этом как-то поможет? Просто поменять значение параметра mfo_is_contributions_columns
« Последнее редактирование: 05.04.2015, 23:33:54 от AlekVolsk »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
А там json, с которым пока ни разу не сталкивался. JResponseJson в этом как-то поможет? Просто поменять значение параметра.
Код: php
$registry = new JRegistry();
$registry->set( 'param1', 'value1' );
$registry->set( 'param2', 'value2' );
$registry->set( 'param3', 'value2' );
$registry->toString(); // 'это записать в базу
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Записанное в базу перезапишет все параметры или только те, что были посредством set() установлены?
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Записанное в базу перезапишет все параметры или только те, что были посредством set() установлены?
Перезапишет! Если сохранить старые параметры то:
Код: php
$params = JComponentHelper::getParams('com_mycomponent'); // загружаем параметры компонента!
$params->set( 'param1', 'value1' );
$params->toString(); // 'это записать в базу
Если поле param1 есть в параметрах  компонента, то оно перезапишется, если нет то добавится...
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
В основном шаблоне сайта надо определить, установлен ли компонент com_mycomponent. Как?
Там же определить наличие в базе таблицы #_mytable. Как?
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
JComponentHelper::isEnabled('com_name');
SHOW TABLES LIKE 'tablename'
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Второе - это запрос, если таблица существует, кол-во строк будет > 0. Я правильно понял?
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Второе - это запрос, если таблица существует, кол-во строк будет > 0. Я правильно понял?
Да, это запрос.

Цитировать
если таблица существует, кол-во строк будет > 0
В смысле? Запрос просто проверяет наличие таблицы.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Проверил: запрос возвращает 1 поле c именем 'tables_in_databasename', содержит одну запись с именем таблицы, указанной в параметре like.
В общем-то, это классический ansi sql'92 standart. Я рассчитывал, что может быть существует механизм такой проверки в api J.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Код: php
$db = JFactory::getDbo();
if ( in_array( $db->getPrefix(). 'content', $db->getTableList() ) ) {
echo 'Таблица существует';
}
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
При попытке послать файл по ftp долго думает. затем такое:
Цитировать
Warning: ftp_put(): PORT command successful in G:\home\mfo.local\www\administrator\components\com_mfo\models\loadinfo.php on line 215
Fatal error: Maximum execution time of 30 seconds exceeded in G:\home\mfo.local\www\administrator\components\com_mfo\models\loadinfo.php on line 215
Чей косяк, мой или связи?
В 215 сроке: $upload = ftp_put($conn_id, $ftp_fnameq, $xmlpath.$ftp_fnameq, FTP_ASCII);
*

b2z

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
спс, мегафон как всегда отжигает
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Пичальная картина: все, что в рамках топика было сделано (и еще много чего сверху), прахом пошло, начальство отказалось от проекта в моем исполнении, мне просто кидалово устроили, без оплаты.

Топик содержит множество решений многих вопросов, можно переименовать во что-то вроде "Учебник по созданию компонента на J3 на примерах".
Хотел все это (и еще несколько топиков) обобщить в отдельную доку, наподобие той, что на joomlablog, возможно  еще вернусь к этой идее, а пока - сори - даже думать не оч. приятно об этом. Может, кто и возьмется, материала более чем достаточно. Во всяком случае, дальнейшее развитие темы пока не предвидится.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться