Новости Joomla

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

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Как программно создать материал? Решения, которые нашел в сети предназначены для Joomla 2.5, а мне нужно для 3.8.

Хочу создать и опубликовать материал в категории "Новости" с айди равным, допустим, семи, с заголовком "Заголовок новости", с содержимом "<p>Проверка</p>" и изображением для вступительного текста "images/test.jpg".

Остальные поля не интересны и не нужны. Само с собой, дата и время публикации текущие + алиас как-нибудь тоже автоматом присвоить.

Создаваться должно от пользователя moderator, который имеет пароль qwerty.

Скрипт размещен будет отдельным php файлом в корне сайте. Версия php 5.6.

Может кто помочь составить простой и наглядный пример? Буду очень признателен за помощь. С меня заправка мобильника.
« Последнее редактирование: 09.10.2018, 15:54:57 от dm-krv »
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
создание материала удаленно

И и от какого пользователя оно создастся? Где там логины и пароли вписывать? Я хочу дать возможность гостям публиковать статьи - без регистрации и без авторизации. С одной общей учётки, которую не жалко.
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
created_by посмотри в бд значение и подставляй своё.
*

Efanych

  • Глобальный модератор
  • 4684
  • 644 / 0
  • Меняю свою жизнь на 360°!
Я хочу дать возможность гостям публиковать статьи - без регистрации и без авторизации. С одной общей учётки, которую не жалко.
С учётки, которую не жалко или без авторизации?
Создание сайтов, шаблонов, помощь в решении проблем.
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
С учётки, которую не жалко или без авторизации?

С учетки которую не жалко, но конечный пользователь не будет никаких авторизаций на сайте проходить. Посетитель тупо заполняет небольшую форму (от ботов прикручу капчу) и отправляет ее, а дальше скрипт публикует материал в категорию. Навреное, здесь можно сразу все напрямую в БД записывать, но интуиция подсказывает, что это не правильно и наверняка есть подвохи.
« Последнее редактирование: 09.10.2018, 12:49:55 от dm-krv »
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
created_by посмотри в бд значение и подставляй своё.

Ок, сейчас попробую.
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
В корне сайта отдельным файлом разместил такой код:
Код
<?php


define( '_JEXEC', 1 );
define('JPATH_BASE', realpath(dirname(__FILE__)));
require_once ( JPATH_BASE .'/includes/defines.php' );
require_once ( JPATH_BASE .'/includes/framework.php' );
$basePath = JPATH_ADMINISTRATOR.'/components/com_content';
require_once $basePath.'/models/article.php';

$img_arr['image_intro'] = 'images/karta.png';
$img_arr['float_intro'] = '';
$img_arr['image_intro_alt'] = '';
$img_arr['image_intro_caption'] = '';
$img_arr['image_fulltext'] = '';
$img_arr['float_fulltext'] = '';
$img_arr['image_fulltext_alt'] = '';
$img_arr['image_fulltext_caption'] = '';
     
$articles_arry['catid'] = '9';
$articles_arry['created_by'] = 565;
$articles_arry['title'] = 'загалововок тестовой новости';
$articles_arry['alias'] = JFilterOutput::stringURLSafe(JString::trim(JLanguage::getInstance('ru-RU')->transliterate($title)));
$articles_arry['introtext'] = '';
$articles_arry['fulltext'] = 'проверка';
$articles_arry['images'] = json_encode($img_arr);
$articles_arry['state'] = 1;
$articles_arry['urls'] = '{"urla":false,"urlatext":"","targeta":"","urlb":false,"urlbtext":"","targetb":"","urlc":false,"urlctext":"","targetc":""}';
$articles_arry['attribs'] = '{"show_title":"","link_titles":"","show_tags":"","show_intro":"","info_block_position":"","show_category":"","link_category":"","show_parent_category":"","link_parent_category":"","show_author":"","link_author":"","show_create_date":"","show_modify_date":"","show_publish_date":"","show_item_navigation":"","show_icons":"","show_print_icon":"","show_email_icon":"","show_vote":"","show_hits":"","show_noauth":"","urls_position":"","alternative_readmore":"","article_layout":"","show_publishing_options":"","show_article_options":"","show_urls_images_backend":"","show_urls_images_frontend":""}';
$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'] = '';

createArticle($articles_arry);

function createArticle($data)
{
    global $article_model;

    $data['rules'] = array(
        'core.edit.delete' => array(),
        'core.edit.edit' => array(),
        'core.edit.state' => array(),
    );
    if(!$article_model->save($data))
    {
        $err_msg = $article_model->getError();
        echo JText::_($err_msg)."\n";
        return false;
    }
}



?>

В created_by написал id администратора, надеюсь это правильно. При запуске скрипта error, если включить отображение ошибок:
Код
Notice: Undefined variable: title in /public_html/ttt.php on line 23 Error: Failed to start application: Failed to start the session because headers have already been sent by "/public_html/ttt.php" at line 23.

23 стока это алиас, сразу после title идёт. Что с ним не так?
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
Переменную $title надо где-то выше определить и задать значение
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Переменную $title надо где-то выше определить и задать значение

Хорошо, задал алиас вручную, но теперь ругается вот так и даже не понять что не так:
Код
Error: Failed to start application: Failed to start application

Полный код скрипта:
Код
<?php


define( '_JEXEC', 1 );
define('JPATH_BASE', realpath(dirname(__FILE__)));
require_once ( JPATH_BASE .'/includes/defines.php' );
require_once ( JPATH_BASE .'/includes/framework.php' );
$basePath = JPATH_ADMINISTRATOR.'/components/com_content';
require_once $basePath.'/models/article.php';

$img_arr['image_intro'] = 'images/karta.png';
$img_arr['float_intro'] = '';
$img_arr['image_intro_alt'] = '';
$img_arr['image_intro_caption'] = '';
$img_arr['image_fulltext'] = '';
$img_arr['float_fulltext'] = '';
$img_arr['image_fulltext_alt'] = '';
$img_arr['image_fulltext_caption'] = '';
     
$articles_arry['catid'] = '9';
$articles_arry['created_by'] = 565;
$articles_arry['title'] = 'загалововок тестовой новости';
$articles_arry['alias'] = 'jghghghgjh';
$articles_arry['introtext'] = '';
$articles_arry['fulltext'] = 'проверка';
$articles_arry['images'] = json_encode($img_arr);
$articles_arry['state'] = 1;
$articles_arry['urls'] = '{"urla":false,"urlatext":"","targeta":"","urlb":false,"urlbtext":"","targetb":"","urlc":false,"urlctext":"","targetc":""}';
$articles_arry['attribs'] = '{"show_title":"","link_titles":"","show_tags":"","show_intro":"","info_block_position":"","show_category":"","link_category":"","show_parent_category":"","link_parent_category":"","show_author":"","link_author":"","show_create_date":"","show_modify_date":"","show_publish_date":"","show_item_navigation":"","show_icons":"","show_print_icon":"","show_email_icon":"","show_vote":"","show_hits":"","show_noauth":"","urls_position":"","alternative_readmore":"","article_layout":"","show_publishing_options":"","show_article_options":"","show_urls_images_backend":"","show_urls_images_frontend":""}';
$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'] = '';

createArticle($articles_arry);

function createArticle($data)
{
    global $article_model;

    $data['rules'] = array(
        'core.edit.delete' => array(),
        'core.edit.edit' => array(),
        'core.edit.state' => array(),
    );
    if(!$article_model->save($data))
    {
        $err_msg = $article_model->getError();
        echo JText::_($err_msg)."\n";
        return false;
    }
}



?>

Помогите решить, если можете, сам я 100% не разберусь. Слишком сложно для меня.
*

effrit

  • Легенда
  • 10132
  • 1118 / 13
  • effrit.com
Код
<?php
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);
}
$app = JFactory::getApplication('site');


$img_arr['image_intro'] = 'images/karta.png';
$img_arr['float_intro'] = '';
$img_arr['image_intro_alt'] = '';
$img_arr['image_intro_caption'] = '';
$img_arr['image_fulltext'] = '';
$img_arr['float_fulltext'] = '';
$img_arr['image_fulltext_alt'] = '';
$img_arr['image_fulltext_caption'] = '';
     
$articles_arry['catid'] = '9';
$articles_arry['created_by'] = 565;
$articles_arry['title'] = 'загалововок тестовой новости';
$articles_arry['alias'] = 'jghghghgjh';
$articles_arry['introtext'] = '';
$articles_arry['fulltext'] = 'проверка';
$articles_arry['images'] = json_encode($img_arr);
$articles_arry['state'] = 1;
$articles_arry['urls'] = '{"urla":false,"urlatext":"","targeta":"","urlb":false,"urlbtext":"","targetb":"","urlc":false,"urlctext":"","targetc":""}';
$articles_arry['attribs'] = '{"show_title":"","link_titles":"","show_tags":"","show_intro":"","info_block_position":"","show_category":"","link_category":"","show_parent_category":"","link_parent_category":"","show_author":"","link_author":"","show_create_date":"","show_modify_date":"","show_publish_date":"","show_item_navigation":"","show_icons":"","show_print_icon":"","show_email_icon":"","show_vote":"","show_hits":"","show_noauth":"","urls_position":"","alternative_readmore":"","article_layout":"","show_publishing_options":"","show_article_options":"","show_urls_images_backend":"","show_urls_images_frontend":""}';
$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'] = '';

createArticle($articles_arry);

function createArticle($data)
{
    $basePath = 'administrator/components/com_content';
    require_once $basePath.'/models/article.php';
$article_model =  JModelLegacy::getInstance('Article','ContentModel');
   // global $article_model;

    $data['rules'] = array(
        'core.edit.delete' => array(),
        'core.edit.edit' => array(),
        'core.edit.state' => array(),
    );
    if(!$article_model->save($data))
    {
        $err_msg = $article_model->getError();
        echo JText::_($err_msg)."\n";
        return false;
    }
}

?>


*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Код
<?php
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);
}
$app = JFactory::getApplication('site');


$img_arr['image_intro'] = 'images/karta.png';
$img_arr['float_intro'] = '';
$img_arr['image_intro_alt'] = '';
$img_arr['image_intro_caption'] = '';
$img_arr['image_fulltext'] = '';
$img_arr['float_fulltext'] = '';
$img_arr['image_fulltext_alt'] = '';
$img_arr['image_fulltext_caption'] = '';
     
$articles_arry['catid'] = '9';
$articles_arry['created_by'] = 565;
$articles_arry['title'] = 'загалововок тестовой новости';
$articles_arry['alias'] = 'jghghghgjh';
$articles_arry['introtext'] = '';
$articles_arry['fulltext'] = 'проверка';
$articles_arry['images'] = json_encode($img_arr);
$articles_arry['state'] = 1;
$articles_arry['urls'] = '{"urla":false,"urlatext":"","targeta":"","urlb":false,"urlbtext":"","targetb":"","urlc":false,"urlctext":"","targetc":""}';
$articles_arry['attribs'] = '{"show_title":"","link_titles":"","show_tags":"","show_intro":"","info_block_position":"","show_category":"","link_category":"","show_parent_category":"","link_parent_category":"","show_author":"","link_author":"","show_create_date":"","show_modify_date":"","show_publish_date":"","show_item_navigation":"","show_icons":"","show_print_icon":"","show_email_icon":"","show_vote":"","show_hits":"","show_noauth":"","urls_position":"","alternative_readmore":"","article_layout":"","show_publishing_options":"","show_article_options":"","show_urls_images_backend":"","show_urls_images_frontend":""}';
$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'] = '';

createArticle($articles_arry);

function createArticle($data)
{
    $basePath = 'administrator/components/com_content';
    require_once $basePath.'/models/article.php';
$article_model =  JModelLegacy::getInstance('Article','ContentModel');
   // global $article_model;

    $data['rules'] = array(
        'core.edit.delete' => array(),
        'core.edit.edit' => array(),
        'core.edit.state' => array(),
    );
    if(!$article_model->save($data))
    {
        $err_msg = $article_model->getError();
        echo JText::_($err_msg)."\n";
        return false;
    }
}

?>




Effrit, большое спасибо) Все работает, который раз уже помогаешь.

Только осталось два небольших вопроса. Как быть с алиосом? Надо бы чтобы он генерировался автоматом, при этом был уникальным, иначе будет ошибка при совпадении алиасов. Использовать текущую дату с точностью до секунд? Но ведь вполне есть вероятность, что два человека единомоментно решат опубликовать свои материалы. Что бы ты посоветовал?

Плюс, я не понимаю, что должна выдать функция createArticle при успехе. Решил проверить:
Код
$itog = createArticle($articles_arry);
echo "$itog";

В итоге, белый экран, хотя скрипт отработал и материал создался. Т. е. это функция не передает true при успехе?
*

effrit

  • Легенда
  • 10132
  • 1118 / 13
  • effrit.com
так у тебя при ошибке стоит
return false;

а при нормальном выполнении вообще ничего не возвращает.
после }
добавь
return true;
и будет 2 варианта вернувшегося значения (false/true)

по уникальности - добавь через дефис к дате rand() и шансы для дублей будут к минус бесконечности стремиться
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
так у тебя при ошибке стоит
return false;

а при нормальном выполнении вообще ничего не возвращает.
после }
добавь
return true;
и будет 2 варианта вернувшегося значения (false/true)

по уникальности - добавь через дефис к дате rand() и шансы для дублей будут к минус бесконечности стремиться

Спасибо) Скинь в личку телефон, либо Яндекс.Деньги. С меня причитается 300 р. за помощь.
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
Код
JFilterOutput::stringURLSafe(JString::trim(JLanguage::getInstance('ru-RU')->transliterate($title)));
Это как понимаю и генерирует алиас из заголовка.
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Код
JFilterOutput::stringURLSafe(JString::trim(JLanguage::getInstance('ru-RU')->transliterate($title)));
Это как понимаю и генерирует алиас из заголовка.

Да, но код не рабочий, там ошибки выдает в процессе.
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
41001197601****

Заправил. Effrit, еще раз - огромное спасибо, без тебя я бы долго еще проблему решал.
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
Да, но код не рабочий, там ошибки выдает в процессе.
Я же говорил, туда надо тайтл передавать со значением заголовка статьи
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Я же говорил, туда надо тайтл передавать со значением заголовка статьи

А он разве не передается вот здесь сам?
Код
transliterate($title)

Алиас в принципе генерируется, но прочему то все равно ошибки выдает. Да забейте, алиас вообще не принципиален,  меня случайные цифры вполне устроят.
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
Не передается, потому что переменная $title нигде не задана.
*

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
Зачем все это? Если -

Я хочу дать возможность гостям публиковать статьи - без регистрации и без авторизации.

Это все из коробки есть, только редактор JCE поставить. Есть мануалы пошаговые в бложиках, гуглите.
И в категорию можно только одну, и с премодерацией, если надо.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Зачем все это? Если -

Это все из коробки есть, только редактор JCE поставить. Есть мануалы пошаговые в бложиках, гуглите.
И в категорию можно только одну, и с премодерацией, если надо.


Стандартного функционала недостаточно для задумки. Я еще планирую внедрить в форму рекапчу + замутить рассылки с платной подпиской. Короче, там не все так просто, это долгострой с кучей доп. функций. Чувствую, как закончу php буду знать в разы лучше)
*

ChaosHead

  • Гуру
  • 5241
  • 451 / 13
Стандартного функционала недостаточно для задумки. Я еще планирую внедрить в форму рекапчу
Менеджер материалов - Настройки - Форма редактирования
*

Efanych

  • Глобальный модератор
  • 4684
  • 644 / 0
  • Меняю свою жизнь на 360°!
Этот мануал мне больше нравится...
Создание сайтов, шаблонов, помощь в решении проблем.
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
Подскажите, кто знает, а как добавлять в статью description? Поле ниже, это keywords:
Код
$articles_arry['metakey'] = 'ключевики';
*

effrit

  • Легенда
  • 10132
  • 1118 / 13
  • effrit.com
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
ну, судя по тому, что в базе поле называется metadesc, надо по аналогии с ключевиками попробовать сделать.

То есть просто добавить строку ниже в скрипт и все будет как надо?
Код
$articles_arry['metadesc'] = 'пишу описание статьи для поисковых систем';
« Последнее редактирование: 24.10.2018, 14:23:24 от dm-krv »
*

dm-krv

  • Завсегдатай
  • 1028
  • 28 / 0
ну сделай дамп да проверь

Да, все работает.
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Этот мануал мне больше нравится...
Лучше через модель. Тогда и плагинами будет обрабатываться.
Код: php
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
BaseDatabaseModel::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_content/models');
$model  = BaseDatabaseModel::getInstance('Article', 'ContentModel', array('ignore_request' => true));

// Собираем массив данных материала
$data = array();

// Сохраняем материал
$model->save($data);

Код писал, тут от руки, так что могут быть ошибки. Но принцип такой.
« Последнее редактирование: 25.10.2018, 18:33:00 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[РЕШЕНО] Добавить класс при условии JS?

Автор warlocksp

Ответов: 21
Просмотров: 1802
Последний ответ 26.02.2020, 11:07:53
от robert
Вышел Elxis 5.0 Uranus форк Joomla

Автор altvvc

Ответов: 7
Просмотров: 534
Последний ответ 21.05.2019, 22:19:10
от voland
[РЕШЕНО] Защита сайтов друг от друга при помощи open_basedir

Автор dm-krv

Ответов: 14
Просмотров: 2010
Последний ответ 22.04.2019, 17:46:48
от dm-krv
Бесплатный звонок с сайта, через интернет [РЕШЕНО]

Автор dm-krv

Ответов: 8
Просмотров: 552
Последний ответ 03.04.2019, 09:43:32
от dm-krv
JQuery: как проигнорировать cors при парсинге? [РЕШЕНО]

Автор dm-krv

Ответов: 20
Просмотров: 2344
Последний ответ 17.01.2019, 20:11:58
от fsv