Spade
Mini Shell
services/provider.php000064400000002632151171106030010730 0ustar00<?php
/**
* @package Joomla.Plugin
* @subpackage Sampledata.multilang
*
* @copyright (C) 2023 Open Source Matters, Inc.
<https://www.joomla.org>
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
\defined('_JEXEC') or die;
use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Database\DatabaseInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Joomla\Plugin\SampleData\MultiLanguage\Extension\MultiLanguage;
return new class () implements ServiceProviderInterface {
/**
* Registers the service provider with a DI container.
*
* @param Container $container The DI container.
*
* @return void
*
* @since 4.4.0
*/
public function register(Container $container): void
{
$container->set(
PluginInterface::class,
function (Container $container) {
$plugin = new MultiLanguage(
$container->get(DispatcherInterface::class),
(array) PluginHelper::getPlugin('sampledata',
'multilang')
);
$plugin->setApplication(Factory::getApplication());
$plugin->setDatabase($container->get(DatabaseInterface::class));
return $plugin;
}
);
}
};
multilang.xml000064400000001674151171106030007265 0ustar00<?xml
version="1.0" encoding="UTF-8"?>
<extension type="plugin" group="sampledata"
method="upgrade">
<name>plg_sampledata_multilang</name>
<author>Joomla! Project</author>
<creationDate>2018-07</creationDate>
<copyright>(C) 2018 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see
LICENSE.txt</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>4.0.0</version>
<description>PLG_SAMPLEDATA_MULTILANG_XML_DESCRIPTION</description>
<namespace
path="src">Joomla\Plugin\SampleData\MultiLanguage</namespace>
<files>
<folder plugin="multilang">services</folder>
<folder>src</folder>
</files>
<languages>
<language
tag="en-GB">language/en-GB/plg_sampledata_multilang.ini</language>
<language
tag="en-GB">language/en-GB/plg_sampledata_multilang.sys.ini</language>
</languages>
<config>
<fields name="params">
</fields>
</config>
</extension>
src/Extension/MultiLanguage.php000064400000126133151171106030012557
0ustar00<?php
/**
* @package Joomla.Plugin
* @subpackage Sampledata.multilang
*
* @copyright (C) 2018 Open Source Matters, Inc.
<https://www.joomla.org>
* @license GNU General Public License version 2 or later; see
LICENSE.txt
*/
namespace Joomla\Plugin\SampleData\MultiLanguage\Extension;
use Joomla\CMS\Application\ApplicationHelper;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Extension\ExtensionHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Installer\Installer;
use Joomla\CMS\Language\Language;
use Joomla\CMS\Language\LanguageHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Workflow\Workflow;
use Joomla\Database\DatabaseAwareTrait;
use Joomla\Database\Exception\ExecutionFailureException;
use Joomla\Database\ParameterType;
// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects
/**
* Sampledata - Multilang Plugin
*
* @since 4.0.0
*/
final class MultiLanguage extends CMSPlugin
{
use DatabaseAwareTrait;
/**
* Affects constructor behavior. If true, language files will be loaded
automatically.
*
* @var boolean
*
* @since 4.0.0
*/
protected $autoloadLanguage = true;
/**
* @var string
*
* @since 4.0.0
*/
protected $path = null;
/**
* @var integer Id, author of all generated content.
*
* @since 4.0.0
*/
protected $adminId;
/**
* Get an overview of the proposed sampledata.
*
* @return \stdClass|void Will be converted into the JSON response to
the module.
*
* @since 4.0.0
*/
public function onSampledataGetOverview()
{
if
(!$this->getApplication()->getIdentity()->authorise('core.create',
'com_content')) {
return;
}
$data = new \stdClass();
$data->name = $this->_name;
$data->title =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_OVERVIEW_TITLE');
$data->description =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_OVERVIEW_DESC');
$data->icon = 'wifi';
$data->steps = 8;
return $data;
}
/**
* First step to enable the Language filter plugin.
*
* @return array|void Will be converted into the JSON response to the
module.
*
* @since 4.0.0
*/
public function onAjaxSampledataApplyStep1()
{
if (!Session::checkToken('get') ||
$this->getApplication()->getInput()->get('type') !=
$this->_name) {
return;
}
$languages = LanguageHelper::getContentLanguages([0, 1]);
if (\count($languages) < 2) {
$response = [];
$response['success'] = false;
$response['message'] =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_MISSING_LANGUAGE');
return $response;
}
if (!$this->enablePlugin('plg_system_languagefilter'))
{
$response = [];
$response['success'] = false;
$lang = $this->getApplication()->getLanguage();
$lang->load('plg_system_languagefilter',
JPATH_ADMINISTRATOR);
$message = $lang->_('PLG_SYSTEM_LANGUAGEFILTER');
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_LANGFILTER', 2,
$message);
return $response;
}
$response = [];
$response['success'] = true;
$response['message'] =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_STEP1_SUCCESS');
return $response;
}
/**
* Second step to add a language switcher module
*
* @return array|void Will be converted into the JSON response to the
module.
*
* @since 4.0.0
*/
public function onAjaxSampledataApplyStep2()
{
if (!Session::checkToken('get') ||
$this->getApplication()->getInput()->get('type') !=
$this->_name) {
return;
}
if (!ComponentHelper::isEnabled('com_modules') ||
!$this->getApplication()->getIdentity()->authorise('core.create',
'com_modules')) {
$response = [];
$response['success'] = true;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_STEP_SKIPPED', 2,
'com_modules');
return $response;
}
if (!$this->addModuleLanguageSwitcher()) {
$response = [];
$response['success'] = false;
$lang = $this->getApplication()->getLanguage();
$lang->load('mod_languages', JPATH_SITE);
$message = $lang->_('MOD_LANGUAGES');
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_SWITCHER', 2,
$message);
return $response;
}
$response = [];
$response['success'] = true;
$response['message'] =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_STEP2_SUCCESS');
return $response;
}
/**
* Third step to make sure all content languages are published
*
* @return array|void Will be converted into the JSON response to the
module.
*
* @since 4.0.0
*/
public function onAjaxSampledataApplyStep3()
{
if (!Session::checkToken('get') ||
$this->getApplication()->getInput()->get('type') !=
$this->_name) {
return;
}
if (!ComponentHelper::isEnabled('com_languages')) {
$response = [];
$response['success'] = true;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_STEP_SKIPPED', 3,
'com_languages');
return $response;
}
if (!$this->publishContentLanguages()) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_CONTENTLANGUAGES',
3);
return $response;
}
$response = [];
$response['success'] = true;
$response['message'] =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_STEP3_SUCCESS');
return $response;
}
/**
* Fourth step to create Menus and list all categories menu items
*
* @return array|void Will be converted into the JSON response to the
module.
*
* @since 4.0.0
*/
public function onAjaxSampledataApplyStep4()
{
if (!Session::checkToken('get') ||
$this->getApplication()->getInput()->get('type') !=
$this->_name) {
return;
}
if (!ComponentHelper::isEnabled('com_menus') ||
!$this->getApplication()->getIdentity()->authorise('core.create',
'com_menus')) {
$response = [];
$response['success'] = true;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_STEP_SKIPPED', 4,
'com_menus');
return $response;
}
$siteLanguages = $this->getInstalledlangsFrontend();
foreach ($siteLanguages as $siteLang) {
if (!$this->addMenuGroup($siteLang)) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_MENUS', 4,
$siteLang->language);
return $response;
}
if (!$tableMenuItem =
$this->addAllCategoriesMenuItem($siteLang)) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_ALLCATEGORIES', 4,
$siteLang->language);
return $response;
}
$groupedAssociations['com_menus.item'][$siteLang->language] =
$tableMenuItem->id;
}
if (!$this->addAssociations($groupedAssociations)) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_ASSOC_ALLCATEGORIES',
4);
return $response;
}
$response = [];
$response['success'] = true;
$response['message'] =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_STEP4_SUCCESS');
return $response;
}
/**
* Fifth step to add menu modules
*
* @return array|void Will be converted into the JSON response to the
module.
*
* @since 4.0.0
*/
public function onAjaxSampledataApplyStep5()
{
if (!Session::checkToken('get') ||
$this->getApplication()->getInput()->get('type') !=
$this->_name) {
return;
}
if (!ComponentHelper::isEnabled('com_modules') ||
!$this->getApplication()->getIdentity()->authorise('core.create',
'com_modules')) {
$response = [];
$response['success'] = true;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_STEP_SKIPPED', 5,
'com_modules');
return $response;
}
$siteLanguages = $this->getInstalledlangsFrontend();
foreach ($siteLanguages as $siteLang) {
if (!$this->addModuleMenu($siteLang)) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_MENUMODULES', 5,
$siteLang->language);
return $response;
}
}
$response = [];
$response['success'] = true;
$response['message'] =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_STEP5_SUCCESS');
return $response;
}
/**
* Sixth step to add workflow, categories, articles and blog menu items
*
* @return array|void Will be converted into the JSON response to the
module.
*
* @since 4.0.0
*/
public function onAjaxSampledataApplyStep6()
{
if (!Session::checkToken('get') ||
$this->getApplication()->getInput()->get('type') !=
$this->_name) {
return;
}
if (!ComponentHelper::isEnabled('com_content') ||
!$this->getApplication()->getIdentity()->authorise('core.create',
'com_content')) {
$response = [];
$response['success'] = true;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_STEP_SKIPPED', 6,
'com_content');
return $response;
}
if (!ComponentHelper::isEnabled('com_categories') ||
!$this->getApplication()->getIdentity()->authorise('core.create',
'com_content.category')) {
$response = [];
$response['success'] = true;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_STEP_SKIPPED', 6,
'com_categories');
return $response;
}
$siteLanguages = $this->getInstalledlangsFrontend();
ComponentHelper::getParams('com_content')->set('workflow_enabled',
0);
foreach ($siteLanguages as $siteLang) {
if (!$tableCategory = $this->addCategory($siteLang)) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_CATEGORY', 6,
$siteLang->language);
return $response;
}
$groupedAssociations['com_categories.item'][$siteLang->language]
= $tableCategory->id;
if (!$tableArticle = $this->addArticle($siteLang,
$tableCategory->id)) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_ARTICLE', 6,
$siteLang->language);
return $response;
}
$groupedAssociations['com_content.item'][$siteLang->language]
= $tableArticle->id;
if (!$tableMenuItem = $this->addBlogMenuItem($siteLang,
$tableCategory->id)) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_BLOG', 6,
$siteLang->language);
return $response;
}
$groupedAssociations['com_menus.item'][$siteLang->language] =
$tableMenuItem->id;
}
if (!$this->addAssociations($groupedAssociations)) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_ASSOC_VARIOUS', 6);
return $response;
}
$response = [];
$response['success'] = true;
$response['message'] =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_STEP6_SUCCESS');
return $response;
}
/**
* Seventh step to disable the mainmenu module whose home page is set
to All languages.
*
* @return array|void Will be converted into the JSON response to the
module.
*
* @since 4.0.0
*/
public function onAjaxSampledataApplyStep7()
{
if (!Session::checkToken('get') ||
$this->getApplication()->getInput()->get('type') !=
$this->_name) {
return;
}
if (!ComponentHelper::isEnabled('com_modules')) {
$response = [];
$response['success'] = true;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_STEP_SKIPPED', 7,
'com_modules');
return $response;
}
if (!$this->disableModuleMainMenu()) {
$response = [];
$response['success'] = false;
$response['message'] =
Text::sprintf('PLG_SAMPLEDATA_MULTILANG_ERROR_MAINMENU_MODULE',
7);
return $response;
}
$response = [];
$response['success'] = true;
$response['message'] =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_STEP7_SUCCESS');
return $response;
}
/**
* Final step to show completion of sampledata.
*
* @return array|void Will be converted into the JSON response to the
module.
*
* @since 4.0.0
*/
public function onAjaxSampledataApplyStep8()
{
if
($this->getApplication()->getInput()->get('type') !==
$this->_name) {
return;
}
$response['success'] = true;
$response['message'] =
$this->getApplication()->getLanguage()->_('PLG_SAMPLEDATA_MULTILANG_STEP8_SUCCESS');
return $response;
}
/**
* Enable a Joomla plugin.
*
* @param string $pluginName The name of plugin.
*
* @return boolean
*
* @since 4.0.0
*/
private function enablePlugin($pluginName)
{
// Create a new db object.
$db = $this->getDatabase();
$query = $db->getQuery(true);
$query
->update($db->quoteName('#__extensions'))
->set($db->quoteName('enabled') . ' =
1')
->where($db->quoteName('name') . ' =
:pluginname')
->where($db->quoteName('type') . ' =
' . $db->quote('plugin'))
->bind(':pluginname', $pluginName);
$db->setQuery($query);
try {
$db->execute();
} catch (ExecutionFailureException $e) {
return false;
}
// Store language filter plugin parameters.
if ($pluginName == 'plg_system_languagefilter') {
$params = '{'
. '"detect_browser":"0",'
. '"automatic_change":"1",'
. '"item_associations":"1",'
.
'"remove_default_prefix":"0",'
. '"lang_cookie":"0",'
. '"alternate_meta":"1"'
. '}';
$query
->clear()
->update($db->quoteName('#__extensions'))
->set($db->quoteName('params') . ' =
:params')
->where($db->quoteName('name') . ' =
' . $db->quote('plg_system_languagefilter'))
->where($db->quoteName('type') . ' =
' . $db->quote('plugin'))
->bind(':params', $params);
$db->setQuery($query);
try {
$db->execute();
} catch (ExecutionFailureException $e) {
return false;
}
}
return true;
}
/**
* Disable Default Main Menu Module.
*
* @return boolean
*
* @since 4.0.0
*/
private function disableModuleMainMenu()
{
// Create a new db object.
$db = $this->getDatabase();
$query = $db->getQuery(true);
// Disable main menu module with Home set to ALL languages.
$query
->update($db->quoteName('#__modules'))
->set($db->quoteName('published') . ' =
0')
->where(
[
$db->quoteName('client_id') . ' =
0',
$db->quoteName('module') . ' = '
. $db->quote('mod_menu'),
$db->quoteName('language') . ' =
' . $db->quote('*'),
$db->quoteName('position') . ' =
' . $db->quote('sidebar-right'),
]
);
$db->setQuery($query);
try {
$db->execute();
} catch (ExecutionFailureException $e) {
return false;
}
return true;
}
/**
* Enable the Language Switcher Module.
*
* @return boolean
*
* @since 4.0.0
*/
private function addModuleLanguageSwitcher()
{
$tableModule = Table::getInstance('Module',
'Joomla\\CMS\\Table\\');
$moduleData = [
'id' => 0,
'title' => 'Language Switcher',
'note' => '',
'content' => '',
'position' => 'sidebar-right',
'module' => 'mod_languages',
'access' => 1,
'showtitle' => 0,
'params' =>
'{"header_text":"","footer_text":"","dropdown":"0","image":"1","inline":"1","show_active":"1",'
.
'"full_name":"1","layout":"_:default","moduleclass_sfx":"","cache":"0","cache_time":"900","cachemode":"itemid",'
.
'"module_tag":"div","bootstrap_size":"0","header_tag":"h3","header_class":"","style":"0"}',
'client_id' => 0,
'language' => '*',
'published' => 1,
'rules' => [],
];
// Bind the data.
if (!$tableModule->bind($moduleData)) {
return false;
}
// Check the data.
if (!$tableModule->check()) {
return false;
}
// Store the data.
if (!$tableModule->store()) {
return false;
}
return $this->addModuleInModuleMenu((int) $tableModule->id);
}
/**
* Add Module Menu.
*
* @param \stdClass $itemLanguage Language Object.
*
* @return boolean
*
* @since 4.0.0
*/
private function addModuleMenu($itemLanguage)
{
$tableModule = Table::getInstance('Module',
'Joomla\\CMS\\Table\\');
$title = 'Main menu ' . $itemLanguage->language;
$moduleData = [
'id' => 0,
'title' => $title,
'note' => '',
'content' => '',
'position' => 'sidebar-right',
'module' => 'mod_menu',
'access' => 1,
'showtitle' => 1,
'params' =>
'{"menutype":"mainmenu-' .
strtolower($itemLanguage->language)
.
'","startLevel":"0","endLevel":"0","showAllChildren":"0","tag_id":"","class_sfx":"","window_open":"",'
.
'"layout":"","moduleclass_sfx":"","cache":"1","cache_time":"900","cachemode":"itemid"}',
'client_id' => 0,
'language' => $itemLanguage->language,
'published' => 1,
'rules' => [],
];
// Bind the data.
if (!$tableModule->bind($moduleData)) {
return false;
}
// Check the data.
if (!$tableModule->check()) {
return false;
}
// Store the data.
if (!$tableModule->store()) {
return false;
}
return $this->addModuleInModuleMenu((int) $tableModule->id);
}
/**
* Add Menu Group.
*
* @param \stdClass $itemLanguage Language Object.
*
* @return boolean
*
* @since 4.0.0
*/
private function addMenuGroup($itemLanguage)
{
// Add Menu Group.
$menuTable =
$this->getApplication()->bootComponent('com_menus')->getMVCFactory()->createTable('MenuType',
'Administrator', ['dbo' =>
$this->getDatabase()]);
$menuData = [
'id' => 0,
'menutype' => 'mainmenu-' .
strtolower($itemLanguage->language),
'title' => 'Main Menu (' .
$itemLanguage->language . ')',
'description' => 'The main menu for the site
in language ' . $itemLanguage->name,
];
// Bind the data.
if (!$menuTable->bind($menuData)) {
return false;
}
// Check the data.
if (!$menuTable->check()) {
return false;
}
// Store the data.
if (!$menuTable->store()) {
return false;
}
return true;
}
/**
* Add List All Categories Menu Item for new router.
*
* @param \stdClass $itemLanguage Language Object.
*
* @return Table|boolean Menu Item Object. False otherwise.
*
* @since 4.0.0
*/
private function addAllCategoriesMenuItem($itemLanguage)
{
// Add Menu Item.
$tableItem =
$this->getApplication()->bootComponent('com_menus')->getMVCFactory()->createTable('Menu',
'Administrator', ['dbo' =>
$this->getDatabase()]);
$newlanguage = new Language($itemLanguage->language, false);
$newlanguage->load('joomla', JPATH_ADMINISTRATOR,
$itemLanguage->language, true);
$title = $newlanguage->_('JCATEGORIES');
$alias = 'allcategories_' . $itemLanguage->language;
$menuItem = [
'title' => $title,
'alias' => $alias,
'menutype' => 'mainmenu-' .
strtolower($itemLanguage->language),
'type' => 'component',
'link' =>
'index.php?option=com_content&view=categories&id=0',
'component_id' =>
ExtensionHelper::getExtensionRecord('com_content',
'component')->extension_id,
'published' => 1,
'parent_id' => 1,
'level' => 1,
'home' => 0,
'params' =>
'{"show_base_description":"","categories_description":"","maxLevelcat":"",'
.
'"show_empty_categories_cat":"","show_subcat_desc_cat":"","show_cat_num_articles_cat":"",'
.
'"show_category_title":"","show_description":"","show_description_image":"","maxLevel":"",'
.
'"show_empty_categories":"","show_no_articles":"","show_subcat_desc":"","show_cat_num_articles":"",'
.
'"num_leading_articles":"","num_intro_articles":"","num_links":"",'
.
'"show_subcategory_content":"","orderby_pri":"","orderby_sec":"",'
.
'"order_date":"","show_pagination_limit":"","filter_field":"","show_headings":"",'
.
'"list_show_date":"","date_format":"","list_show_hits":"","list_show_author":"","display_num":"10",'
.
'"show_pagination":"","show_pagination_results":"","article_layout":"_:default","show_title":"",'
.
'"link_titles":"","show_intro":"","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_vote":"",'
.
'"show_readmore":"","show_readmore_title":"","show_hits":"","show_noauth":"","show_feed_link":"",'
.
'"feed_summary":"","menu-anchor_title":"","menu-anchor_css":"","menu_image":"","menu_image_css":"",'
.
'"menu_text":1,"menu_show":0,"page_title":"","show_page_heading":"","page_heading":"",'
.
'"pageclass_sfx":"","menu-meta_description":"","robots":""}',
'language' => $itemLanguage->language,
];
// Bind the data.
if (!$tableItem->bind($menuItem)) {
return false;
}
$tableItem->setLocation($menuItem['parent_id'],
'last-child');
// Check the data.
if (!$tableItem->check()) {
return false;
}
// Store the data.
if (!$tableItem->store()) {
return false;
}
// Rebuild the tree path.
if (!$tableItem->rebuildPath($tableItem->id)) {
return false;
}
return $tableItem;
}
/**
* Add Blog Menu Item.
*
* @param \stdClass $itemLanguage Language Object.
* @param integer $categoryId The id of the category displayed
by the blog.
*
* @return Table|boolean Menu Item Object. False otherwise.
*
* @since 4.0.0
*/
private function addBlogMenuItem($itemLanguage, $categoryId)
{
// Add Menu Item.
$tableItem =
$this->getApplication()->bootComponent('com_menus')->getMVCFactory()->createTable('Menu',
'Administrator', ['dbo' =>
$this->getDatabase()]);
$newlanguage = new Language($itemLanguage->language, false);
$newlanguage->load('com_languages',
JPATH_ADMINISTRATOR, $itemLanguage->language, true);
$title = $newlanguage->_('COM_LANGUAGES_HOMEPAGE');
$alias = 'home_' . $itemLanguage->language;
$menuItem = [
'title' => $title,
'alias' => $alias,
'menutype' => 'mainmenu-' .
strtolower($itemLanguage->language),
'type' => 'component',
'link' =>
'index.php?option=com_content&view=category&layout=blog&id='
. $categoryId,
'component_id' =>
ExtensionHelper::getExtensionRecord('com_content',
'component')->extension_id,
'published' => 1,
'parent_id' => 1,
'level' => 1,
'home' => 1,
'params' =>
'{"layout_type":"blog","show_category_heading_title_text":"","show_category_title":"",'
.
'"show_description":"","show_description_image":"","maxLevel":"","show_empty_categories":"",'
.
'"show_no_articles":"","show_subcat_desc":"","show_cat_num_articles":"","show_cat_tags":"",'
.
'"blog_class_leading":"","blog_class":"","num_leading_articles":"1","num_intro_articles":"3",'
.
'"num_links":"0","show_subcategory_content":"","link_intro_image":"","orderby_pri":"",'
.
'"orderby_sec":"front","order_date":"","show_pagination":"2","show_pagination_results":"1",'
.
'"show_featured":"","article_layout":"_:default","show_title":"","link_titles":"","show_intro":"","info_block_position":"",'
.
'"info_block_show_title":"","show_category":"","link_category":"","show_parent_category":"",'
.
'"link_parent_category":"","show_associations":"","show_author":"","link_author":"",'
.
'"show_create_date":"","show_modify_date":"","show_publish_date":"","show_item_navigation":"",'
.
'"show_vote":"","show_readmore":"","show_readmore_title":"","show_hits":"","show_tags":"",'
.
'"show_noauth":"","show_feed_link":"1","feed_summary":"","menu-anchor_title":"","menu-anchor_css":"",'
.
'"menu_image":"","menu_image_css":"","menu_text":1,"menu_show":1,"page_title":"","show_page_heading":"1",'
.
'"page_heading":"","pageclass_sfx":"","menu-meta_description":"","robots":""}',
'language' => $itemLanguage->language,
];
// Bind the data.
if (!$tableItem->bind($menuItem)) {
return false;
}
$tableItem->setLocation($menuItem['parent_id'],
'last-child');
// Check the data.
if (!$tableItem->check()) {
return false;
}
// Store the data.
if (!$tableItem->store()) {
return false;
}
// Rebuild the tree path.
if (!$tableItem->rebuildPath($tableItem->id)) {
return false;
}
return $tableItem;
}
/**
* Create the language associations.
*
* @param array $groupedAssociations Array of language associations
for all items.
*
* @return boolean True on success.
*
* @since 4.0.0
*/
private function addAssociations($groupedAssociations)
{
$db = $this->getDatabase();
foreach ($groupedAssociations as $context => $associations) {
$key = md5(json_encode($associations));
$query = $db->getQuery(true)
->insert($db->quoteName('#__associations'));
foreach ($associations as $language => $id) {
$query->values(
implode(
',',
$query->bindArray(
[
$id,
$context,
$key,
],
[
ParameterType::INTEGER,
ParameterType::STRING,
ParameterType::STRING,
]
)
)
);
}
$db->setQuery($query);
try {
$db->execute();
} catch (\RuntimeException $e) {
return false;
}
}
return true;
}
/**
* Add a Module in Module menus.
*
* @param integer $moduleId The Id of module.
*
* @return boolean
*
* @since 4.0.0
*/
private function addModuleInModuleMenu($moduleId)
{
// Create a new db object.
$db = $this->getDatabase();
$query = $db->getQuery(true);
$moduleId = (int) $moduleId;
// Add Module in Module menus.
$query->insert($db->quoteName('#__modules_menu'))
->columns($db->quoteName(['moduleid',
'menuid']))
->values(':moduleId, 0')
->bind(':moduleId', $moduleId,
ParameterType::INTEGER);
$db->setQuery($query);
try {
$db->execute();
} catch (\RuntimeException $e) {
return false;
}
return true;
}
/**
* Method to create a category for a specific language.
*
* @param \stdClass $itemLanguage Language Object.
*
* @return Table|boolean Category Object. False otherwise.
*
* @since 4.0.0
*/
public function addCategory($itemLanguage)
{
$newlanguage = new Language($itemLanguage->language, false);
$newlanguage->load('joomla', JPATH_ADMINISTRATOR,
$itemLanguage->language, true);
$title = $newlanguage->_('JCATEGORY');
$alias = ApplicationHelper::stringURLSafe($title);
$app = Factory::getApplication();
// Set unicodeslugs if alias is empty
if (trim(str_replace('-', '', $alias) ==
'')) {
$unicode = $app->set('unicodeslugs', 1);
$alias = ApplicationHelper::stringURLSafe($title);
$app->set('unicodeslugs', $unicode);
}
// Initialize a new category.
$category =
$this->getApplication()->bootComponent('com_categories')->getMVCFactory()->createTable('Category',
'Administrator', ['dbo' =>
$this->getDatabase()]);
$data = [
'extension' => 'com_content',
'title' => $title . ' (' .
strtolower($itemLanguage->language) . ')',
'alias' => $alias . ' (' .
strtolower($itemLanguage->language) . ')',
'description' => '',
'published' => 1,
'access' => 1,
'params' =>
'{"target":"","image":""}',
'metadesc' => '',
'metakey' => '',
'metadata' =>
'{"page_title":"","author":"","robots":""}',
'created_time' =>
Factory::getDate()->toSql(),
'created_user_id' => (int) $this->getAdminId(),
'language' => $itemLanguage->language,
'rules' => [],
'parent_id' => 1,
];
// Set the location in the tree.
$category->setLocation(1, 'last-child');
// Bind the data to the table
if (!$category->bind($data)) {
return false;
}
// Check to make sure our data is valid.
if (!$category->check()) {
return false;
}
// Store the category.
if (!$category->store(true)) {
return false;
}
// Build the path for our category.
$category->rebuildPath($category->id);
return $category;
}
/**
* Create an article in a specific language.
*
* @param \stdClass $itemLanguage Language Object.
* @param integer $categoryId The id of the category where we
want to add the article.
*
* @return Table|boolean Article Object. False otherwise.
*
* @since 4.0.0
*/
private function addArticle($itemLanguage, $categoryId)
{
$db = $this->getDatabase();
$newlanguage = new Language($itemLanguage->language, false);
$newlanguage->load('com_content.sys',
JPATH_ADMINISTRATOR, $itemLanguage->language, true);
$title =
$newlanguage->_('COM_CONTENT_CONTENT_TYPE_ARTICLE');
$currentDate = Factory::getDate()->toSql();
$alias = ApplicationHelper::stringURLSafe($title);
// Set unicodeslugs if alias is empty
if (trim(str_replace('-', '', $alias) ==
'')) {
$unicode =
$this->getApplication()->set('unicodeslugs', 1);
$alias = ApplicationHelper::stringURLSafe($title);
$this->getApplication()->set('unicodeslugs',
$unicode);
}
// Initialize a new article.
$article =
$this->getApplication()->bootComponent('com_content')->getMVCFactory()->createTable('Article',
'Administrator', ['dbo' =>
$this->getDatabase()]);
$data = [
'title' => $title . ' (' .
strtolower($itemLanguage->language) . ')',
'alias' => $alias . ' (' .
strtolower($itemLanguage->language) . ')',
'introtext' => '<p>Lorem ipsum ad his
scripta blandit partiendo, eum fastidii accumsan euripidis'
. ' in, eum liber hendrerit an. Qui ut wisi vocibus
suscipiantur, quo dicit'
. ' ridens inciderint id. Quo mundi lobortis
reformidans eu, legimus senserit'
. 'definiebas an eos. Eu sit tincidunt incorrupte
definitionem, vis mutat'
. ' affert percipit cu, eirmod consectetuer
signiferumque eu per. In usu latine'
. 'equidem dolores. Quo no falli viris intellegam, ut
fugit veritus placerat'
. 'per. Ius id vidit volumus mandamus, vide veritus
democritum te nec, ei eos'
. 'debet libris consulatu.</p>',
'fulltext' => '',
'images' => json_encode([]),
'urls' => json_encode([]),
'created' => $currentDate,
'created_by' => (int)
$this->getAdminId(),
'created_by_alias' => 'Joomla',
'publish_up' => $currentDate,
'publish_down' => null,
'version' => 1,
'catid' => $categoryId,
'metadata' =>
'{"robots":"","author":"","rights":"","tags":null}',
'metakey' => '',
'metadesc' => '',
'language' => $itemLanguage->language,
'state' => 1,
'featured' => 1,
'attribs' => [],
'rules' => [],
];
// Bind the data to the table
if (!$article->bind($data)) {
return false;
}
// Check to make sure our data is valid.
if (!$article->check()) {
return false;
}
// Now store the category.
if (!$article->store(true)) {
return false;
}
// Get the new item ID.
$newId = $article->get('id');
$query = $db->getQuery(true)
->insert($db->quoteName('#__content_frontpage'))
->values($newId . ', 0, NULL, NULL');
$db->setQuery($query);
try {
$db->execute();
} catch (ExecutionFailureException $e) {
return false;
}
$workflow = new Workflow('com_content.article',
$this->getApplication(), $db);
try {
$stage_id =
$workflow->getDefaultStageByCategory($categoryId);
if ($stage_id) {
$workflow->createAssociation($newId, $stage_id);
}
} catch (ExecutionFailureException $e) {
return false;
}
return $article;
}
/**
* Publish the Installed Content Languages.
*
* @return boolean
*
* @since 4.0.0
*/
private function publishContentLanguages()
{
// Publish the Content Languages.
$tableLanguage = Table::getInstance('Language');
$siteLanguages = $this->getInstalledlangs('site');
// For each content language.
foreach ($siteLanguages as $siteLang) {
if ($tableLanguage->load(['lang_code' =>
$siteLang->language, 'published' => 0]) &&
!$tableLanguage->publish()) {
$this->getApplication()->enqueueMessage(Text::sprintf('INSTL_DEFAULTLANGUAGE_COULD_NOT_CREATE_CONTENT_LANGUAGE',
$siteLang->name), 'warning');
}
}
return true;
}
/**
* Get Languages item data for the Administrator.
*
* @return array
*
* @since 4.0.0
*/
public function getInstalledlangsAdministrator()
{
return $this->getInstalledlangs('administrator');
}
/**
* Get Languages item data for the Frontend.
*
* @return array List of installed languages in the frontend
application.
*
* @since 4.0.0
*/
public function getInstalledlangsFrontend()
{
return $this->getInstalledlangs('site');
}
/**
* Get Installed Languages.
*
* @param string $clientName Name of the cms client.
*
* @return array
*
* @since 4.0.0
*/
protected function getInstalledlangs($clientName =
'administrator')
{
// Get information.
$path = $this->getPath();
$client = $this->getClient($clientName);
$langlist = $this->getLanguageList($client->id);
// Compute all the languages.
$data = [];
foreach ($langlist as $lang) {
$file = $path . '/' . $lang . '/' . $lang .
'.xml';
if (!is_file($file)) {
$file = $path . '/' . $lang .
'/langmetadata.xml';
}
$info = Installer::parseXMLInstallFile($file);
$row = new \stdClass();
$row->language = $lang;
if (!\is_array($info)) {
continue;
}
foreach ($info as $key => $value) {
$row->$key = $value;
}
// If current then set published.
$params =
ComponentHelper::getParams('com_languages');
if ($params->get($client->name, 'en-GB') ==
$row->language) {
$row->published = 1;
} else {
$row->published = 0;
}
$row->checked_out = null;
$data[] = $row;
}
usort($data, [$this, 'compareLanguages']);
return $data;
}
/**
* Get installed languages data.
*
* @param integer $clientId The client ID to retrieve data for.
*
* @return object The language data.
*
* @since 4.0.0
*/
protected function getLanguageList($clientId = 1)
{
// Create a new db object.
$db = $this->getDatabase();
$query = $db->getQuery(true);
// Select field element from the extensions table.
$query->select($db->quoteName(['element',
'name']))
->from($db->quoteName('#__extensions'))
->where(
[
$db->quoteName('type') . ' = ' .
$db->quote('language'),
$db->quoteName('state') . ' =
0',
$db->quoteName('enabled') . ' =
1',
$db->quoteName('client_id') . ' =
:clientid',
]
)
->bind(':clientid', $clientId,
ParameterType::INTEGER);
$db->setQuery($query);
return $db->loadColumn();
}
/**
* Compare two languages in order to sort them.
*
* @param object $lang1 The first language.
* @param object $lang2 The second language.
*
* @return integer
*
* @since 4.0.0
*/
protected function compareLanguages($lang1, $lang2)
{
return strcmp($lang1->name, $lang2->name);
}
/**
* Get the languages folder path.
*
* @return string The path to the languages folders.
*
* @since 4.0.0
*/
protected function getPath()
{
if ($this->path === null) {
$client = $this->getClient();
$this->path =
LanguageHelper::getLanguagePath($client->path);
}
return $this->path;
}
/**
* Get the client object of Administrator or Frontend.
*
* @param string $client Name of the client object.
*
* @return object
*
* @since 4.0.0
*/
protected function getClient($client = 'administrator')
{
return ApplicationHelper::getClientInfo($client, true);
}
/**
* Retrieve the admin user id.
*
* @return integer|boolean One Administrator ID.
*
* @since 4.0.0
*/
private function getAdminId()
{
if ($this->adminId) {
// Return local cached admin ID.
return $this->adminId;
}
$db = $this->getDatabase();
$query = $db->getQuery(true);
// Select the admin user ID
$query
->select($db->quoteName('u.id'))
->from($db->quoteName('#__users',
'u'))
->join(
'LEFT',
$db->quoteName('#__user_usergroup_map',
'map'),
$db->quoteName('map.user_id') . ' =
' . $db->quoteName('u.id')
)
->join(
'LEFT',
$db->quoteName('#__usergroups',
'g'),
$db->quoteName('map.group_id') . ' =
' . $db->quoteName('g.id')
)
->where(
$db->quoteName('g.title') . ' = ' .
$db->quote('Super Users')
);
$db->setQuery($query);
$id = $db->loadResult();
if (!$id || $id instanceof \Exception) {
return false;
}
return $id;
}
}