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

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Здравствуйте! Сейчас я пишу парсер для переноса новостей со старого сайта (PHP-Fusion) на Joomla 3.8.
Вот что у меня пока выходит!

Основную часть кода взял с интернета:
Подключаем приложение
Код
if (!defined('_JEXEC')) {
    define( '_JEXEC', 1 );
    define('JPATH_BASE', realpath(dirname(__FILE__)));
    require_once ( JPATH_BASE .'/includes/defines.php' );
    require_once ( JPATH_BASE .'/includes/framework.php' );
    defined('DS') or define('DS', DIRECTORY_SEPARATOR);
}
$application = JFactory::getApplication('site');
Функция создания материала
Код
    function createArticle($data){
        JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_content/models');
        $article_model = JModelLegacy::getInstance('Article','ContentModel', array('ignore_request' => true));
        if(!$article_model->save($data)){
            $err_msg = $article_model->getError();
            echo JText::_($err_msg)."\n";
            return false;
        }else{
            $id = $article_model->getItem()->id;
            return $id;
        }
    }
Две функции для создания правильного alias
Код
    //Знайти унікальний псевдонім, якщо поточний не існує.
    function getUniqueAlias($alias, $catId){
        $alias_ini = $alias;
        for ($i = 1; isAliasExist($alias, $catId); $i++) {
            $alias = $alias_ini . '-' . $i;   
        }
        return $alias;
    }

    //Перевірте "псевдонім" у базі даних.
    function isAliasExist($alias, $catId){
        $db = JFactory::getDBO();
        $query = $db->getQuery(true);
        $query
            ->select('COUNT(*)')
            ->from($db->quoteName('#__content'))
            ->where($db->quoteName('alias'). ' = ' . $db->quote($alias))
            ->where($db->quoteName('catid'). ' = ' . $db->quote($catId));
        $db->setQuery($query);
        return ($db->loadResult()? true : false);
    }
Формируем сам массив данных
Код
$articles_arry['catid'] = 2;
$articles_arry['created_by'] = 0;
$articles_arry['title'] = 'Вухо слона велике шо капец (Навіщо слона великі вуха?)';

//формуємо аліас нашими функциями
$oldAlias = JFilterOutput::stringURLSafe(JString::trim(JLanguage::getInstance('uk-UA')->transliterate($articles_arry['title'])));
$alias = getUniqueAlias($oldAlias, $articles_arry['catid']);
$articles_arry['alias'] = $alias;

$articles_arry['introtext'] = 'Вступний текст про вухо... Ви хочаб рпаз замислювались навіщо слону такі великі вуха, продовження читайте в цій статті';
$articles_arry['fulltext'] = 'Повний текст, так так, про вухо слона. Одне вухо африканського слона може важити близько 50 кілограм, а форма їх нагадує обрис континенту, на якому вони проживають. <br>(а далі піде текст в html) <br>';
$articles_arry['images'] = '';
$articles_arry['state'] = 1;
$articles_arry['urls'] = '{"urla":false,"urlatext":"","targeta":""}';
$articles_arry['attribs'] = '{"show_title":"","link_titles":"","show_tags":"","show_intro":""}';

//можно ли как то типа так передать значения дополнительных полей???
$articles_arry['com_fields'] = '{"pidpys":"2","tekstovyi-pidpys":"6666","halereia":"headers"}';
/*---------------*/

$articles_arry['metadata'] = '{"robots":"","author":"","rights":"","xreference":""}';
$articles_arry['language'] = '*';
$articles_arry['created'] = JHTML::Date(time(), 'Y-m-d H:i:s');
$articles_arry['metakey'] = '';

Ну и собственно создаем наш материал
Код
$article_id = createArticle($articles_arry);
//Проверяем успех создания статьи
if(!$article_id){
    echo "Створення статті не вдалося!";
}else{
/* здесь у нас уже есть id материала
*  id поля которое мне нужно я уже знаю я уже знаю
*  и далее я создаю запись значений полей в БД
*/
    JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
   
    JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_fields/models', 'FieldsModel');
    $fieldModel = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));
   
    //создаем две записи
    $fieldModel->setFieldValue(8, $article_id, 'sampledata/parks');
    $fieldModel->setFieldValue(11, $article_id, 'Тут типу подпись');
   
echo "Статтю успішно створено id: ". $article_id;
}

После выполнения кода у меня ошибка: Notice: Use of undefined constant JPATH_COMPONENT - assumed 'JPATH_COMPONENT' in /home/udpu/new/administrator/components/com_fields/models/field.php on line 393
Она появляется столько раз сколько я вызываю "$fieldModel->setFieldValue"
Но значения в БД добавляются.

Отсюда несколько вопросов:
Первый и самый главный - как еще можно добавить значения полей во время программного создания материала?
Можно ли как то по другому передать эти параметры? В идеале через главный массив значений там где заголовок, описание и т.д.?


и второй, можно ли как то обойтись без тех дополнительных функций которые проверяют на уникальность alias и добавляют число, так как если создавать материал через админку Joomla сама добавляет уникальный номер в конце алиаса.


« Последнее редактирование: 25.09.2017, 16:11:57 от dj_pasha »
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Удаляйте геморрой через модель материалов: быстро, безопасно и качественно. Остерегайтесь кустарных херургов.
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Про поля не знаю, пока не было надобности вникать. Про алиас - модель ContentModelArtcile делает это автоматом при сохранении, но только если в task передано одно из: 'apply', 'save', 'save2new'.

Вот код:
Код
// Automatic handling of alias for empty fields
if (in_array($input->get('task'), array('apply', 'save', 'save2new')) && (!isset($data['id']) || (int) $data['id'] == 0))
{
    if ($data['alias'] == null)
    {
        if (JFactory::getConfig()->get('unicodeslugs') == 1)
        {
            $data['alias'] = JFilterOutput::stringURLUnicodeSlug($data['title']);
        }
        else
        {
            $data['alias'] = JFilterOutput::stringURLSafe($data['title']);
        }

        $table = JTable::getInstance('Content', 'JTable');

        if ($table->load(array('alias' => $data['alias'], 'catid' => $data['catid'])))
        {
            $msg = JText::_('COM_CONTENT_SAVE_WARNING');
        }

        list($title, $alias) = $this->generateNewTitle($data['catid'], $data['alias'], $data['title']);
        $data['alias'] = $alias;

        if (isset($msg))
        {
            JFactory::getApplication()->enqueueMessage($msg, 'warning');
        }
    }
}

Попробуйте в начале createArticle добавить код:
Код
JFactory::getApplication()->input->set->('task', 'save');
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Добавил, появилась ошибка
Код
PHP error:  syntax error, unexpected '(', expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in /home/udpu/new/pars.php on line 70
Версия PHP 7.1
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Ну блин, тупо не копируйте =) Я ошибся
JFactory::getApplication()->input->set('task', 'save');
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Извините))) Пока в ООП не очень, хотя я так тоже пробовал. Так пишет ошибку (если не указывать alias в массиве)
Код
Notice: Undefined index: alias in /home/udpu/new/administrator/components/com_content/models/article.php on line 594
Если указать alias как null то ошибка исчезает и запись даже создается, но так теперь не работает транслитерация title кириллицы.
Может для этого нужно как то по другому язык указать?

Или же мне нужно самому делать транслитерацию?
Как то так?
Код
JLanguage::getInstance('uk-UA')->transliterate($articles_arry['title'])
*

b2z

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

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Я уже проверил и к сожалению так не работает. Если alias указать то параметр task не срабатывает, Joomla просто добавляет "-" между словами и записывает все это как alias, а на следующий раз опять ошибка
Код
JLIB_DATABASE_ERROR_ARTICLE_UNIQUE_ALIAS
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Я уже проверил и к сожалению так не работает. Если alias указать то параметр task не срабатывает, Joomla просто добавляет "-" между словами и записывает все это как alias, а на следующий раз опять ошибка
Код
JLIB_DATABASE_ERROR_ARTICLE_UNIQUE_ALIAS
Тогда пробуйте добавить в createArticle

Код
include_once JPATH_BASE . '/libraries/joomla/database/table/content.php';
$table = JTable::getInstance('Content', 'JTable');

if ($table->load(array('alias' => $data['alias'], 'catid' => $data['catid'])))
{
       list($title, $alias) = $article_model->generateNewTitle($data['catid'], $data['alias'], $data['title']);
       $data['alias'] = $alias;
}
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
К сожалению в Joomla 3.8 файла "libraries/joomla/database/table/content.php" уже нет
Вот ошибка
Код
Call to protected method Joomla\CMS\MVC\Model\AdminModel::generateNewTitle() from context ''

Ну и на всякий случай вся функция, может я что не так делаю
Код
    function createArticle($data){
       
        JFactory::getApplication()->input->set('task', 'save');//параметр отвечает за генерацию уникального url
        /*Подключаем модель*/
        JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_content/models');
        $article_model = JModelLegacy::getInstance('Article','ContentModel', array('ignore_request' => true));
       
        //Пытаемся разрулить alias)))
        // JLoader::register('ContentHelper', JPATH_ADMINISTRATOR . '/components/com_content/helpers/content.php');
        include_once JPATH_BASE . '/libraries/joomla/database/table/content.php';
        $table = JTable::getInstance('Content', 'JTable');
        if($table->load(array('alias' => $data['alias'], 'catid' => $data['catid']))){
            list($title, $alias) = $article_model->generateNewTitle($data['catid'], $data['alias'], $data['title']);
            $data['alias'] = $alias;
        }
 
        if(!$article_model->save($data)){
            $err_msg = $article_model->getError();
            echo JText::_($err_msg)."\n";
            return false;
        }else{
            $id = $article_model->getItem()->id;
            return $id;
        }
    }
*

b2z

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

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Я пока так и сделал, пока не найдется лучшее решение. Пока остался открытым вопрос по пользовательских полях! Может кто что уже делал?
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Я пока так и сделал, пока не найдется лучшее решение. Пока остался открытым вопрос по пользовательских полях! Может кто что уже делал?
Поля это отдельная модель. Делал это уже джумла есть плагин сисетемны\контентный в котором можно посмтотеть код.
Ну или вот на для днях делал, тут есть получение массива полей и добавления значения в базу.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Поля это отдельная модель. Делал это уже джумла есть плагин сисетемны\контентный в котором можно посмтотеть код.
Ну или вот на для днях делал, тут есть получение массива полей и добавления значения в базу.

Сделал как у Вас в примере, по сути тоже что и у меня сначала только с некоторыми проверками, ниже основной код
Код
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

    $contentData = array(
        'id'=>$article_id, //id созданого материала
        'com_fields'=>array('halereia'=>'sampledata/parks','tekstovyi-pidpys'=>'Тут типу підпис','pidpys'=>'0','dodatkove-foto-novyny'=>'sdsd') //названия полей та их значения, потом будут динамические
    );
    $fields = FieldsHelper::getFields('com_content.article', $contentData['id'], true); //все возсожные поля для материал
    $values = $contentData['com_fields'];
    //пепребираем поля и добавляем те что нам нада (может быть несколько)
    foreach ($fields as $key => $field){
        if ($field->type == 'gallery' && isset($values[$field->name])){
            $value = $values[$field->name];
            $model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));
            $model->setFieldValue($field->id, $contentData['id'], $value);
        }
    }

Значения создаются в БД но во время создания у меня пишет ошибку
Код
Notice: Use of undefined constant JPATH_COMPONENT - assumed 'JPATH_COMPONENT' in /home/udpu/new/administrator/components/com_fields/models/field.php on line 393

может я что то не подключил? или как мне убрать ошибку?

Пока убрал ошибку добавив выше строчку
Код
define('JPATH_COMPONENT','');
но думаю это как минимум не правильно
« Последнее редактирование: 25.09.2017, 16:30:53 от dj_pasha »
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Еще вопросик)))
Как в Joomla 3 (именно классами самой CMS) можно скачать файл по url и положить в нужную мне папку?

Пробовал так:

Код
// подключаем классы для управления файлами
JLoader::register('JFile', JPATH_LIBRARIES . '/joomla/filesystem/file.php');
JLoader::register('JFolder', JPATH_LIBRARIES . '/joomla/filesystem/folder.php');

// полный путь к файлу на другом сервере
$oneOldFileNewUrl = 'https://my-site.org.ua/files/news/2017/09/01/01/DSC_6834.jpg';

// id news
$id = 2028;
// создаем папку для фалов к материалу
JFolder::create(JPATH_BASE.DS.'images/news/old'.DS.$id); // папка создается, все ОК
//name file
$filename = JFile::makeSafe(basename($oneOldFileNewUrl)); // остается только имя с уже убранными запрещенными символами
// путь к файлу
$src = $oneOldFileNewUrl;
// путь к созданному выше каталогу и новое имя файла
$dest = JPATH_BASE."/images/news/old/".$id.'/'.$filename;
// теперь пытаюсь загрузить файл в каталог
JFile::upload($src, $dest); // bool(false)  результат выполнения ошибка, загрузить файл не удалось

« Последнее редактирование: 28.09.2017, 21:17:22 от dj_pasha »
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Вполне рабочая конструкция есть))
Код
copy($src, $dest)
Но хотелось бы проверить файл, типа на безопасность и т.д.
« Последнее редактирование: 28.09.2017, 21:39:26 от dj_pasha »
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Возможно JFile::upload не умеет загружать из адреса. Хотя можете попробовать JFile::upload($src, $dest, true);
По поводу безопасности, почитайте тут.
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Спасибо, я пробовал передавать параметры для JFile::upload, результата нет.
Пока остановился на copy($src, $dest), по поводу безопасности сделал так:
Код
//обработал имя файла (пришлось также транслитерировать имя файла так как встречаются названия файлов в кирилице)
$filename = JFile::makeSafe(JFilterOutput::stringURLSafe(JString::trim(JLanguage::getInstance('uk-UA')->transliterate(JFile::stripExt(JFile::getName($src))))).'.'.JFile::getExt(JFile::getName($src)));

// разрешенные форматы
$allExt = array(
     'gif','jpeg','png','doc','jpg','docx','xls','xlsx','pdf'
);
if(in_array(JFile::getExt($filename), $allExt)){
    // ну тут дальше понятно)))
}

*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Поппробуй copy а не uplpad чем черт не шутит.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Поппробуй copy а не uplpad чем черт не шутит.
Пробывал и JFile::copy, результата нет  :(
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Пробывал и JFile::copy, результата нет  :(
Ну начните с того что проверте существует ли удаленный файл.
затем соберите новое имя файла.
Потом загрузка поробуйте так
Код
JFile::upload($src, $dest, false, true))
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Ну начните с того что проверте существует ли удаленный файл.
затем соберите новое имя файла.
Потом загрузка поробуйте так
Код
JFile::upload($src, $dest, false, true))

Все что Вы описали уже делал, файл существует 100%
Новое имя формирую (выше писал как)
Перепробовал все возможные варианты настроек JFile::upload и даже опций JFilterInput::isSafeFile
и все равно JFile::upload не заработало. А вот copy($src, $dest) работает на отлично. Думаю на нем и останусь)))
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
// разрешенные форматы
Mime тоже проверяйте, можно как .jpg и .php при желании загрузить. Вот отличный материал на эту тему.
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Все что Вы описали уже делал, файл существует 100%
Вопрос не в его существоаании. А в том существует ли он для движка.
Новое имя формирую (выше писал как)
Выше написано мягко говоря каша.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Вопрос не в его существоаании. А в том существует ли он для движка.Выше написано мягко говоря каша.

Теперь мне интересно, и что же  нужно сделать чтобы он существовал для движка? Когда движок на одном сервере, а файл находится другом сервере.

По поводу "каши" если нужно могу расписать поподробнее, что я делаю и почему, что Вам не понятно?
(если кратко то на старом сервере встречаются файлы которые называются только кириллицей, поэтому я и придумал ту мутку с транслитерацией)
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
// разрешенные форматы
Mime тоже проверяйте, можно как .jpg и .php при желании загрузить. Вот отличный материал на эту тему.
Спасибо, почитал статью, переделаю на mime.  ^-^
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
По поводу "каши" если нужно могу расписать поподробнее, что я делаю и почему, что Вам не понятно?
Написанное не нипотно, оно не читаемо =)
Теперь мне интересно, и что же  нужно сделать чтобы он существовал для движка? Когда движок на одном сервере, а файл находится другом сервере.
Ну например я могу закрыть вовсе доступ к файлу при определенном запросе.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

dj_pasha

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Ну например я могу закрыть вовсе доступ к файлу при определенном запросе.
Я уже не стану это проверять, и мудрить. И если доступ закрыт тогда зачем что-то мутить когда есть рабочий вариант?)))
Вообще я проверял работоспособность JFile::upload. В рамках одного сайта она работает, а еще работает при загрузке файла (например через форму), но загрузка файла с другого сайта не заработала.
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Я уже не стану это проверять, и мудрить. И если доступ закрыт тогда зачем что-то мутить когда есть рабочий вариант?)))
Вообще я проверял работоспособность JFile::upload. В рамках одного сайта она работает, а еще работает при загрузке файла (например через форму), но загрузка файла с другого сайта не заработала.
Ну вообще если в другого сайта  должно быть copy. Проверьте еще путь назначения. и права
« Последнее редактирование: 29.09.2017, 18:01:55 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
но загрузка файла с другого сайта не заработала.
а что это значит и как оно выглядит?)
естественно оно работать не будет так как это уже не upload наверно будет
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

А-ля корзина для материалов Joomla

Автор Efanych

Ответов: 151
Просмотров: 15374
Последний ответ 02.04.2024, 22:31:42
от barvik
WT Eternal admin - плагин &quot;вечный админ&quot; для Joomla

Автор sergeytolkachyov

Ответов: 0
Просмотров: 359
Последний ответ 21.12.2023, 09:25:25
от sergeytolkachyov
Бесплатная система фильтрации полей Joomla

Автор zikkuratvk

Ответов: 270
Просмотров: 26309
Последний ответ 10.11.2023, 10:58:00
от SolopoV
WT Amo CRM library - простая PHP библиотека для Joomla 4+ (для разработчиков)

Автор sergeytolkachyov

Ответов: 2
Просмотров: 1622
Последний ответ 17.10.2023, 12:38:52
от sergeytolkachyov
Плагин Tabs & Sliders & Spoilers для Joomla 2.5/3.x

Автор ELLE

Ответов: 290
Просмотров: 61294
Последний ответ 14.06.2023, 09:49:02
от Sergeych