J3.x

Difference between revisions of "Developing an MVC Component/Adding categories/es"

From Joomla! Documentation

< J3.x:Developing an MVC Component
(Created page with "Con tu editor favorito, modifica el archivo <tt>admin/sql/install.mysql.utf8.sql</tt> y coloca estas líneas:")
(Updating to match new version of source page)
 
(38 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
<noinclude><languages /></noinclude>
 
<noinclude><languages /></noinclude>
{{review}}
 
 
{{:J3.1:Developing an MVC Component/es}}
 
{{:J3.1:Developing an MVC Component/es}}
 
== Introducción ==
 
== Introducción ==
 
Este artículo es parte del tutorial [[S:MyLanguage/J3.2:Developing an MVC Component|Desarrollo de un Componente MVC para Joomla! 3.2]]. Te invitamos a leer las partes anteriores del tutorial antes de leer esto.
 
Este artículo es parte del tutorial [[S:MyLanguage/J3.2:Developing an MVC Component|Desarrollo de un Componente MVC para Joomla! 3.2]]. Te invitamos a leer las partes anteriores del tutorial antes de leer esto.
El framework de Joomla! ha implementado el uso de categorías para todos los componentes. Aagregar habilidades categorizadas a un componente es bastante simple.
+
Puedes ver un vídeo (en inglés) asociado con este paso en [https://youtu.be/dd-2AcpqRg4 Paso 12, agregando categorías].
 +
 
 +
{{#widget:YouTube|id=dd-2AcpqRg4}}
 +
 
 +
En este paso, haremos uso de la funcionalidad de Categorías de Joomla para permitirnos definir un conjunto de categorías para usar con nuestro componente Helloworld, y permitirnos asociar cada saludo de Helloworld con una de esas categorías. Gran parte de esto se implementará de manera similar a otros componentes, como los artículos (com_content) y Anuncios.
 +
 
 +
Hay una serie de cuestiones sobre esto:
 +
 
 +
# Tenemos que vincular nuestra tabla de base de datos de Helloworld con la tabla de Categorías de Joomla; esto afectará a nuestros scripts de instalación y actualización de SQL.
 +
# Actualizaremos nuestro formulario de edición de Helloworld para permitir que un administrador asocie una categoría con cualquiera de los saludos de Helloworld. Esto afectará la definición XML del formulario de edición de Helloworld.
 +
# Hasta ahora, cuando los administradores definen un elemento de menú de tipo Helloworld, se les pide que seleccionen el saludo para mostrarlo de la lista de saludos disponibles. Mejoraremos esta lista para mostrar la categoría asociada entre paréntesis después del saludo, siempre que ese saludo tenga una categoría definida. Esto afectará nuestro código modelo FieldList en admin/models/fields/helloworld.php.
 +
# Permitiremos que el administrador defina las categorías asociadas con nuestro componente Helloworld. Esta es una funcionalidad que el componente Joomla com_categories nos proporciona automáticamente. Genera un formulario que permite a los administradores hacer esto: solo tenemos que proporcionar enlaces de menú a este formulario a través del submenú que se describe a continuación y del menú Componentes, y además debemos definir los permisos de acceso a esta funcionalidad.
 +
# Cambiaremos el formulario de Helloworlds que muestra todos los mensajes de Helloworld para que se muestre la Categoría asociada a cada mensaje. Esto afectará a nuestro modelo (ya que tendremos que hacer una Unión SQL con la tabla de Categorías para obtener el título de la Categoría) y nuestro archivo de diseño (donde mostraremos las categorías asociadas).
 +
# Crearemos un submenú que puede deslizarse como una barra lateral desde la izquierda, y que mostrará dos elementos en el submenú:
 +
#* Mensajes - que irán a nuestro formulario con todos los mensajes de Helloworld
 +
#* Categorías - que irán al formulario que le permite al administrador definir el conjunto de categorías para el componente Helloworld.
 +
#: Esto afectará nuestra vista de Helloworlds (donde configuraremos la barra lateral) y el diseño (donde mostraremos la barra lateral), además de definir el propio submenú de la barra lateral en un nuevo archivo de ayuda. También agregaremos una línea a nuestro archivo principal de administración helloworld.php que le dice a Joomla que cargue y ejecute ese archivo auxiliar.
 +
 
 +
'''Nota importante (en retrospectiva).''' Este paso crea categorías en el componente helloworld al permitir que sean opcionales. Esto es diferente de los componentes principales de Joomla, donde una categoría siempre debe estar definida, y los elementos predeterminados tienen una categoría de "sin categorizar". Si permite que las categorías sean opcionales, es probable que encuentres dificultades más adelante debido a que algunas funciones básicas de la biblioteca de Joomla asumen que son obligatorias. Si esta serie de tutoriales se actualiza para versiones posteriores de Joomla, sería mejor incluir categorías de una manera que siga el patrón estándar de Joomla.  
  
 
== Modificar el SQL ==
 
== Modificar el SQL ==
Line 40: Line 57:
 
</span>
 
</span>
  
== Modifying the form ==
+
== Modificar el formulario ==
A HelloWorld message can now belong to a category. We have to modify the editing form. In the <tt>admin/models/forms/helloworld.xml</tt> file, put these lines:
+
Un mensaje HelloWorld puede pertenecer a una categoría. Tenemos que modificar el formulario de edición. En el archivo <tt>admin/models/forms/helloworld.xml</tt>, coloca estas líneas:
  
 
<span id="admin/models/forms/helloworld.xml">
 
<span id="admin/models/forms/helloworld.xml">
Line 83: Line 100:
 
</span>
 
</span>
  
Note that the category can be 0 (representing no category).
+
Ten en cuenta que la categoría puede ser 0 (que representa a sin categoría).
  
== Modifying the menu type ==
+
== Modificar el tipo de menú ==
The HelloWorld menu type displays a drop down list of all messages. If the message is categorized, we have to add the category in this display.
+
El tipo de menú HelloWorld muestra una lista desplegable de todos los mensajes. Si el mensaje esta categorizado, tenemos que agregar la categoría en esta pantalla.
  
In the <tt>admin/models/fields/helloworld.php</tt> file, put these lines:
+
En el archivo <tt>admin/models/fields/helloworld.php</tt>, coloca estas líneas:
  
 
<span id="admin/models/fields/helloworld.php">
 
<span id="admin/models/fields/helloworld.php">
Line 98: Line 115:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 157: Line 174:
 
</span>
 
</span>
  
It will now display the category between parenthesis.
+
Ahora mostrará la categoría entre paréntesis.
Note: We have added a where clause too to filter out unpublished items.
+
Nota: Hemos añadido una cláusula where para filtrar los elementos no publicados.
  
== Managing the submenu ==
+
== Gestión del submenú ==
The <tt>com_categories</tt> component allows to set the submenu using a helper file. With your favourite file manager and editor, put a <tt>admin/helpers/helloworld.php</tt> file containing these lines:
+
El componente <tt>com_categories</tt> permite seleccionar el submenú usando un archivo helper. Con tus administrador y editor de archivos favoritos, colcoa un archivo <tt>admin/helpers/helloworld.php</tt> que contenga estas líneas:
  
 
<span id="admin/helpers/helloworld.php">
 
<span id="admin/helpers/helloworld.php">
Line 171: Line 188:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 187: Line 204:
 
  * @since  1.6
 
  * @since  1.6
 
  */
 
  */
abstract class HelloWorldHelper
+
abstract class HelloWorldHelper extends JHelperContent
 
{
 
{
 
/**
 
/**
Line 197: Line 214:
 
public static function addSubmenu($submenu)  
 
public static function addSubmenu($submenu)  
 
{
 
{
JSubMenuHelper::addEntry(
+
JHtmlSidebar::addEntry(
 
JText::_('COM_HELLOWORLD_SUBMENU_MESSAGES'),
 
JText::_('COM_HELLOWORLD_SUBMENU_MESSAGES'),
 
'index.php?option=com_helloworld',
 
'index.php?option=com_helloworld',
$submenu == 'messages'
+
$submenu == 'helloworlds'
 
);
 
);
  
JSubMenuHelper::addEntry(
+
JHtmlSidebar::addEntry(
 
JText::_('COM_HELLOWORLD_SUBMENU_CATEGORIES'),
 
JText::_('COM_HELLOWORLD_SUBMENU_CATEGORIES'),
 
'index.php?option=com_categories&view=categories&extension=com_helloworld',
 
'index.php?option=com_categories&view=categories&extension=com_helloworld',
Line 223: Line 240:
 
</span>
 
</span>
  
'''NOTE:''' You MUST use your component name (without com_) for the helper file name, or else your submenus won't show in category view.
+
'''NOTA:''' DEBES usar tu nombre de componente (sin com_) para el nombre del archivo helper o de lo contrario tus submenús no se mostrarán en la vista por categorías.
  
To import the helper class, put these lines in the <tt>admin/helloworld.php</tt> file:
+
Para importar la clase helper, coloca estas líneas en el archivo <tt>admin/helloworld.php</tt>:
  
 
<span id="admin/helloworld.php">
 
<span id="admin/helloworld.php">
Line 235: Line 252:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 262: Line 279:
 
</span>
 
</span>
  
This function will be automatically called by the ''com_categories'' component. Note that it will:
+
Esta función será llamada automáticamente por el componente ''com_categories''. Ten en cuenta que:
* change the submenu
+
* cambia el submenú
* change some css properties (for displaying icons)
+
* cambian algunas de las propiedades css (para la visualización de los iconos)
* change the browser title if the submenu is ''categories''
+
* cambia el título del navegador si el submenú es ''categorías''
* change the title and add a ''preferences'' button
+
* cambia el título y se agrega un botón ''preferencias''
  
The ''.icon-48-helloworld'' css class is now set in the ''addSubmenu'' function.
+
La clase css ''.icono-48-helloworld'' se establece ahora en la función ''addSubmenu''.
We have now to call this function in the hellowords view:
+
Ahora tenemos que llamar a esta función en la vista hellowords:
  
 
<span id="admin/views/helloworlds/view.html.php">
 
<span id="admin/views/helloworlds/view.html.php">
Line 279: Line 296:
 
  * @subpackage  com_helloworld
 
  * @subpackage  com_helloworld
 
  *
 
  *
  * @copyright  Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
+
  * @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  * @license    GNU General Public License version 2 or later; see LICENSE.txt
 
  */
 
  */
Line 372: Line 389:
 
</span>
 
</span>
  
== Adding some ACL ==
+
== Obtención de los títulos de categoría asociados ==
 +
Actualiza el modelo de helloworlds para que se una a SQL con la tabla de categorías de Joomla para encontrar el título de la categoría asociada.
 +
 
 +
<span id="admin/models/helloworlds.php">
 +
<tt>admin/models/helloworlds.php</tt>
 +
<source lang="php" highlight="53-58,74,78">
 +
<?php
 +
/**
 +
* @package    Joomla.Administrator
 +
* @subpackage  com_helloworld
 +
*
 +
* @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 +
* @license    GNU General Public License version 2 or later; see LICENSE.txt
 +
*/
 +
// No direct access to this file
 +
defined('_JEXEC') or die('Restricted access');
 +
 
 +
/**
 +
* HelloWorldList Model
 +
*
 +
* @since  0.0.1
 +
*/
 +
class HelloWorldModelHelloWorlds extends JModelList
 +
{
 +
/**
 +
* Constructor.
 +
*
 +
* @param  array  $config  An optional associative array of configuration settings.
 +
*
 +
* @see    JController
 +
* @since  1.6
 +
*/
 +
public function __construct($config = array())
 +
{
 +
if (empty($config['filter_fields']))
 +
{
 +
$config['filter_fields'] = array(
 +
'id',
 +
'greeting',
 +
'published'
 +
);
 +
}
 +
 
 +
parent::__construct($config);
 +
}
 +
 
 +
/**
 +
* Method to build an SQL query to load the list data.
 +
*
 +
* @return      string  An SQL query
 +
*/
 +
protected function getListQuery()
 +
{
 +
// Initialize variables.
 +
$db    = JFactory::getDbo();
 +
$query = $db->getQuery(true);
 +
 
 +
// Create the base select statement.
 +
$query->select('a.id as id, a.greeting as greeting, a.published as published')
 +
  ->from($db->quoteName('#__helloworld', 'a'));
 +
 
 +
// Join over the categories.
 +
$query->select($db->quoteName('c.title', 'category_title'))
 +
->join('LEFT', $db->quoteName('#__categories', 'c') . ' ON c.id = a.catid');
 +
 
 +
// Filter: like / search
 +
$search = $this->getState('filter.search');
 +
 
 +
if (!empty($search))
 +
{
 +
$like = $db->quote('%' . $search . '%');
 +
$query->where('greeting LIKE ' . $like);
 +
}
 +
 
 +
// Filter by published state
 +
$published = $this->getState('filter.published');
 +
 
 +
if (is_numeric($published))
 +
{
 +
$query->where('a.published = ' . (int) $published);
 +
}
 +
elseif ($published === '')
 +
{
 +
$query->where('(a.published IN (0, 1))');
 +
}
 +
 
 +
// Add the list ordering clause.
 +
$orderCol = $this->state->get('list.ordering', 'greeting');
 +
$orderDirn = $this->state->get('list.direction', 'asc');
 +
 
 +
$query->order($db->escape($orderCol) . ' ' . $db->escape($orderDirn));
 +
 
 +
return $query;
 +
}
 +
}
 +
 
 +
</source>
 +
</span>
 +
 
 +
== Actualizando el diseño ==
 +
Actualiza el archivo de diseño de helloworlds para mostrar la barra lateral y la categoría asociada con el saludo.
 +
 
 +
<span id="admin/views/helloworlds/tmpl/default.php">
 +
<tt>admin/views/helloworlds/tmpl/default.php</tt>
 +
<source lang="php" highlight="19-22,73-75,93">
 +
<?php
 +
/**
 +
* @package    Joomla.Administrator
 +
* @subpackage  com_helloworld
 +
*
 +
* @copyright  Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 +
* @license    GNU General Public License version 2 or later; see LICENSE.txt
 +
*/
 +
 
 +
// No direct access to this file
 +
defined('_JEXEC') or die('Restricted Access');
 +
 
 +
JHtml::_('formbehavior.chosen', 'select');
 +
 
 +
$listOrder    = $this->escape($this->filter_order);
 +
$listDirn      = $this->escape($this->filter_order_Dir);
 +
?>
 +
<form action="index.php?option=com_helloworld&view=helloworlds" method="post" id="adminForm" name="adminForm">
 +
<div id="j-sidebar-container" class="span2">
 +
<?php echo JHtmlSidebar::render(); ?>
 +
</div>
 +
<div id="j-main-container" class="span10">
 +
<div class="row-fluid">
 +
<div class="span6">
 +
<?php echo JText::_('COM_HELLOWORLD_HELLOWORLDS_FILTER'); ?>
 +
<?php
 +
echo JLayoutHelper::render(
 +
'joomla.searchtools.default',
 +
array('view' => $this)
 +
);
 +
?>
 +
</div>
 +
</div>
 +
<table class="table table-striped table-hover">
 +
<thead>
 +
<tr>
 +
<th width="1%"><?php echo JText::_('COM_HELLOWORLD_NUM'); ?></th>
 +
<th width="2%">
 +
<?php echo JHtml::_('grid.checkall'); ?>
 +
</th>
 +
<th width="90%">
 +
<?php echo JHtml::_('grid.sort', 'COM_HELLOWORLD_HELLOWORLDS_NAME', 'greeting', $listDirn, $listOrder); ?>
 +
</th>
 +
<th width="5%">
 +
<?php echo JHtml::_('grid.sort', 'COM_HELLOWORLD_PUBLISHED', 'published', $listDirn, $listOrder); ?>
 +
</th>
 +
<th width="2%">
 +
<?php echo JHtml::_('grid.sort', 'COM_HELLOWORLD_ID', 'id', $listDirn, $listOrder); ?>
 +
</th>
 +
</tr>
 +
</thead>
 +
<tfoot>
 +
<tr>
 +
<td colspan="5">
 +
<?php echo $this->pagination->getListFooter(); ?>
 +
</td>
 +
</tr>
 +
</tfoot>
 +
<tbody>
 +
<?php if (!empty($this->items)) : ?>
 +
<?php foreach ($this->items as $i => $row) :
 +
$link = JRoute::_('index.php?option=com_helloworld&task=helloworld.edit&id=' . $row->id);
 +
?>
 +
<tr>
 +
<td><?php echo $this->pagination->getRowOffset($i); ?></td>
 +
<td>
 +
<?php echo JHtml::_('grid.id', $i, $row->id); ?>
 +
</td>
 +
<td>
 +
<a href="<?php echo $link; ?>" title="<?php echo JText::_('COM_HELLOWORLD_EDIT_HELLOWORLD'); ?>">
 +
<?php echo $row->greeting; ?>
 +
</a>
 +
<div class="small">
 +
<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($row->category_title); ?>
 +
</div>
 +
</td>
 +
<td align="center">
 +
<?php echo JHtml::_('jgrid.published', $row->published, $i, 'helloworlds.', true, 'cb'); ?>
 +
</td>
 +
<td align="center">
 +
<?php echo $row->id; ?>
 +
</td>
 +
</tr>
 +
<?php endforeach; ?>
 +
<?php endif; ?>
 +
</tbody>
 +
</table>
 +
<input type="hidden" name="task" value=""/>
 +
<input type="hidden" name="boxchecked" value="0"/>
 +
<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>"/>
 +
<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>"/>
 +
<?php echo JHtml::_('form.token'); ?>
 +
</div>
 +
</form>
 +
</source>
 +
</span>
 +
 
 +
== Añadir algunos ACL ==
 
<span id="admin/access.xml">
 
<span id="admin/access.xml">
 
<tt>admin/access.xml</tt>
 
<tt>admin/access.xml</tt>
Line 393: Line 612:
 
</span>
 
</span>
  
'''NOTE:''' If you don't add this file, buttons "New" "Edit" and ... don't show in category view. For more information, read section Adding ACL on top of the page.
+
'''NOTA:''' Si no agregamos este archivo, los botones "Nuevo", "Editar" y ... no se mostraran en la vista por categorías. Para obtener más información, consulte la sección Agregar ACL en la parte superior de la página.
  
== Adding some translation strings ==
+
== Agregar algunas cadenas de traducción ==
Some strings have to be translated. In the <tt>admin/language/en-GB/en-GB.com_helloworld.ini</tt> file, put these lines:
+
Algunas cadenas han de ser traducidas. En el archivo <tt>admin/language/en-GB/en-GB.com_helloworld.ini</tt>, coloca estas líneas:
  
 
<span id="admin/language/en-GB/en-GB.com_helloworld.ini">
 
<span id="admin/language/en-GB/en-GB.com_helloworld.ini">
Line 402: Line 621:
 
<source lang="ini" highlight="7,17-19,34,35">
 
<source lang="ini" highlight="7,17-19,34,35">
 
; Joomla! Project
 
; Joomla! Project
; Copyright (C) 2005 - 2015 Open Source Matters. All rights reserved.
+
; Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.
 
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
 
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
 
; Note : All ini files need to be saved as UTF-8
 
; Note : All ini files need to be saved as UTF-8
Line 440: Line 659:
 
</span>
 
</span>
  
== Packaging the component ==
+
== Empaquetado del componente ==
  
Content of your code directory
+
Contenido de tu directorio de código. Cada enlace de archivo a continuación te lleva al paso en el tutorial que tiene la última versión de ese archivo de código fuente.
 
* ''[[#helloworld.xml|helloworld.xml]]''
 
* ''[[#helloworld.xml|helloworld.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_a_view_to_the_site_part#site/helloworld.php|site/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_a_view_to_the_site_part#site/helloworld.php|site/helloworld.php]]''
Line 459: Line 678:
 
* [[S:MyLanguage/J3.x:Developing an MVC Component/Adding language management#site.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|site/language/en-GB/en-GB.com_helloworld.ini]]
 
* [[S:MyLanguage/J3.x:Developing an MVC Component/Adding language management#site.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|site/language/en-GB/en-GB.com_helloworld.ini]]
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/helloworld.php|admin/helloworld.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/helloworld.php|admin/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/controller.php|admin/controller.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/controller.php|admin/controller.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/access.xml|admin/access.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/access.xml|admin/access.xml]]''
Line 465: Line 684:
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/helpers/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/helpers/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/sql/install.mysql.utf8.sql|admin/sql/install.mysql.utf8.sql]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/sql/install.mysql.utf8.sql|admin/sql/install.mysql.utf8.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/sql/uninstall.mysql.utf8.sql|admin/sql/uninstall.mysql.utf8.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/sql/uninstall.mysql.utf8.sql|admin/sql/uninstall.mysql.utf8.sql]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/updates/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/sql/updates/index.html]]''
Line 474: Line 693:
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/fields/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/fields/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/models/fields/helloworld.php|admin/models/fields/helloworld.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/models/fields/helloworld.php|admin/models/fields/helloworld.php]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/models/helloworlds.php|admin/models/helloworlds.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/models/helloworlds.php|admin/models/helloworlds.php]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/models/helloworlds.php|admin/models/helloworld.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/models/helloworld.php|admin/models/helloworld.php]]''
 +
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding decorations to the backend#admin/models/forms/filter_helloworlds.xml|admin/models/forms/filter_helloworlds.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/forms/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/forms/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/models/forms/helloworld.js|admin/models/forms/helloworld.js]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/models/forms/helloworld.js|admin/models/forms/helloworld.js]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/models/forms/helloworld.xml|admin/models/forms/helloworld.xml]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/models/forms/helloworld.xml|admin/models/forms/helloworld.xml]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/models/rules/greeting.php|admin/models/rules/greeting.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/models/rules/greeting.php|admin/models/rules/greeting.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/rules/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/models/rules/index.html]]''
Line 487: Line 707:
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworld/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworld/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/views/helloworld/view.html.php|admin/views/helloworld/view.html.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/views/helloworld/view.html.php|admin/views/helloworld/view.html.php]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_backend_actions#admin/views/helloworld/tmpl/edit.php|admin/views/helloworld/tmpl/edit.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworld/tmpl/index.html]]''
 +
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/views/helloworld/tmpl/edit.php|admin/views/helloworld/tmpl/edit.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/views/helloworld/submitbutton.js|admin/views/helloworld/submitbutton.js]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_verifications#admin/views/helloworld/submitbutton.js|admin/views/helloworld/submitbutton.js]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/views/helloworlds/view.html.php|admin/views/helloworlds/view.html.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/views/helloworlds/view.html.php|admin/views/helloworlds/view.html.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/tmpl/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/views/helloworlds/tmpl/index.html]]''
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Basic_backend#admin/views/helloworlds/tmpl/default.php|admin/views/helloworlds/tmpl/default.php]]''
+
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Adding_categories#admin/views/helloworlds/tmpl/default.php|admin/views/helloworlds/tmpl/default.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/tables/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|admin/tables/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/tables/helloworld.php|admin/tables/helloworld.php]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Using_the_database#admin/tables/helloworld.php|admin/tables/helloworld.php]]''
 
* ''[[#admin/language/index.html|admin/language/index.html]]''
 
* ''[[#admin/language/index.html|admin/language/index.html]]''
 
* ''[[#admin/language/en-GB/index.html|admin/language/en-GB/index.html]]''
 
* ''[[#admin/language/en-GB/index.html|admin/language/en-GB/index.html]]''
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding language management#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|admin/language/en-GB/en-GB.com_helloworld.ini]]''
+
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding_categories#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.ini|admin/language/en-GB/en-GB.com_helloworld.ini]]''
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding language management#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.sys.ini|admin/language/en-GB/en-GB.com_helloworld.sys.ini]]''
+
* ''[[S:MyLanguage/J3.x:Developing an MVC Component/Adding_decorations_to_the_backend#admin.2Flanguage.2Fen-GB.2Fen-GB.com_helloworld.sys.ini|admin/language/en-GB/en-GB.com_helloworld.sys.ini]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|media/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|media/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|media/images/index.html]]''
 
* ''[[S:MyLanguage/J3.2:Developing_an_MVC_Component/Developing_a_Basic_Component#index.html|media/images/index.html]]''
Line 505: Line 726:
 
* ''[[S:MyLanguage/J3.x:Developing_an_MVC_Component/Adding_decorations_to_the_backend#Adding_some_icons|media/images/tux-48x48.png]]''
 
* ''[[S:MyLanguage/J3.x:Developing_an_MVC_Component/Adding_decorations_to_the_backend#Adding_some_icons|media/images/tux-48x48.png]]''
  
Create a compressed file of this directory or directly download the [https://github.com/scionescire/Joomla-3.2-Hello-World-Component/archive/step-12-adding-categories.zip archive] and install it using the extension manager of Joomla. You can add a menu item of this component using the menu manager in the backend.
+
Crea un archivo comprimido de este directorio o descargar directamente el [https://github.com/scionescire/Joomla-3.2-Hello-World-Component/archive/step-12-adding-categories.zip archivo] e instálalo con el gestor de extensiones de Joomla. Puedes agregar un elemento de menú de este componente usando el gestor de menús en el lado del servidor.
  
 
<span id="helloworld.xml">
 
<span id="helloworld.xml">
Line 511: Line 732:
 
<source lang="xml" highlight="13,66,77,78">
 
<source lang="xml" highlight="13,66,77,78">
 
<?xml version="1.0" encoding="utf-8"?>
 
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.2.0" method="upgrade">
+
<extension type="component" version="3.0" method="upgrade">
  
 
<name>COM_HELLOWORLD</name>
 
<name>COM_HELLOWORLD</name>
 
<!-- The following elements are optional and free of formatting constraints -->
 
<!-- The following elements are optional and free of formatting constraints -->
<creationDate>February 2015</creationDate>
+
<creationDate>January 2018</creationDate>
 
<author>John Doe</author>
 
<author>John Doe</author>
 
<authorEmail>john.doe@example.org</authorEmail>
 
<authorEmail>john.doe@example.org</authorEmail>
Line 599: Line 820:
 
</span>
 
</span>
  
== Contributors ==
+
== Colaboradores ==
 
*[[User:cdemko|Christophe Demko]]
 
*[[User:cdemko|Christophe Demko]]
 
*[[User:oaksu|Ozgur Aksu]]
 
*[[User:oaksu|Ozgur Aksu]]
Line 606: Line 827:
 
*[[User:Scionescire|Scionescire]]
 
*[[User:Scionescire|Scionescire]]
 
*[[User:Veronika|Veronika Patel]]
 
*[[User:Veronika|Veronika Patel]]
 +
*[[User:Robbiej|Robbie Jackson]]
  
 
<div class="row">  
 
<div class="row">  
<div class="large-6 columns">{{Basic button|S:MyLanguage/J3.x:Developing_an_MVC_Component/Adding verifications|Prev: Adding verifications|class=expand success}}</div>
+
<div class="large-6 columns">{{Basic button|S:MyLanguage/J3.x:Developing_an_MVC_Component/Adding verifications|Prev: Agregar verificaciones|class=expand success}}</div>
<div class="large-6 columns">{{Basic button|S:MyLanguage/J3.x:Developing_an_MVC_Component/Adding configuration|Next: Adding configuration|class=expand}}</div>
+
<div class="large-6 columns">{{Basic button|S:MyLanguage/J3.x:Developing_an_MVC_Component/Adding configuration|Sig: Agregar configuración|class=expand}}</div>
 
</div>
 
</div>
 
__NOTOC__
 
__NOTOC__
 
<noinclude>
 
<noinclude>
[[Category:Joomla! 3.x]]
+
[[Category:Joomla! 3.x{{#translation:}}]]
[[Category:Joomla! 3.0]]
+
[[Category:Joomla! 3.0{{#translation:}}]]
[[Category:Joomla! 3.1]]
+
[[Category:Joomla! 3.1{{#translation:}}]]
[[Category:Joomla! 3.2]]
+
[[Category:Joomla! 3.2{{#translation:}}]]
[[Category:Joomla! 3.3]]
+
[[Category:Joomla! 3.3{{#translation:}}]]
[[Category:Joomla! 3.4]]
+
[[Category:Joomla! 3.4{{#translation:}}]]
[[Category:Beginner Development]]
+
[[Category:Joomla! 3.5{{#translation:}}]]
[[Category:Component Development]]
+
[[Category:Joomla! 3.6{{#translation:}}]]
[[Category:Tutorials]]
+
[[Category:Beginner Development{{#translation:}}]]
[[Category:Tutorials in a Series]]
+
[[Category:Component Development{{#translation:}}]]
 +
[[Category:Tutorials{{#translation:}}]]
 +
[[Category:Tutorials in a Series{{#translation:}}]]
 
</noinclude>
 
</noinclude>

Latest revision as of 23:46, 1 April 2019

Other languages:
English • ‎español • ‎français • ‎العربية • ‎中文(台灣)‎
Joomla! 
3.x
Tutorial
Desarrollo de un Componente MVC

Agregar una variable de petición en el tipo de menú

Utilizando la base de datos

Lado servidor básico

Agregar gestión de idioma

Agregar acciones del lado servidor

Agregar decoraciones del lado servidor

Agregar verificaciones

Agregar categorías

Agregar configuración

  1. Agregar ACL

Agregar un archivo de secuencia de comandos instalar-desinstalar-actualizar

Agregar un formulario del lado cliente

  1. Agregar una imagen
  2. Agregar un mapa
  3. Agregar AJAX
  4. Agregar un alias

Usar la facilidad filtro de idioma

  1. Agregar una Modal
  2. Agregar Asociaciones
  3. Agregar Comprobación
  4. Agregar Ordenamiento
  5. Agregar Niveles
  6. Agregar Control de Versiones
  7. Agregar Etiquetas
  8. Agregar Accesos
  9. Agregar procesos por lote
  10. Agregar Caché
  11. Agregar un Canal de Noticias

Agregar un servidor de actualización

  1. Agregar campos personalizados
  2. Upgrading to Joomla4



Esta es una serie multi-artículos de tutoriales sobre cómo desarrollar un Componente Modelo-Vista-Controlador para Joomla! VersiónJoomla 3.x.

Comenzar con la Introducción, y navegar por los artículos de esta serie usando el botón de navegación en la parte inferior o en el cuadro de la derecha (los "Artículos de esta serie").



Introducción

Este artículo es parte del tutorial Desarrollo de un Componente MVC para Joomla! 3.2. Te invitamos a leer las partes anteriores del tutorial antes de leer esto. Puedes ver un vídeo (en inglés) asociado con este paso en Paso 12, agregando categorías.

En este paso, haremos uso de la funcionalidad de Categorías de Joomla para permitirnos definir un conjunto de categorías para usar con nuestro componente Helloworld, y permitirnos asociar cada saludo de Helloworld con una de esas categorías. Gran parte de esto se implementará de manera similar a otros componentes, como los artículos (com_content) y Anuncios.

Hay una serie de cuestiones sobre esto:

  1. Tenemos que vincular nuestra tabla de base de datos de Helloworld con la tabla de Categorías de Joomla; esto afectará a nuestros scripts de instalación y actualización de SQL.
  2. Actualizaremos nuestro formulario de edición de Helloworld para permitir que un administrador asocie una categoría con cualquiera de los saludos de Helloworld. Esto afectará la definición XML del formulario de edición de Helloworld.
  3. Hasta ahora, cuando los administradores definen un elemento de menú de tipo Helloworld, se les pide que seleccionen el saludo para mostrarlo de la lista de saludos disponibles. Mejoraremos esta lista para mostrar la categoría asociada entre paréntesis después del saludo, siempre que ese saludo tenga una categoría definida. Esto afectará nuestro código modelo FieldList en admin/models/fields/helloworld.php.
  4. Permitiremos que el administrador defina las categorías asociadas con nuestro componente Helloworld. Esta es una funcionalidad que el componente Joomla com_categories nos proporciona automáticamente. Genera un formulario que permite a los administradores hacer esto: solo tenemos que proporcionar enlaces de menú a este formulario a través del submenú que se describe a continuación y del menú Componentes, y además debemos definir los permisos de acceso a esta funcionalidad.
  5. Cambiaremos el formulario de Helloworlds que muestra todos los mensajes de Helloworld para que se muestre la Categoría asociada a cada mensaje. Esto afectará a nuestro modelo (ya que tendremos que hacer una Unión SQL con la tabla de Categorías para obtener el título de la Categoría) y nuestro archivo de diseño (donde mostraremos las categorías asociadas).
  6. Crearemos un submenú que puede deslizarse como una barra lateral desde la izquierda, y que mostrará dos elementos en el submenú:
    • Mensajes - que irán a nuestro formulario con todos los mensajes de Helloworld
    • Categorías - que irán al formulario que le permite al administrador definir el conjunto de categorías para el componente Helloworld.
    Esto afectará nuestra vista de Helloworlds (donde configuraremos la barra lateral) y el diseño (donde mostraremos la barra lateral), además de definir el propio submenú de la barra lateral en un nuevo archivo de ayuda. También agregaremos una línea a nuestro archivo principal de administración helloworld.php que le dice a Joomla que cargue y ejecute ese archivo auxiliar.

Nota importante (en retrospectiva). Este paso crea categorías en el componente helloworld al permitir que sean opcionales. Esto es diferente de los componentes principales de Joomla, donde una categoría siempre debe estar definida, y los elementos predeterminados tienen una categoría de "sin categorizar". Si permite que las categorías sean opcionales, es probable que encuentres dificultades más adelante debido a que algunas funciones básicas de la biblioteca de Joomla asumen que son obligatorias. Si esta serie de tutoriales se actualiza para versiones posteriores de Joomla, sería mejor incluir categorías de una manera que siga el patrón estándar de Joomla.

Modificar el SQL

Con el fin de gestionar las categorías, tenemos que cambiar las tablas SQL. Con tu editor favorito, modifica el archivo admin/sql/install.mysql.utf8.sql y coloca estas líneas:

admin/sql/install.mysql.utf8.sql

DROP TABLE IF EXISTS `#__helloworld`;

CREATE TABLE `#__helloworld` (
	`id`       INT(11)     NOT NULL AUTO_INCREMENT,
	`greeting` VARCHAR(25) NOT NULL,
	`published` tinyint(4) NOT NULL,
	`catid`	    int(11)    NOT NULL DEFAULT '0',
	PRIMARY KEY (`id`)
)
	ENGINE =MyISAM
	AUTO_INCREMENT =0
	DEFAULT CHARSET =utf8;

INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');

admin/sql/updates/mysql/0.0.12.sql

ALTER TABLE `#__helloworld` ADD `catid` int(11) NOT NULL DEFAULT '0';

Modificar el formulario

Un mensaje HelloWorld puede pertenecer a una categoría. Tenemos que modificar el formulario de edición. En el archivo admin/models/forms/helloworld.xml, coloca estas líneas:

admin/models/forms/helloworld.xml

<?xml version="1.0" encoding="utf-8"?>
<form
				addrulepath="/administrator/components/com_helloworld/models/rules"
>
	<fieldset>
		<field
				name="id"
				type="hidden"
				/>
		<field
				name="greeting"
				type="text"
				label="COM_HELLOWORLD_HELLOWORLD_GREETING_LABEL"
				description="COM_HELLOWORLD_HELLOWORLD_GREETING_DESC"
				size="40"
				class="inputbox validate-greeting"
				validate="greeting"
				required="true"
				default=""
				/>
		<field
				name="catid"
				type="category"
				extension="com_helloworld"
				class="inputbox"
				default=""
				label="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL"
				description="COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC"
				required="true"
		>
			<option value="0">JOPTION_SELECT_CATEGORY</option>
		</field>
	</fieldset>
</form>

Ten en cuenta que la categoría puede ser 0 (que representa a sin categoría).

Modificar el tipo de menú

El tipo de menú HelloWorld muestra una lista desplegable de todos los mensajes. Si el mensaje esta categorizado, tenemos que agregar la categoría en esta pantalla.

En el archivo admin/models/fields/helloworld.php, coloca estas líneas:

admin/models/fields/helloworld.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

JFormHelper::loadFieldClass('list');

/**
 * HelloWorld Form Field class for the HelloWorld component
 *
 * @since  0.0.1
 */
class JFormFieldHelloWorld extends JFormFieldList
{
	/**
	 * The field type.
	 *
	 * @var         string
	 */
	protected $type = 'HelloWorld';

	/**
	 * Method to get a list of options for a list input.
	 *
	 * @return  array  An array of JHtml options.
	 */
	protected function getOptions()
	{
		$db    = JFactory::getDBO();
		$query = $db->getQuery(true);
		$query->select('#__helloworld.id as id,greeting,#__categories.title as category,catid');
		$query->from('#__helloworld');
		$query->leftJoin('#__categories on catid=#__categories.id');
		// Retrieve only published items
		$query->where('#__helloworld.published = 1');
		$db->setQuery((string) $query);
		$messages = $db->loadObjectList();
		$options  = array();

		if ($messages)
		{
			foreach ($messages as $message)
			{
				$options[] = JHtml::_('select.option', $message->id, $message->greeting .
				                      ($message->catid ? ' (' . $message->category . ')' : ''));
			}
		}

		$options = array_merge(parent::getOptions(), $options);

		return $options;
	}
}

Ahora mostrará la categoría entre paréntesis. Nota: Hemos añadido una cláusula where para filtrar los elementos no publicados.

Gestión del submenú

El componente com_categories permite seleccionar el submenú usando un archivo helper. Con tus administrador y editor de archivos favoritos, colcoa un archivo admin/helpers/helloworld.php que contenga estas líneas:

admin/helpers/helloworld.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * HelloWorld component helper.
 *
 * @param   string  $submenu  The name of the active view.
 *
 * @return  void
 *
 * @since   1.6
 */
abstract class HelloWorldHelper extends JHelperContent
{
	/**
	 * Configure the Linkbar.
	 *
	 * @return Bool
	 */

	public static function addSubmenu($submenu) 
	{
		JHtmlSidebar::addEntry(
			JText::_('COM_HELLOWORLD_SUBMENU_MESSAGES'),
			'index.php?option=com_helloworld',
			$submenu == 'helloworlds'
		);

		JHtmlSidebar::addEntry(
			JText::_('COM_HELLOWORLD_SUBMENU_CATEGORIES'),
			'index.php?option=com_categories&view=categories&extension=com_helloworld',
			$submenu == 'categories'
		);

		// Set some global property
		$document = JFactory::getDocument();
		$document->addStyleDeclaration('.icon-48-helloworld ' .
										'{background-image: url(../media/com_helloworld/images/tux-48x48.png);}');
		if ($submenu == 'categories') 
		{
			$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION_CATEGORIES'));
		}
	}
}

NOTA: DEBES usar tu nombre de componente (sin com_) para el nombre del archivo helper o de lo contrario tus submenús no se mostrarán en la vista por categorías.

Para importar la clase helper, coloca estas líneas en el archivo admin/helloworld.php:

admin/helloworld.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// Set some global property
$document = JFactory::getDocument();
$document->addStyleDeclaration('.icon-helloworld {background-image: url(../media/com_helloworld/images/tux-16x16.png);}');

// Require helper file
JLoader::register('HelloWorldHelper', JPATH_COMPONENT . '/helpers/helloworld.php');

// Get an instance of the controller prefixed by HelloWorld
$controller = JControllerLegacy::getInstance('HelloWorld');

// Perform the Request task
$input = JFactory::getApplication()->input;
$controller->execute($input->getCmd('task'));

// Redirect if set by the controller
$controller->redirect();

Esta función será llamada automáticamente por el componente com_categories. Ten en cuenta que:

  • cambia el submenú
  • cambian algunas de las propiedades css (para la visualización de los iconos)
  • cambia el título del navegador si el submenú es categorías
  • cambia el título y se agrega un botón preferencias

La clase css .icono-48-helloworld se establece ahora en la función addSubmenu. Ahora tenemos que llamar a esta función en la vista hellowords:

admin/views/helloworlds/view.html.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * HelloWorlds View
 *
 * @since  0.0.1
 */
class HelloWorldViewHelloWorlds extends JViewLegacy
{
	/**
	 * Display the Hello World view
	 *
	 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
	 *
	 * @return  void
	 */

	function display($tpl = null)
	{
		
		// Get application
		$app = JFactory::getApplication();
		$context = "helloworld.list.admin.helloworld";
		// Get data from the model
		$this->items			= $this->get('Items');
		$this->pagination		= $this->get('Pagination');
		$this->state			= $this->get('State');
		$this->filter_order 	= $app->getUserStateFromRequest($context.'filter_order', 'filter_order', 'greeting', 'cmd');
		$this->filter_order_Dir = $app->getUserStateFromRequest($context.'filter_order_Dir', 'filter_order_Dir', 'asc', 'cmd');
		$this->filterForm    	= $this->get('FilterForm');
		$this->activeFilters 	= $this->get('ActiveFilters');

		// Check for errors.
		if (count($errors = $this->get('Errors')))
		{
			JError::raiseError(500, implode('<br />', $errors));

			return false;
		}

		// Set the submenu
		HelloWorldHelper::addSubmenu('helloworlds');

		// Set the toolbar and number of found items
		$this->addToolBar();

		// Display the template
		parent::display($tpl);

		// Set the document
		$this->setDocument();
	}

	/**
	 * Add the page title and toolbar.
	 *
	 * @return  void
	 *
	 * @since   1.6
	 */
	protected function addToolBar()
	{
		$title = JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLDS');

		if ($this->pagination->total)
		{
			$title .= "<span style='font-size: 0.5em; vertical-align: middle;'>(" . $this->pagination->total . ")</span>";
		}

		JToolBarHelper::title($title, 'helloworld');
		JToolBarHelper::addNew('helloworld.add');
		JToolBarHelper::editList('helloworld.edit');
		JToolBarHelper::deleteList('', 'helloworlds.delete');
	}
	/**
	 * Method to set up the document properties
	 *
	 * @return void
	 */
	protected function setDocument() 
	{
		$document = JFactory::getDocument();
		$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION'));
	}
}

Obtención de los títulos de categoría asociados

Actualiza el modelo de helloworlds para que se una a SQL con la tabla de categorías de Joomla para encontrar el título de la categoría asociada.

admin/models/helloworlds.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

/**
 * HelloWorldList Model
 *
 * @since  0.0.1
 */
class HelloWorldModelHelloWorlds extends JModelList
{
	/**
	 * Constructor.
	 *
	 * @param   array  $config  An optional associative array of configuration settings.
	 *
	 * @see     JController
	 * @since   1.6
	 */
	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'id',
				'greeting',
				'published'
			);
		}

		parent::__construct($config);
	}

	/**
	 * Method to build an SQL query to load the list data.
	 *
	 * @return      string  An SQL query
	 */
	protected function getListQuery()
	{
		// Initialize variables.
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true);

		// Create the base select statement.
		$query->select('a.id as id, a.greeting as greeting, a.published as published')
			  ->from($db->quoteName('#__helloworld', 'a'));

		// Join over the categories.
		$query->select($db->quoteName('c.title', 'category_title'))
			->join('LEFT', $db->quoteName('#__categories', 'c') . ' ON c.id = a.catid');

		// Filter: like / search
		$search = $this->getState('filter.search');

		if (!empty($search))
		{
			$like = $db->quote('%' . $search . '%');
			$query->where('greeting LIKE ' . $like);
		}

		// Filter by published state
		$published = $this->getState('filter.published');

		if (is_numeric($published))
		{
			$query->where('a.published = ' . (int) $published);
		}
		elseif ($published === '')
		{
			$query->where('(a.published IN (0, 1))');
		}

		// Add the list ordering clause.
		$orderCol	= $this->state->get('list.ordering', 'greeting');
		$orderDirn 	= $this->state->get('list.direction', 'asc');

		$query->order($db->escape($orderCol) . ' ' . $db->escape($orderDirn));

		return $query;
	}
}

Actualizando el diseño

Actualiza el archivo de diseño de helloworlds para mostrar la barra lateral y la categoría asociada con el saludo.

admin/views/helloworlds/tmpl/default.php

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted Access');

JHtml::_('formbehavior.chosen', 'select');

$listOrder     = $this->escape($this->filter_order);
$listDirn      = $this->escape($this->filter_order_Dir);
?>
<form action="index.php?option=com_helloworld&view=helloworlds" method="post" id="adminForm" name="adminForm">
	<div id="j-sidebar-container" class="span2">
		<?php echo JHtmlSidebar::render(); ?>
	</div>
	<div id="j-main-container" class="span10">
		<div class="row-fluid">
			<div class="span6">
				<?php echo JText::_('COM_HELLOWORLD_HELLOWORLDS_FILTER'); ?>
				<?php
					echo JLayoutHelper::render(
						'joomla.searchtools.default',
						array('view' => $this)
					);
				?>
			</div>
		</div>
		<table class="table table-striped table-hover">
			<thead>
			<tr>
				<th width="1%"><?php echo JText::_('COM_HELLOWORLD_NUM'); ?></th>
				<th width="2%">
					<?php echo JHtml::_('grid.checkall'); ?>
				</th>
				<th width="90%">
					<?php echo JHtml::_('grid.sort', 'COM_HELLOWORLD_HELLOWORLDS_NAME', 'greeting', $listDirn, $listOrder); ?>
				</th>
				<th width="5%">
					<?php echo JHtml::_('grid.sort', 'COM_HELLOWORLD_PUBLISHED', 'published', $listDirn, $listOrder); ?>
				</th>
				<th width="2%">
					<?php echo JHtml::_('grid.sort', 'COM_HELLOWORLD_ID', 'id', $listDirn, $listOrder); ?>
				</th>
			</tr>
			</thead>
			<tfoot>
				<tr>
					<td colspan="5">
						<?php echo $this->pagination->getListFooter(); ?>
					</td>
				</tr>
			</tfoot>
			<tbody>
				<?php if (!empty($this->items)) : ?>
					<?php foreach ($this->items as $i => $row) :
						$link = JRoute::_('index.php?option=com_helloworld&task=helloworld.edit&id=' . $row->id);
					?>
						<tr>
							<td><?php echo $this->pagination->getRowOffset($i); ?></td>
							<td>
								<?php echo JHtml::_('grid.id', $i, $row->id); ?>
							</td>
							<td>
								<a href="<?php echo $link; ?>" title="<?php echo JText::_('COM_HELLOWORLD_EDIT_HELLOWORLD'); ?>">
									<?php echo $row->greeting; ?>
								</a>
								<div class="small">
									<?php echo JText::_('JCATEGORY') . ': ' . $this->escape($row->category_title); ?>
								</div>
							</td>
							<td align="center">
								<?php echo JHtml::_('jgrid.published', $row->published, $i, 'helloworlds.', true, 'cb'); ?>
							</td>
							<td align="center">
								<?php echo $row->id; ?>
							</td>
						</tr>
					<?php endforeach; ?>
				<?php endif; ?>
			</tbody>
		</table>
		<input type="hidden" name="task" value=""/>
		<input type="hidden" name="boxchecked" value="0"/>
		<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>"/>
		<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>"/>
		<?php echo JHtml::_('form.token'); ?>
	</div>
</form>

Añadir algunos ACL

admin/access.xml

<?xml version="1.0" encoding="utf-8" ?>
<access component="com_helloworld">
	<section name="component">
		<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
		<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
		<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
		<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
	</section>
	<section name="message">
		<action name="core.delete" title="JACTION_DELETE" description="COM_HELLOWORLD_ACCESS_DELETE_DESC" />
		<action name="core.edit" title="JACTION_EDIT" description="COM_HELLOWORLD_ACCESS_EDIT_DESC" />
	</section>
</access>

NOTA: Si no agregamos este archivo, los botones "Nuevo", "Editar" y ... no se mostraran en la vista por categorías. Para obtener más información, consulte la sección Agregar ACL en la parte superior de la página.

Agregar algunas cadenas de traducción

Algunas cadenas han de ser traducidas. En el archivo admin/language/en-GB/en-GB.com_helloworld.ini, coloca estas líneas:

admin/language/en-GB/en-GB.com_helloworld.ini

; Joomla! Project
; Copyright (C) 2005 - 2018 Open Source Matters. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

COM_HELLOWORLD_ADMINISTRATION="HelloWorld - Administration"
COM_HELLOWORLD_ADMINISTRATION_CATEGORIES="HelloWorld - Categories"
COM_HELLOWORLD_NUM="#"
COM_HELLOWORLD_HELLOWORLDS_FILTER="Filters"
COM_HELLOWORLD_PUBLISHED="Published"
COM_HELLOWORLD_HELLOWORLDS_NAME="Name"
COM_HELLOWORLD_ID="Id"

COM_HELLOWORLD_HELLOWORLD_CREATING="HelloWorld - Creating"
COM_HELLOWORLD_HELLOWORLD_DETAILS="Details"
COM_HELLOWORLD_HELLOWORLD_EDITING="HelloWorld - Editing"
COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE="Some values are unacceptable"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_DESC="The category the messages belongs to"
COM_HELLOWORLD_HELLOWORLD_FIELD_CATID_LABEL="Category"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC="This message will be displayed"
COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL="Message"
COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING="Greeting"
COM_HELLOWORLD_HELLOWORLD_HEADING_ID="Id"
COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT="HelloWorld manager: Edit Message"
COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW="HelloWorld manager: New Message"
COM_HELLOWORLD_MANAGER_HELLOWORLDS="HelloWorld manager"
COM_HELLOWORLD_EDIT_HELLOWORLD="Edit message"
COM_HELLOWORLD_N_ITEMS_DELETED_1="One message deleted"
COM_HELLOWORLD_N_ITEMS_DELETED_MORE="%d messages deleted"
COM_HELLOWORLD_N_ITEMS_PUBLISHED="%d message(s) published"
COM_HELLOWORLD_N_ITEMS_UNPUBLISHED="%d message(s) unpublished"
COM_HELLOWORLD_HELLOWORLD_GREETING_LABEL="Greeting"
COM_HELLOWORLD_HELLOWORLD_GREETING_DESC="Add Hello World Greeting"
COM_HELLOWORLD_SUBMENU_MESSAGES="Messages"
COM_HELLOWORLD_SUBMENU_CATEGORIES="Categories"

Empaquetado del componente

Contenido de tu directorio de código. Cada enlace de archivo a continuación te lleva al paso en el tutorial que tiene la última versión de ese archivo de código fuente.

Crea un archivo comprimido de este directorio o descargar directamente el archivo e instálalo con el gestor de extensiones de Joomla. Puedes agregar un elemento de menú de este componente usando el gestor de menús en el lado del servidor.

helloworld.xml

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.0" method="upgrade">

	<name>COM_HELLOWORLD</name>
	<!-- The following elements are optional and free of formatting constraints -->
	<creationDate>January 2018</creationDate>
	<author>John Doe</author>
	<authorEmail>john.doe@example.org</authorEmail>
	<authorUrl>http://www.example.org</authorUrl>
	<copyright>Copyright Info</copyright>
	<license>License Info</license>
	<!--  The version string is recorded in the components table -->
	<version>0.0.12</version>
	<!-- The description is optional and defaults to the name -->
	<description>COM_HELLOWORLD_DESCRIPTION</description>

	<install> <!-- Runs on install -->
		<sql>
			<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
		</sql>
	</install>
	<uninstall> <!-- Runs on uninstall -->
		<sql>
			<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
		</sql>
	</uninstall>
	<update> <!-- Runs on update; New since J2.5 -->
		<schemas>
			<schemapath type="mysql">sql/updates/mysql</schemapath>
		</schemas>
	</update>

	<!-- Site Main File Copy Section -->
	<!-- Note the folder attribute: This attribute describes the folder
		to copy FROM in the package to install therefore files copied
		in this section are copied from /site/ in the package -->
	<files folder="site">
		<filename>index.html</filename>
		<filename>helloworld.php</filename>
		<filename>controller.php</filename>
		<folder>views</folder>
		<folder>models</folder>
	</files>

        <languages folder="site/language">
		<language tag="en-GB">en-GB/en-GB.com_helloworld.ini</language>
        </languages>

	<media destination="com_helloworld" folder="media">
		<filename>index.html</filename>
		<folder>images</folder>
	</media>

	<administration>
		<!-- Administration Menu Section -->
		<menu link='index.php?option=com_helloworld' img="../media/com_helloworld/images/tux-16x16.png">COM_HELLOWORLD_MENU</menu>
		<!-- Administration Main File Copy Section -->
		<!-- Note the folder attribute: This attribute describes the folder
			to copy FROM in the package to install therefore files copied
			in this section are copied from /admin/ in the package -->
		<files folder="admin">
			<!-- Admin Main File Copy Section -->
			<filename>index.html</filename>
			<filename>helloworld.php</filename>
			<filename>controller.php</filename>
			<filename>access.xml</filename>
			<!-- SQL files section -->
			<folder>sql</folder>
			<!-- tables files section -->
			<folder>tables</folder>
			<!-- models files section -->
			<folder>models</folder>
			<!-- views files section -->
			<folder>views</folder>
			<!-- controllers files section -->
			<folder>controllers</folder>
			<!-- helpers files section -->
			<folder>helpers</folder>
		</files>
		<languages folder="admin/language">
        		<language tag="en-GB">en-GB/en-GB.com_helloworld.ini</language>
                        <language tag="en-GB">en-GB/en-GB.com_helloworld.sys.ini</language>
		</languages>
	</administration>

</extension>

Colaboradores