LinuxParty

NUESTRO SITIO necesita la publicidad para costear hosting y el dominio. Por favor considera deshabilitar tu AdBlock en nuestro sitio. También puedes hacernos una donación entrando en linuxparty.es, en la columna de la derecha.
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

Android 4.4.2.png No desarrolles Apps, no sirven para nada. Como lo oyes, es así de crudo, es la realidad. Lee estos datos que te paso y seguimos hablando:

  • Lucharás en visibilidad contra más de 2 millones de Apps.
  • Menos del 5% de los usuarios pagarán por una descarga.
  • La vida media de una App en un smartphone es de 3 días.
  • Tendrás menos de 3 minutos para que al usuario le resulte quizás algo atractiva para no quitarla.

Ya lo has visto, entonces no pienses en desarrollar Apps. Lo que debes hacer es desarrollar modelos de negocio de éxito alrededor de una App. Porque tu App no es lo importante, lo realmente importante es el usuario, o mejor dicho, el cliente, tu cliente, esa persona que realmente va a pagar por lo que tú estás pensando en estos momentos.

Pin It

Ratio: 5 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio activado

Programar, es una pasión, tiene algo que engancha, es sufrido el trabajo, pero gloriosa la satisfacción del trabajo terminado, tenemos en LinuxParty muchos artículos en los que hemos hablado sobre este tema, ahora nos hacemos eco de este artículo que recoge algunas de las herramientas que se pueden utilizar. Yo recomiendo para empezar usar Geany para empezar como IDE. Si luego quieres un RAD, tal vez Lazarus sea el más apropiado, pero Xojo es un lenguaje que está tomando mucho impulso, grandes compañías como Facebook, Google, o Yahoo! ya lo están utilizando.

Bluefish

Se trata de uno de los mejores en el campo del HTML, además es software libre. Una de sus grandes ventajas en su facilidad de uso, su disponibilidad para varios idiomas y su compatibilidad de sintaxis con otros “patrones”, como por ejemplo XML, Python, PHP, Javascript, JSP, SQL, Perl, CSS, Pascal, R, Coldfusion y Matlab.

Soporta caracteres multibyte, unicode, UTF-8 y al estar escrito en C y GTK posee un escaso uso de memoria, menor que otras herramientas similares.

Página oficial: http://bluefish.openoffice.nl/index.html

Descarga: sudo apt-get install bluefish

Pin It

Ratio: 5 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio activado

Hace cincuenta años este mes, en 1964, un lenguaje de programación le hizo un guiño a la vida, cambiando el curso de una generación. Mientras que muchos se apuntan al auge de Unix, otros lenguajes de programación ubicuos en los años intermedios como puntos de formación en la historia de la informática, el 1 de mayo de 1964, un ordenador en el Dartmouth College corrió el primer programa BASIC, cambiando el mundo para siempre.

Pin It

Ratio: 1 / 5

Inicio activadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

Tras mucho esperar, Google por fin ha decidido lanzar la aplicación Google Web Designer para Linux, que hacen uso de las tecnologías HTML5, CSS y JavaScript. Google Web Designer, además estará disponible para Mac OS X y Windows.

La herramienta que continuará etiquetado como Beta, está disponible para Debian y Ubuntu y Linux Mint en formato .deb, y RedHat, Fedora y openSUSE en formato .rpm,  para arquitecturas de 32 y 64 bit. No obstante si tiene otra distribución basada en cualquiera de la arriba mencionadas y con los mismos paquetes, seguramente también funcionará. (Yo tengo Fedora y funciona sin problemas)

Pin It

Ratio: 5 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio activado

Artículo extraido de GenbetaDev. (por Javier Rodiguez). En esta serie de artículos hablaremos de una de las herramientas de desarrollo multiplataforma más competitivas que puedas utilizar actualmente, y que permite desplegar sobre Windows, OS X, Linux y la Web a partir de un mismo código fuente (en ocasiones con ligeras adaptaciones o modificaciones, en función de la complejidad de nuestros programas); además de que, en breve, también permitirá crear y desplegar aplicaciones nativas para iOS (iPhone e iPad).

Pin It

Ratio: 5 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio activado

Este pequeño tutorial muestra como hacer llamadas al servidor donde alojamos nuestras paginas PHP, utilizando las funciones de JQuery para hacer llamadas Ajax, de manera que no se recargue toda la pagina. El primer ejemplo,a través de un botón hacemos una llamada ajax al servidor y este devuelve un texto, el cual lo mostramos en nuestra pagina. En el segundo ejemplo, similar al primero, con la diferencia que lo que devolvemos de nuestra funcion php es una cadena JSON, y mediante las funciones de JQuery para JSON, leemos sus datos. Traer un dato del servidor mediante ajax y mostrarlo en un input y un element html

Bueno manos a la obra, en nuestro primer ejemplo, vamos a crear una interfase como la que ven

Pin It
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

Gambas es un ambiente libre de desarrollo en Linux basado en un intérprete Basic con extensiones de objetos, un poco como Visual Basic™ (pero NO un clon !). Con Gambas, puedes diseñar rápidamente tu aplicación gráfica con QT o GTK+, acceder a bases de datos MySQL, PostgreSQL, Firebird, ODBC y SQLite, controlar aplicaciones con DBUS, traducir tu programa a cualquier lenguaje, crear Front End de comandos de linux, crear aplicaciones de red fácilmente, hacer aplicaciones 3D OpenGL , hacer aplicaciones web CGI, generar paquetes de instalación para diversas distribuciones, etc.

Comentaros que os podéis encontrar con dos versiones de Gambas: Gambas2 y Gambas3.

La más actual es Gambas3, y os aconsejo que utilicéis esta ya que esta más orientada a la programación por objetos que Gambas2, aparte que Gambas2, ya no se actualiza por el autor Benoît Minisini y usa Qt3 que esta en “deprecate” (deshuso).

Pin It
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

texto

En este mismo post vamos a aprender las instrucciones de control y bucles en Java, que es muy útil en el desarrollo de una aplicación..

El aprendizaje de programación Java, este artículo proviene de Curso de Java, iniciación al lenguaje de programación (1 de 2)

La sentencia if

La sentencia if en Java funciona de forma similar a si la declaración en cualquier otro lenguaje de programación, incluyendo secuencias de comandos shell.

Pin It
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

Configuración de los valores de los permisos en la tabla assets

Con el fin de almacenar los permisos para cada mensaje en la tabla assets , tenemos que  instruir a la clase table asociada con el modelo para salvar esos permisos en la tabla assets.
JTable no sólo proporciona una interfaz para el almacenamiento de los datos de los registros propios en la tabla del elemento, sino que también almacena los permisos para ese registro en la tabla assets.  Por ello hay que añadir información al método bind() acerca de los valores de los permisos. También tenemos que proporcionar el nombre del assets, el título y el id del assets padre, vía helloworld JTable.  

Por lo tanto, tenemos que sustituir 3 métodos:

  • _getAssetName():  un nombre único para este assets, el cual puede ser recuperado
  • _getAssetTitle(): una forma más humana de identificar el assets (no es necesario que sea único)
  • _getAssetParentId(): el asset_id padre en la tabla asset (del cual los permisos son heredados)

admin/tables/helloworld.php 


 

<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');

// Importar biblioteca table de Joomla
jimport('joomla.database.table');

/**
* Clase Hello Table
*/
class HelloWorldTableHelloWorld extends JTable
{
/**
* Constructor
*
* @paramobject Ibjeto conector de Base de Datos
*/
function __construct(&$db)
{
parent::__construct('#__helloworld', 'id', $db);
}

/**
* Sobreescribiendo la función bind
*
* @paramarray nombre del array
* @return null|string null si la operación fue satisfactoria, de otra forma retorna un error
* @see JTable:bind
* @since 1.5
*/
public function bind($array, $ignore = '')
{
if (isset($array['params']) && is_array($array['params']))
{
// Convertir los parametros field en string.
$parameter = new JRegistry;
$parameter->loadArray($array['params']);
$array['params'] = (string)$parameter;
}

// Bind the rules.
if (isset($array['rules']) && is_array($array['rules']))
{
$rules = new JAccessRules($array['rules']);
$this->setRules($rules);
}
return parent::bind($array, $ignore);
}

/**
* Reemplazando función de carga
*
* @paramint $pk llave primaria
* @paramboolean $reset restablecer los datos
* @return boolean
* @see JTable:load
*/
public function load($pk = null, $reset = true)
{
if (parent::load($pk, $reset))
{
// Convirtiendo los parametros field en registry.
$params = new JRegistry;
$params->loadJSON($this->params);
$this->params = $params;
return true;
}
else
{
return false;
}
}

/**
* Método para calcular el nombre por defecto del asset
* El nombre por defecto es en la forma `table_name.id`
* donde el id es el valor de la clave principal de la tabla
*
* @return string
* @since 2.5
*/ protected function _getAssetName()
{
$k = $this->_tbl_key;
return 'com_helloworld.message.'.(int) $this->$k;
}
/**
* Método para devolver el título a utilizar para la tabla asset.
*
* @return string
* @since 2.5
*/
protected function _getAssetTitle()
{
return $this->greeting;
}
/**
* Método para obtener el id del asset padre del elemento
*
* @return int
*/
protected function _getAssetParentId()
{
// Vamos a obtener el asset padre de la tabla Asset
$assetParent = JTable::getInstance('Asset');
// Por defecto: si no se encuentran aseet padre tomamos el asset global
$assetParentId = $assetParent->getRootId();
// Encuentre el asset padre
if (($this->catid)&& !empty($this->catid))
{
// El elemento tiene una categoría como asset padre
$assetParent->loadByName('com_helloworld.category.' . (int) $this->catid);
}

else
{
// El elemento tiene un componente como asset padre
$assetParent->loadByName('com_helloworld');
}
// Retornar el id del asset padre encontrado
if ($assetParent->id)
{
$assetParentId=$assetParent->id;
}
return $assetParentId;
}
}

Este código de _getAssetParentId() anterior usa JTableAsset para recuperar el asset_id del asset padre.  Esto es diferente del código en la versión actual de com_content, donde se recupera el asset_id de la categoría de la tabla de la base de datos # __categories. Esa es otra posibilidad; ya saben que existen muchos caminos que conducen a Roma. En com_content sin embargo, si un artículo no pertenece a una categoría, entonces el asset_id del asset global es retornado. Eso no sería, por supuesto, estar en lo correcto, pero se solucionado poniendo una categoría por defecto “uncategorised”, por lo que un artículo siempre va a pertenecer a una categoría. Es por eso que no se puede simplemente copiar el código de _getAssetParentId() de com_content para nuestro componente.

El código anterior es más general.

Mostrando la configuración de permisos a nivel del elemento

Añadiendo los “rules field” en el archivo admin/models/forms/helloworld.xml :


 

<fieldset name="accesscontrol">
<field name="asset_id" type="hidden" filter="unset" />
<field name="rules"
type="rules"
label="JFIELD_RULES_LABEL"
translate_label="false"
filter="rules"
validate="rules"
class="inputbox"
component="com_helloworld"
section="message"
/>
</fieldset>

 Y mostrando la interfaz de ACL en la parte inferior de su Helloworld en el archivo admin/views/helloworld/tmpl/edit.php :


 

<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
$params = $this->form->getFieldsets('params');
?>
<form action="<?php echo JRoute::_('index.php?option=com_helloworld&layout=edit&id='.(int) $this->item->id); ?>"
method="post" name="adminForm" id="helloworld-form" class="form-validate">

<div class="width-60 fltlft">
<fieldset class="adminform">
<legend><?php echo JText::_( 'COM_HELLOWORLD_HELLOWORLD_DETAILS' ); ?></legend>
<ul class="adminformlist">
<?php foreach($this->form->getFieldset('details') as $field): ?>
<li><?php echo $field->label;echo $field->input;?></li>
<?php endforeach; ?>
</ul>
</fieldset>
</div>

<div class="width-40 fltrt">
<?php echo JHtml::_('sliders.start', 'helloworld-slider');
foreach ($params as $name => $fieldset):
echo JHtml::_('sliders.panel', JText::_($fieldset->label), $name.'-params');
if (isset($fieldset->description) && trim($fieldset->description)): ?>
<p class="tip"><?php echo $this->escape(JText::_($fieldset->description));?></p>
<?php endif;?>
<fieldset class="panelform" >
<ul class="adminformlist">
<?php foreach ($this->form->getFieldset($name) as $field) : ?>
<li><?php echo $field->label; ?><?php echo $field->input; ?></li>
<?php endforeach; ?>
</ul>
</fieldset>
<?php endforeach; ?>

<?php echo JHtml::_('sliders.end'); ?>
</div>

<!-- Comienzo de la definición de las ACL -->
<div class="clr"></div>
<?php if ($this->canDo->get('core.admin')): ?>
<div class="width-100 fltlft">
<?php echo JHtml::_('sliders.start', 'permissions-sliders-'.$this->item->id, array('useCookie'=>1)); ?>
<?php echo JHtml::_('sliders.panel', JText::_('COM_HELLOWORLD_FIELDSET_RULES'), 'access-rules'); ?>
<fieldset class="panelform">
<?php echo $this->form->getLabel('rules'); ?>
<?php echo $this->form->getInput('rules'); ?>
</fieldset>
<?php echo JHtml::_('sliders.end'); ?>
</div>
<?php endif; ?>
<!-- Final de la definición de las ACL -->
<div>
<input type="hidden" name="task" value="helloworld.edit" />
<?php echo JHtml::_('form.token'); ?>
</div>
</form>

 

Añadiendo cadenas de idioma

 Se utilizó 3 cadenas que tienen que ser añadidas al archivo de idioma de la administración. admin/language/es-ES/es-ES.com_helloworld.ini :

COM_HELLOWORLD_FIELDSET_RULES="Permisos de Mensaje"
COM_HELLOWORLD_ACCESS_DELETE_DESC="¿Está este grupo autorizado a editar este mensaje?"
COM_HELLOWORLD_ACCESS_DELETE_DESC="¿Está este grupo autorizado a eliminar este mensaje?"

Lecturas complementarias

Más información sobre las acciones, assets y ACL se pueden encontrar en las siguientes páginas:

Clases obsoletas

Por el momento dejamos las referencias obsoletas JError como están.  Probablemente aún esté disponible en Joomla! 3.x. No podemos cambiarlas a declaraciones JLog::add() porqué en Joomla! 2.5 los mensajes no se ponen en colas. Otras soluciones, como el uso de $app->enqueueMessage()  o directamente tirando PHP-exceptions, son posibles, pero todavía habría numerosas referencias a JError en toda la aplicación. Por ejemplo, en las vistas, comprobamos si hay errores planteados en el modelo con: count($errors = $this->get('Errors')) que utiliza JError del JOBject que fue la base para JModel.

Para obtener la misma funcionalidad sin necesidad de utilizar JError en absoluto, tendríamos que cambiar la forma en que el modelo plantea ahora los errores y las advertencias. Si queremos hacer una aplicación que funcione en Joomla! 2.5 y 3.x podemos seguir utilizando JError. En el momento en que queramos utilizar nuestras extensiones 3.x o también 4.x vamos a tener que cambiar esto (y probablemente mucho más también). Este tutorial está ahora centrado principalmente en Joomla! 2.5. Por lo tanto: notamos el cambio próximo, pero dejarlo ahí por el momento.

Desde Joomla! 2.5.5 las clases bases del modelo MVC, JController, JModel  y JView tienen en su poder JControllerLegacy, JModelLegacy and JViewLegacy. Se recomienda el uso de ellas en lugar de las clases originales,  para lograr una compatibilidad hacia adelante con las clases heredadas de Joomla! 3.x .

15- Añadiendo un archivo script de Instalación - Desinstalación - Actualización

Crear el script de la extensión

Instalación, actualización y desinstalación de un componente puede requerir operaciones adicionales que no pueden ser alcanzados por las operaciones básicas descritas en el archivo XML principal. Joomla! ofrece un nuevo enfoque para resolver este problema. Consiste en el uso de un archivo script php en la raíz de nuestro directorio que contiene una clase que usa cinco métodos:

  • Preflight: que se ejecuta antes de instalar y actualizar
  • Instalar
  • Actualizar
  • Desinstalar
  • Postflight: que se ejecuta después de la instalación y actualización

Escribir este script consiste en declarar una clase cuyo nombre es com_NombreComponenteInstallerScript con estos 5 métodos: script.php


 

<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');

/**
* Archivo Script del componente HelloWorld
*/
class com_helloWorldInstallerScript
{
/**
* Método de instalación del componente
*
* @return void
*/
function install($parent)
{
// $parent es la clase que llama al método
$parent->getParent()->setRedirectURL('index.php?option=com_helloworld');
}

/**
* Método para desinstalar el componente
*
* @return void
*/
function uninstall($parent)
{
// $parent es la clase que llama al método
echo '<p>' . JText::_('COM_HELLOWORLD_UNINSTALL_TEXT') . '</p>';
}

/**
* Método para actualizar el componente
*
* @return void
*/
function update($parent)
{
// $parent es la clase que llama al método
echo '<p>' . JText::sprintf('COM_HELLOWORLD_UPDATE_TEXT', $parent->get('manifest')->version) . '</p>';
}

/**
* Método que se ejecuta antes del método de instalar/actualizar/desinstalar
*
* @return void
*/
function preflight($type, $parent)
{
// $parent es la clase que llama al método
// $type es el tipo de cambio (instalar, actualizar o discover_install)
echo '<p>' . JText::_('COM_HELLOWORLD_PREFLIGHT_' . $type . '_TEXT') . '</p>';
}

/**
* Método que se ejecuta después del método de instalar/actualizar/desinstalar
*
* @return void
*/
function postflight($type, $parent)
{
// $parent es la clase que llama al método
// $type es el tipo de cambio (instalar, desinstalar o discover_install)
echo '<p>' . JText::_('COM_HELLOWORLD_POSTFLIGHT_' . $type . '_TEXT') . '</p>';
}
}

 Este archivo de script , se redirige al usuario al componente com_helloworld cuando se instala, y se mostrarán mensajes cuando se actualiza o se desinstala. En el método de actualización, se mostrará la versión nueva con $parent->get('manifest')->version.

Añadiendo algunas cadenas de idiomas

 admin/language/es-ES/es-ES.com_helloworld.sys.ini 

COM_HELLOWORLD="Hello World!"
COM_HELLOWORLD_DESCRIPTION="Esta es la descripción de HelloWorld"
COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC="Esta vista muestra un mensaje seleccionado"
COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE="Hello World"
COM_HELLOWORLD_INSTALL_TEXT="Script de Instalación de HelloWorld"
COM_HELLOWORLD_MENU="Hello World!"
COM_HELLOWORLD_POSTFLIGHT_DISCOVER_INSTALL_TEXT="HelloWorld postlight descubre script de instalación"
COM_HELLOWORLD_POSTFLIGHT_INSTALL_TEXT="HelloWorld postflight script de instalación"
COM_HELLOWORLD_POSTFLIGHT_UNINSTALL_TEXT="HelloWorld postflight script de dsinstalación"
COM_HELLOWORLD_POSTFLIGHT_UPDATE_TEXT="HelloWorld postflight script de actualización"
COM_HELLOWORLD_PREFLIGHT_DISCOVER_INSTALL_TEXT="HelloWorld preflight descubre script de instalación"
COM_HELLOWORLD_PREFLIGHT_INSTALL_TEXT="HelloWorld preflight script de instalación"
COM_HELLOWORLD_PREFLIGHT_UNINSTALL_TEXT="HelloWorld preflight script de desinstalación"
COM_HELLOWORLD_PREFLIGHT_UPDATE_TEXT="HelloWorld preflight script de actualización"
COM_HELLOWORLD_UNINSTALL_TEXT="HelloWorld desinstalado"
COM_HELLOWORLD_UPDATE_TEXT="HelloWorld actualizadot. HelloWorld ahora se actualizo a la versión %s."

 Verifiquemos ahora el contenido que debemos tener en nuestro directorio:

  • helloworld.xml
  • script.php
  • site/index.html
  • site/helloworld.php
  • site/controller.php
  • site/views/index.html
  • site/views/helloworld/index.html
  • site/views/helloworld/view.html.php
  • site/views/helloworld/tmpl/index.html
  • site/views/helloworld/tmpl/default.xml
  • site/views/helloworld/tmpl/default.php
  • site/models/index.html
  • site/models/helloworld.php
  • site/language/index.html
  • site/language/es-ES/index.html
  • site/language/es-ES/es-ES.com_helloworld.ini
  • admin/index.html
  • admin/access.xml
  • admin/config.xml
  • admin/helloworld.php
  • admin/controller.php
  • admin/sql/index.html
  • admin/sql/install.mysql.utf8.sql
  • admin/sql/uninstall.mysql.utf8.sql
  • admin/sql/updates/index.html
  • admin/sql/updates/mysql/index.html
  • admin/sql/updates/mysql/0.0.1.sql
  • admin/sql/updates/mysql/0.0.6.sql
  • admin/sql/updates/mysql/0.0.12.sql
  • admin/sql/updates/mysql/0.0.13.sql
  • admin/models/index.html
  • admin/models/fields/index.html
  • admin/models/fields/helloworld.php
  • admin/models/forms/index.html
  • admin/models/forms/helloworld.xml
  • admin/models/forms/helloworld.js
  • admin/models/rules/index.html
  • admin/models/rules/greeting.php
  • admin/models/helloworld.php
  • admin/models/helloworlds.php
  • admin/views/index.html
  • admin/views/helloworlds/index.html
  • admin/views/helloworlds/view.html.php
  • admin/views/helloworlds/tmpl/index.html
  • admin/views/helloworlds/tmpl/default.php
  • admin/views/helloworlds/tmpl/default_head.php
  • admin/views/helloworlds/tmpl/default_body.php
  • admin/views/helloworlds/tmpl/default_foot.php
  • admin/views/helloworld/index.html
  • admin/views/helloworld/view.html.php
  • admin/views/helloworld/submitbutton.js
  • admin/views/helloworld/tmpl/index.html
  • admin/views/helloworld/tmpl/edit.php
  • admin/helpers/index.html
  • admin/helpers/helloworld.php
  • admin/tables/index.html
  • admin/tables/helloworld.php
  • admin/language/es-ES/es-ES.com_helloworld.ini
  • admin/language/es-ES/es-ES.com_helloworld.sys.ini
  • admin/controllers/index.html
  • admin/controllers/helloworld.php
  • admin/controllers/helloworlds.php
  • language/es-ES/es-ES.ini
  • media/index.html
  • media/images/index.html
  • media/images/tux-16x16.png
  • media/images/tux-48x48.png

Nuestro helloworld.xml es modificado:


 

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

       <name>COM_HELLOWORLD</name>
       <creationDate>Octubre 2012</creationDate>
       <author>Carlos R & Andoitz B</author>
       <authorEmail>email</authorEmail>
       <authorUrl>http://www.ejemplo.org</authorUrl>
       <copyright>Copyright Info</copyright>
       <license>Licencia Info</license>
       <version>0.0.15</version>
       <description>COM_HELLOWORLD_DESCRIPTION</description>

       <!-- Ejecutar instalación/desinstalación/actualización; Nuevo en 2.5 -->
       <scriptfile>script.php</scriptfile>

       <install>
               <sql>
                       <file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
               </sql>
       </install>
       <uninstall>
               <sql>
                       <file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
               </sql>
       </uninstall>
       <update>
               <schemas>
                       <schemapath type="mysql">sql/updates/mysql</schemapath>
               </schemas>
       </update>

       <files folder="site">
               <filename>index.html</filename>
               <filename>helloworld.php</filename>
               <filename>controller.php</filename>
               <folder>views</folder>
               <folder>models</folder>
               <folder>language</folder>
       </files>

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

       <administration>
              
              <menu img="../media/com_helloworld/images/tux-16x16.png">COM_HELLOWORLD_MENU</menu>
              <files folder="admin">                       
                       <filename>index.html</filename>
                       <filename>config.xml</filename>
                       <filename>access.xml</filename>
                       <filename>helloworld.php</filename>
                       <filename>controller.php</filename>  
                       <folder>sql</folder>                       
                       <folder>tables</folder>                       
                       <folder>models</folder>                       
                       <folder>views</folder>                       
                       <folder>controllers</folder>                       
                       <folder>helpers</folder>
               </files>

               <languages folder="admin">
                  <language tag="es-ES">language/es-ES/es-ES.com_helloworld.ini</language>
                  <language tag="es-ES">language/es-ES/es-ES.com_helloworld.sys.ini</language>
               </languages>
       </administration>

</extension>

Ahora crea un archivo comprimido del contenido del componente e instalalo a través del gestor de extensiones de Joomla!. Recuerda que también puedes descargar el archivo directamente.

16- Añade la definición UpdateServer (Servidor de Actualizaciones)

 Para agregar la funcionalidad UpdateServer hay que ajustar el helloworld.xml a este aspecto:


 

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

       <name>COM_HELLOWORLD</name>       
       <creationDate>November 2009</creationDate>
       <author>Carlos R & Andoitz B</author>
       <authorEmail>email</authorEmail>
       <authorUrl>http://www.example.org</authorUrl>
       <copyright>Copyright Info</copyright>
       <license>Licencia Info</license>       >
       <version>0.0.15</version>       
       <description>COM_HELLOWORLD_DESCRIPTION</description>
      
       <scriptfile>script.php</scriptfile>

       <install>
               <sql>
                       <file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
               </sql>
       </install>
       <uninstall>
               <sql>
                       <file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
               </sql>
       </uninstall>
       <update>
               <schemas>
                       <schemapath type="mysql">sql/updates/mysql</schemapath>
               </schemas>
       </update>
      
       <files folder="site">
               <filename>index.html</filename>
               <filename>helloworld.php</filename>
               <filename>controller.php</filename>
               <folder>views</folder>
               <folder>models</folder>
               <folder>language</folder>
       </files>

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

       <administration>               
               <menu img="../media/com_helloworld/images/tux-16x16.png">COM_HELLOWORLD_MENU</menu>
              
               <files folder="admin">                       
                       <filename>index.html</filename>
                       <filename>config.xml</filename>
                       <filename>access.xml</filename>
                       <filename>helloworld.php</filename>
                       <filename>controller.php</filename>                       
                       <folder>sql</folder>                       >
                       <folder>tables</folder>                       
                       <folder>models</folder>                       
                       <folder>views</folder>                       
                       <folder>controllers</folder>                       
                       <folder>helpers</folder>
               </files>

               <languages folder="admin">
                  <language tag="es-ES">language/es-ES/es-ES.com_helloworld.ini</language>
                  <language tag="es-ES">language/es-ES/es-ES.com_helloworld.sys.ini</language>
               </languages>
       </administration>

       <!-- DEFINICIÓN UPDATESERVER -->
       <updateservers>
               <!-- Nota: No se permiten espacios ni saltos de líneas entre las entiquetas del servidor -->
               <server type="extension" priority="1" name="HelloWorld Update Site">http://yourdomain.com/update/helloworld-update.xml</server>
       </updateservers>

</extension>

 También es necesario poner un archivo XML en el servidor que contenga toda la información sobre las actualizaciones.
helloworld-update.xml 


 

<?xml version="1.0" encoding="utf-8"?>
<updates>
  <update>
     <name>HelloWorld</name>
     <description>Componente HelloWorld Component</description>
     <element>com_helloworld</element>
     <type>component</type>
     <version>1.5.0</version>

     <infourl title="HalloWorld URL">http://yourdomain.com</infourl>
     <downloads>
        <downloadurl type="full" format="zip">http://yourdomain.com/files/com_helloworld-1.5.0-final.zip</downloadurl>
     </downloads>
     <tags>
        <tag>some-tag</tag>
     </tags>

     <maintainer>HelloWorld Inc.</maintainer>
     <maintainerurl>http://yourdomain.com</maintainerurl>
     <section>some-section</section>
     <targetplatform name="joomla" version="2.5" />
  </update>
  <update>
     <name>HelloWorld</name>
     <description>HelloWorld Component</description>
     <element>com_helloworld</element>
     <type>component</type>
     <version>1.5.0</version>

     <infourl title="HalloWorld URL">http://yourdomain.com</infourl>
     <downloads>
        <downloadurl type="full" format="zip">http://yourdomain.com/files/com_helloworld-1.5.0-final.zip</downloadurl>
     </downloads>
     <tags>
        <tag>some-tag</tag>
     </tags>

     <maintainer>HelloWorld Inc.</maintainer>
     <maintainerurl>http://yourdomain.com</maintainerurl>
     <section>some-section</section>
     <targetplatform name="joomla" version="2.5" />
  </update>
  <update>
     <name>HelloWorld</name>
     <description>HelloWorld Component</description>
     <element>com_helloworld</element>
     <type>component</type>
     <version>1.5.0</version>

     <infourl title="HalloWorld URL">http://yourdomain.com</infourl>
     <downloads>
        <downloadurl type="full" format="zip">http://yourdomain.com/files/com_helloworld-1.5.0-final.zip</downloadurl>
     </downloads>
     <tags>
        <tag>some-tag</tag>
     </tags>

     <maintainer>HelloWorld Inc.</maintainer>
     <maintainerurl>http://yourdomain.com</maintainerurl>
     <section>some-section</section>
     <targetplatform name="joomla" version="2.5" />
  </update>

   <update>
     <name>HelloWorld</name>
     <description>HelloWorld Component</description>
     <element>com_helloworld</element>
     <type>component</type>
     <version>1.5.1</version>

     <infourl title="HelloWorld URL">http://yourdomain.com</infourl>
     <downloads>
        <downloadurl type="full" format="zip">http://yourdomain.com/files/com_helloworld-1.5.1-final.zip</downloadurl>
     </downloads>
     <tags>
        <tag>some-tag</tag>
     </tags>

     <maintainer>HelloWorld Inc.</maintainer>
     <maintainerurl>http://yourdomain.com</maintainerurl>
     <section>some-section</section>
     <targetplatform name="joomla" version="2.5" />
  </update>
   <update>
     <name>HelloWorld</name>
     <description>HelloWorld Component</description>
     <element>com_helloworld</element>
     <type>component</type>
     <version>1.5.1</version>

     <infourl title="HelloWorld URL">http://yourdomain.com</infourl>
     <downloads>
        <downloadurl type="full" format="zip">http://yourdomain.com/files/com_helloworld-1.5.1-final.zip</downloadurl>
     </downloads>
     <tags>
        <tag>some-tag</tag>
     </tags>

     <maintainer>HelloWorld Inc.</maintainer>
     <maintainerurl>http://yourdomain.com</maintainerurl>
     <section>some-section</section>
     <targetplatform name="joomla" version="2.5" />
  </update>
   <update>
     <name>HelloWorld</name>
     <description>HelloWorld Component</description>
     <element>com_helloworld</element>
     <type>component</type>
     <version>1.5.1</version>

     <infourl title="HelloWorld URL">http://yourdomain.com</infourl>
     <downloads>
        <downloadurl type="full" format="zip">http://yourdomain.com/files/com_helloworld-1.5.1-final.zip</downloadurl>
     </downloads>
     <tags>
        <tag>some-tag</tag>
     </tags>

     <maintainer>HelloWorld Inc.</maintainer>
     <maintainerurl>http://yourdomain.com</maintainerurl>
     <section>some-section</section>
     <targetplatform name="joomla" version="2.5" />
  </update>

</updates>

 Es necesario agregar una nueva actualización cada vez que se publique una nueva versión, así como para cada versión de Joomla!.(se necesita un nodo distinto para cada actualización TargetPlatform)

Vea también

Aquí concluye este extenso tutorial. Espero que haya sido de tu agrado y que hayas podido crear tu componente siguiendo el mismo. Como pudistes darte cuenta, en cada punto hemos puesto la fecha de actualización que tenían los mismos a la hora de haber creado este tutorial. Por lo que queremos destacar que la información ofrecida en este artículo se actualizará a través de “artículos de actualización” en caso de que se hagan modificaciones en la documentación de Joomla! Sabemos que la información vale de poco cuando no está actualizada.

Este es solo el primero de una larga serie de tutoriales dirigidos a esas personas que, después de tener o adquirir cierta base y conocimiento del funcionamiento de Joomla!, quieran dar un paso más allá y aprender a modificar o ampliar su funcionalidad o, por qué no, programar sus propias extensiones.
A lo largo de estos tutoriales cubriremos todo tipo de temas, como la creación de módulos desde cero, creación de plugins, parámetros, migración de componentes... También hablaremos de cómo crear componentes con funcionalidades como el envío de emails, la carga de archivos... Pasaremos por AJAX, plantillas, flujo de trabajo, usar el editor en los componentes y todo lo que surja, siempre con el objetivo de explotar todas las posibilidades que nos ofrece Joomla! para conseguir lo que deseemos.

Por supuesto, lo más valioso de Joomla! es su Comunidad, y como tal, te invitamos a que nos hagas llegar tus sugerencias si deseas tener un tutorial en español sobre un tema concreto. Estaremos encantados de trabajar en ello y ayudarte en todo lo que podamos.

Traducido por: Carlos Rodríguez y Andoitz Brit

 Desarrollo de componentes en Joomla 2.5 (7 de 8) | Siguiente >

 

Pin It

Ratio: 5 / 5

Inicio activadoInicio activadoInicio activadoInicio activadoInicio activado

14- Añadiendo el control de acceso (ACL)

Con el control de acceso de joomla!, podemos definir la posibilidad de permitir o negar acciones en nuestro componente. En este ejemplo usamos las acciones que se definen en el núcleo de Joomla!. Para el componente en su conjunto: core.admin (acceso a la configuración) y core.manage (acceso desde la administración). Y en las acciones de los distintos niveles, como crear, eliminar y editar. Además de las acciones del núcleo, puedes definir tus propias acciones, pero que a menudo no es necesario y no se muestra en este ejemplo. Acceso de Lectura / Escritura  no se gestiona a través de esas acciones, pero si con niveles de acceso de las Vista; consulte la documentación general sobre Joomla! ACL para eso.

En la tabla # __assets la lista actual almacena: que grupos de usuarios se les concede o se les deniega hacer que acciones y en que recurso (assets).  Esta es la implementación de la lista de control de acceso (ACL).

En este artículo vamos a mostrar cómo agregar y utilizar los permisos de acceso a diferentes niveles de granularidad: para el componente como un todo, para las categorías y para los elementos individualmente.

Requisitos mínimos de ACL a nivel de componente

Hay dos acciones que deben ser definidas a nivel de componente para los componentes en Joomla! 2.5, para ofrecer un soporte básico de ACL.

  • Configuración (core.admin): ¿Qué grupos tiene permitido configurar el componente a través del botón “Opciones” de la barra de herramientas?
  • Acceso (core.manage): ¿Qué grupos tienen acceso al componente desde la administración?

Este soporte básico de ACL se realiza en 4 pasos sencillos:

Añadir los dos requisitos mínimos a nivel de componente en el archivo access.xml

 Agregar un archivo access.xml a la raíz de la carpeta admin. Coloque las 2 acciones básicas para el componente com_helloworld en este archivo.


 

<?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" />
</section>
</access>

 

Añadir los permisos fieldset en el archivo config.xml

Agregue los siguientes permisos fieldset en el archivo admin/config.xml con el fin de ser capaz de establecer permisos de nivel en nuestros componente:


 

<fieldset
name="permissions"
label="JCONFIG_PERMISSIONS_LABEL"
description="JCONFIG_PERMISSIONS_DESC"
>
<field
name="rules"
type="rules"
label="JCONFIG_PERMISSIONS_LABEL"
class="inputbox"
validate="rules"
filter="rules"
component="com_helloworld"
section="component"
/>
</fieldset>

Vea más abajo un ejemplo más elaborado del archivo config.xml , como ejemplo adicional para el lugar exacto dónde insertar este código.

Agregar el botón 'Opciones' a la barra de herramientas, siempre y cuando, el usuario está autorizado a ello

Añadir las siguientes líneas en el archivo admin/views/helloworlds/view.html.php :


 

// Botón Opciones.
   if (JFactory::getUser()->authorise('core.admin', 'com_helloworld'))   

{        

JToolBarHelper::preferences('com_helloworld');
}


Vea más abajo un ejemplo mejor elaborado de admin/views/helloworlds/view.html.php donde JToolBarHelper::preferences('com_helloworld') se realiza en el método addToolBar() junto con los otros botones de la barra de herramientas y la comprobación JUser->authorise() que se realiza en el archivo helper admin/helpers/helloworld.php , dando lugar a las propiedades $canDo .

Restringir el acceso al componente desde la administración, a grupos de usuarios autorizados

Para controlar esto, debes ingresar las siguientes líneas en el archivo admin/helloworld.php :


 

// Verificación de Acceso: Este usuario puede acceder al componente desde la administración?
if (!JFactory::getUser()->authorise('core.manage', 'com_helloworld'))
{
       return JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));

 Vea más abajo un ejemplo mejor elaborado de todo el código del archivo admin/helloworld.php.

Añadir más acciones a nivel de categoría y a nivel de elemento

Al agregar más acciones y más niveles, los cuatro pasos anteriormente descritos se realizan también. Pero esto provoca que también tengamos que hacer los siguientes pasos:

Describir las acciones para controlar el acceso a

Cada componente (o parte de él) tiene su propio conjunto de permisos que pueden ser controlados. Se describe en el archivo access.xml que se encuentra en la raíz de la carpeta de admin. En este ejemplo las acciones cuyo acceso está controlado se dividen en tres secciones: a nivel de componente, a nivel de categoría y a nivel del elemento. Un "elemento" es un "message" en nuestro componente de ejemplo, de ahí el nombre de la tercera sección.


 

<?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="category">
<action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" />
<action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
<action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_CATEGORIES_ACCESS_EDITOWN_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>

 

Agregar la configuración de permisos en las preferencias del componente

 Puesto que ahora se pueden utilizar los permisos de control de acceso en nuestro componente, tenemos que ser capaces de establecerlos desde nuestro componente. Esto se hace en las preferencias de este componente: la pantalla que aparece después de hacer clic en el botón "Opciones". El archivo config.xml es una forma de definición para las Preferencias. Podríamos definir también aquí las acciones a nivel del componente, pero ahora es preferible poner estas acciones en el archivo access.xml: de esa manera todas las reglas de acceso de este componente se encuentran en un solo lugar.

admin/config.xml 


 

<?xml version="1.0" encoding="utf-8"?>
<config>
<fieldset
name="greetings"
label="COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_LABEL"
description="COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_DESC"
>
<field
name="show_category"
type="radio"
label="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_DESC"
default="0"
>
<option value="0">JHIDE</option>
<option value="1">JSHOW</option>
</field>
</fieldset>
<fieldset
name="permissions"
label="JCONFIG_PERMISSIONS_LABEL"
description="JCONFIG_PERMISSIONS_DESC"
>
<field
name="rules"
type="rules"
label="JCONFIG_PERMISSIONS_LABEL"
class="inputbox"
validate="rules"
filter="rules"
component="com_helloworld"
section="component"
/>
</fieldset></config>

 

Viendo sólo los botones adecuados de la barra de herramientas

Los botones de la barra de herramientas a mostrar depende de los permisos de control de acceso para el usuario. Ponemos todos los permisos para este usuario en la propiedad $canDo de la vista, de modo que al final pueda referirse a ella en los diseños (en la edición de los formularios, por ejemplo).

En el archivo admin/views/helloworlds/view.html.php ubicamos las siguientes líneas:


 

<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');

// Importar biblioteca view de Joomla
jimport('joomla.application.component.view');

/**
* Vista HelloWorlds
*/
class HelloWorldViewHelloWorlds extends JViewLegacy
{
protected $items;
protected $pagination;
protected $canDo;
/**
* metodo para mostrar la vista HelloWorlds
* @return void
*/
function display($tpl = null)
{
// Obtener los datos del modelo
$this->items = $this->get('Items');
$this->pagination = $this->get('Pagination');

// ¿Qué tipos de permiso tiene este usuario? ¿Qué puede el o ella hacer?
$this->canDo = HelloWorldHelper::getActions();
// Verificar existencia de errores
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}

// Establecer la barra de herramientas
$this->addToolBar();

// Mostrar la plantilla
parent::display($tpl);

// Establecer el documento
$this->setDocument();
}

/**
* Setting the toolbar
*/
protected function addToolBar()
{
JToolBarHelper::title(JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLDS'), 'helloworld');
if ($this->canDo->get('core.create'))
{
JToolBarHelper::addNew('helloworld.add', 'JTOOLBAR_NEW');
}
if ($this->canDo->get('core.edit'))
{
JToolBarHelper::editList('helloworld.edit', 'JTOOLBAR_EDIT');
}
if ($this->canDo->get('core.delete'))
{
JToolBarHelper::deleteList('', 'helloworlds.delete', 'JTOOLBAR_DELETE');
}
if ($this->canDo->get('core.admin'))
{
JToolBarHelper::divider();
JToolBarHelper::preferences('com_helloworld');
}
}
/**
* Método para configurar las propiedades del documento
*
* @return void
*/
protected function setDocument()
{
$document = JFactory::getDocument();
$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION'));
}
}

 En el archivo admin/views/helloworld/view.html.php ubica las siguientes líneas:


 

<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');

// Importar biblioteca view de Joomla
jimport('joomla.application.component.view');

/**
* Vista HelloWorld
*/
class HelloWorldViewHelloWorld extends JViewLegacy
{
protected $form;
protected $item;
protected $script;
protected $canDo;
/**
* Mostrar el metodo de la vista Hello
* @return void
*/
public function display($tpl = null)
{
// Obtener los datos
$this->form = $this->get('Form');
$this->item = $this->get('Item');
$this->script = $this->get('Script');

// ¿Qué tipos de permiso tiene este usuario? ¿Qué puede el o ella hacer?
$this->canDo = HelloWorldHelper::getActions($this->item->id);
// Verificar existencia de errores
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}

// Establecer la barra de herremienta
$this->addToolBar();

// Mostrar la plantilla
parent::display($tpl);

// Establecer el documento
$this->setDocument();
}

/**
* Configuración de la barra de herramienta
*/
protected function addToolBar()
{
$input = JFactory::getApplication()->input;
$input->set('hidemainmenu', true);
$user = JFactory::getUser();
$userId = $user->id;
$isNew = $this->item->id == 0;
JToolBarHelper::title($isNew ? JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW')
: JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT'), 'helloworld');
// Construir las acciones para los registros nuevos y existentes.
if ($isNew)
{
// Para los nuevos registros, comprobar el permiso create
if ($this->canDo->get('core.create'))
{
JToolBarHelper::apply('helloworld.apply', 'JTOOLBAR_APPLY');
JToolBarHelper::save('helloworld.save', 'JTOOLBAR_SAVE');
JToolBarHelper::custom('helloworld.save2new', 'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
}
JToolBarHelper::cancel('helloworld.cancel', 'JTOOLBAR_CANCEL');
}
else
{
if ($this->canDo->get('core.edit'))
{
// Podemos guardar el nuevo registro
JToolBarHelper::apply('helloworld.apply', 'JTOOLBAR_APPLY');
JToolBarHelper::save('helloworld.save', 'JTOOLBAR_SAVE');

// Podemos guardar este registro, pero revise el permiso create a ver
// si podemos volver a hacer uno nuevo.
if ($this->canDo->get('core.create'))
{
JToolBarHelper::custom('helloworld.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
}
}
if ($this->canDo->get('core.create'))
{
JToolBarHelper::custom('helloworld.save2copy', 'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
}
JToolBarHelper::cancel('helloworld.cancel', 'JTOOLBAR_CLOSE');
}
}
/**
* Método para configurar las propiedades del documento
*
* @return void
*/
protected function setDocument()
{
$isNew = $this->item->id == 0;
$document = JFactory::getDocument();
$document->setTitle($isNew ? JText::_('COM_HELLOWORLD_HELLOWORLD_CREATING')
: JText::_('COM_HELLOWORLD_HELLOWORLD_EDITING'));
$document->addScript(JURI::root() . $this->script);
$document->addScript(JURI::root() . "/administrator/components/com_helloworld"
. "/views/helloworld/submitbutton.js");
JText::script('COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE');
}
}

 Estos dos archivos utilizan el método definido getActions en el archivo admin/helpers/helloworld.php:


 

<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die;

/**
* Componente HelloWorld helper.
*/
abstract class HelloWorldHelper
{
/**
* Configurar la barra de enlaces.
*/
public static function addSubmenu($submenu)
{
JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_MESSAGES'),
'index.php?option=com_helloworld', $submenu == 'messages');
JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_CATEGORIES'),
'index.php?option=com_categories&view=categories&extension=com_helloworld',
$submenu == 'categories');
// establecer algunas propiedades globales
$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'));
}
}

/**
* Obtener las acciones
*/
public static function getActions($messageId = 0)
{
jimport('joomla.access.access');
$user = JFactory::getUser();
$result = new JObject;

if (empty($messageId))
{
$assetName = 'com_helloworld';
}
else {
$assetName = 'com_helloworld.message.'.(int) $messageId;
}
$actions = JAccess::getActions('com_helloworld', 'component');

foreach ($actions as $action)
{
$result->set($action->name, $user->authorise($action->name, $assetName));
}
return $result;
}
}

 

Restringir el acceso al componente

La idea principal en el ACL es restringir las acciones a grupos de usuarios. La primera medida que ha restringido es el acceso del propio componente por la administración. Con tu editor favorito agrega esta líneas al archivo admin/helloworld.php :


 

<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');

// Verificación de acceso: ¿Este usuario puede acceder al componente desde la administración?
if (!JFactory::getUser()->authorise('core.manage', 'com_helloworld'))
{
return JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));
}
// Requiere del archivo helper
JLoader::register('HelloWorldHelper', dirname(__FILE__) . '/helpers/helloworld.php');

// Importar biblioteca controller de Joomla
jimport('joomla.application.component.controller');

// Obtener una instancia del controlador prefijado por HelloWorld
$controller = JController::getInstance('HelloWorld');

// Realice la tarea Solicitada
$input = JFactory::getApplication()->input;
$controller->execute($input->getCmd('task'));

// Redirigir si se define por el controlador
$controller->redirect();

 

Agregue la columna asset_id a la tabla de la base de datos

Con el fin de ser capaz de trabajar con JTable la columna asset_id tiene que ser creada en la tabla #__helloworld . Así que, admin/sql/install.mysql.utf8.sql se convierte en: 


 

DROP TABLE IF EXISTS `#__helloworld`;

CREATE TABLE `#__helloworld` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `asset_id` INT(10) NOT NULL DEFAULT '0',  `greeting` varchar(25) NOT NULL,
 `catid` int(11) NOT NULL DEFAULT '0',
 `params` TEXT NOT NULL DEFAULT '',
  PRIMARY KEY  (`id`)
);

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

 Para las actualizaciones se añade en el archivo admin/sql/updates/mysql/0.0.14.sql :

ALTER TABLE`#__helloworld` ADD COLUMN `asset_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `id`;

Restringir el acceso a los mensajes

Hasta ahora hemos restringido el acceso al componente en sí, pero también tenemos que hacerlo a nivel de mensaje.
Para verificar el permiso “core.delete” necesitamos modificar la clase del modelo admin/models/helloworld.php añadiendo las siguientes líneas:


 

/**
* Método para comprobar si está preparado para borrar un mensaje. Sobrescribe JModelAdmin::canDelete
*/
protected function canDelete($record)
{
if( !empty( $record->id ) ){
$user = JFactory::getUser();
return $user->authorise( "core.delete", "com_helloworld.message." . $record->id );
}

 Para comprobar el "core.edit" (y el “core.add” si lo desea) necesitas actualizar el sub-controlador (no el modelo). No estoy seguro de porqué esto es así, pero así es como otros componentes estándar de Joomla! lo hacen. Es necesario añadir las siguientes líneas en el archivo: /admin/controllers/helloworld.php 


 

/**
* Aplicar allowAdd o no
*
* No se utiliza en este momento (pero se puede ver cómo otros componentes lo usan ....)
* Sobreescribiendo: JControllerForm::allowAdd
*
* @paramarray $data
* @return bool
*/
protected function allowAdd($data = array())
{
return parent::allowAdd($data);
}

/**
* Implementar para permitir o no editar
* Sobreescribiendo: JControllerForm::allowEdit
*
* @paramarray $data
* @paramstring $key
* @return bool
*/
protected function allowEdit($data = array(), $key = 'id')
{
$id = isset( $data[ $key ] ) ? $data[ $key ] : 0;
if( !empty( $id ) ){
$user = JFactory::getUser();
return $user->authorise( "core.edit", "com_helloworld.message." . $id );
}
}

 


 Tenga en cuenta que allowAdd simplemente llama al padre. Lo he puesto aquí en caso de que quiera hacer uso de ella en su componente. Si nos fijamos en el archivo admin/access.xml  te darás cuenta de que no hay acción core.add definido para "messages", por lo que tendrá que añadirlo también allí si quieres ser capaz de configurar la interfaz.

 Desarrollo de componentes en Joomla 2.5 (6 de 8)Desarrollo de componentes en Joomla 2.5 (8 de 8)

 

Pin It


Redes:



 

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

Probablemente te niegues, pero.. ¿Podrías ayudarnos con una donación?


Tutorial de Linux

Filtro por Categorías