Actualización a APS Conecta Gestión 20¶
Resumen¶
Esta página enumera los cambios de la versión 20 que afectan a las apps: las clases de tema, la actualización de jQuery, la búsqueda unificada, las variables globales eliminadas u obsoletas, la nueva API de arranque, la integración de PSR-3 y PSR-11, las API y eventos obsoletos y lo retirado del espacio de nombres público. Está dirigida a quienes desarrollan o mantienen apps.
Fuente: documentación de Nextcloud, «developer_manual/release_notes/previous/upgrade_to_20», versión 3ad9158, licencia CC BY 3.0; traducida y adaptada para APS Conecta Gestión.
Nota
Los cambios críticos se recopilaron en GitHub. Consultar el ticket original para ver los enlaces a las pull requests y a los tickets.
Cambios de frontend¶
Tema del elemento body¶
Las clases de tema del elemento body ahora son theme--highcontrast, theme--dark y/o theme--light.
Actualización de jQuery¶
jQuery se actualizó a la v2.2. El cambio más notable es que $(document).ready(...), o $(...) en su forma abreviada, se dispara antes que hasta ahora. Usar en su lugar el evento DOMContentLoaded.
Búsqueda¶
La búsqueda unificada reemplaza el campo de búsqueda tradicional, por lo que OCA.Search pasó a no hacer nada (noop). Por compatibilidad con versiones anteriores, el código no generará errores por ahora, pero no tiene ninguna funcionalidad.
Variables globales eliminadas¶
escape-html: usar el paquete escape-html o similar
Variables globales obsoletas¶
humanFileSize: usarformatfilesizede https://www.npmjs.com/package/@nextcloud/filesOC.getCanonicalLocale: usargetCanonicalLocalede https://www.npmjs.com/package/@nextcloud/l10n
Plugins de jQuery eliminados¶
$.tipsy
Cambios de backend¶
Lógica de arranque de la app¶
El código que inicializa una app, o cualquier cosa que deba ejecutarse en cada solicitud y en cada comando, se trasladó ahora a una API dedicada y tipada. Por lo tanto, appinfo/app.php queda en desuso y obsoleto. Ver arranque para los detalles.
Integración de PSR-3¶
APS Conecta Gestión 20 es la primera versión mayor de APS Conecta Gestión que ofrece compatibilidad total con PSR-3: Interfaz de logger. A partir de ahora se recomienda encarecidamente usar esta interfaz, principalmente porque la antigua \OCP\ILogger quedó obsoleta con los últimos cambios que faltaban. La mayoría de los métodos son idénticos entre la interfaz específica de APS Conecta Gestión y la de PSR. Prestar atención a los usos de \OCP\ILogger::logException, ya que ese método no existe en el logger de PSR. Sin embargo, se puede indicar una clave exception en el argumento $context de cualquier método de \Psr\Log\LoggerInterface y APS Conecta Gestión la formateará como lo hacía con el antiguo logException.
Integración de PSR-11¶
APS Conecta Gestión 20 es la primera versión mayor de APS Conecta Gestión que ofrece compatibilidad total con PSR-11: Interfaz de contenedor. A partir de ahora se recomienda encarecidamente usar esta interfaz, principalmente porque la antigua \OCP\IContainer quedó obsoleta con este cambio.
Las interfaces \OCP\AppFramework\IAppContainer y \OCP\IServerContainer se mantendrán, pero dejarán de extender IContainer una vez que esa interfaz se elimine. Como resultado, IAppContainer e IServerContainer acabarán siendo interfaces de marcado cuyo único propósito es permitir que se inyecte explícitamente el contenedor de la app o el del servidor.
Si la app requiere APS Conecta Gestión 20 o posterior, se puede reemplazar cualquiera de las antiguas declaraciones de tipo por una de \Psr\Container\ContainerInterface y reemplazar las llamadas a query por get, por ejemplo en los closures que se usan al registrar servicios:
// old
$container->registerService('DecryptAll', function (IAppContainer $c) {
return new DecryptAll(
$c->query('Util'),
$c->query(KeyManager::class),
$c->query('Crypt'),
$c->query(ISession::class)
)
})
se convierte en
// new
$container->registerService('DecryptAll', function (ContainerInterface $c) {
return new DecryptAll(
$c->get('Util'),
$c->get(KeyManager::class),
$c->get('Crypt'),
$c->get(ISession::class)
)
})
Nota
Para una transición más suave, las interfaces antiguas se modificaron para que se basen en ContainerInterface, de modo que se pueden usar has y get en IContainer y sus subtipos.
API obsoletas¶
\OCP\IContainer: ver Integración de PSR-11\OCP\ILogger: ver Integración de PSR-3\OCP\IServerContainer::getEventDispatcher\OCP\IServerContainer::getCalendarManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCalendarResourceBackendManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCalendarRoomBackendManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getContactsManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getEncryptionManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getEncryptionFilesHelper: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getEncryptionKeyStorage: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getRequest: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getPreviewManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getTagManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getSystemTagManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getSystemTagObjectMapper: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getAvatarManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getRootFolder\OCP\IServerContainer::getUserManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getGroupManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getUserSession: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getSession: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getTwoFactorAuthManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getNavigationManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getConfig: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getSystemConfig: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getAppConfig: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getL10NFactory: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getL10N: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getURLGenerator: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getAppFetcher: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getMemCacheFactory: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getGetRedisFactory: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getDatabaseConnection: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getActivityManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getJobList: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getLogger: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getLogFactory: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getRouter: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getSearch: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getSecureRandom: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCrypto: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getHasher: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCredentialsManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCertificateManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getHTTPClientService: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::createEventSource\OCP\IServerContainer::getEventLogger: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getQueryLogger: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getTempManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getAppManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getMailer: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getWebRoot: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getOcsClient: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getDateTimeZone: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getDateTimeFormatter: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getMountProviderCollection: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getIniWrapper: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCommandBus: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getTrustedDomainHelper: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getLockingProvider: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getMountManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getUserMountCache: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getMimeTypeDetector: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getMimeTypeLoader: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCapabilitiesManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getNotificationManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCommentsManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getThemingDefaults: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getIntegrityCodeChecker: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getSessionCryptoWrapper: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCsrfTokenManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getBruteForceThrottler: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getContentSecurityPolicyManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getContentSecurityPolicyNonceManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getStoragesBackendService: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getGlobalStoragesService: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getUserGlobalStoragesService: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getUserStoragesService: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getShareManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCollaboratorSearch: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getAutoCompleteManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getLDAPProvider: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getSettingsManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getAppDataDir\OCP\IServerContainer::getCloudIdManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getGlobalScaleConfig: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCloudFederationProviderManager: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getRemoteApiFactory: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getCloudFederationFactory: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getRemoteInstanceFactory: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getStorageFactory: hacer que se inyecte la interfaz en su lugar\OCP\IServerContainer::getGeneratorHelper: hacer que se inyecte la interfaz en su lugar\OC_App::registerLogIn(): usar el arranque y\OCP\AppFramework\Bootstrap\IRegistrationContext::registerAlternativeLoginEvento
\OCA\DAV\CalDAV\CalDavBackend::createCachedCalendarObject: escuchar\OCA\DAV\Events\CachedCalendarObjectCreatedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::createCalendar: escuchar\OCA\DAV\Events\CalendarCreatedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject: escuchar\OCA\DAV\Events\CalendarObjectCreatedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::createSubscription: escuchar\OCA\DAV\Events\SubscriptionCreatedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::deleteCachedCalendarObject: escuchar\OCA\DAV\Events\CachedCalendarObjectDeletedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar: escuchar\OCA\DAV\Events\CalendarDeletedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject: escuchar\OCA\DAV\Events\CalendarObjectDeletedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::deleteSubscription: escuchar\OCA\DAV\Events\SubscriptionDeletedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::publishCalendar: escuchar\OCA\DAV\Events\CalendarPublishedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::publishCalendar: escuchar\OCA\DAV\Events\CalendarUnpublishedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::updateCachedCalendarObject: escuchar\OCA\DAV\Events\CachedCalendarObjectUpdatedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::updateCalendar: escuchar\OCA\DAV\Events\CalendarUpdatedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject: escuchar\OCA\DAV\Events\CalendarObjectUpdatedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::updateShares: escuchar\OCA\DAV\Events\CalendarShareUpdatedEventEvento
\OCA\DAV\CalDAV\CalDavBackend::updateSubscription: escuchar\OCA\DAV\Events\SubscriptionUpdatedEventEvento
\\OCA\DAV\CardDAV\CardDavBackend::createCard: escuchar\OCA\DAV\Events\CardCreatedEventEvento
\OCA\DAV\CardDAV\CardDavBackend::deleteCard: escuchar\OCA\DAV\Events\CardDeletedEventEvento
\OCA\DAV\CardDAV\CardDavBackend::updateCard: escuchar\OCA\DAV\Events\CardUpdatedEventEvento
\OCA\Files_Sharing::loadAdditionalScripts:: publicShareAuth: escuchar\OCA\Files_Sharing\Event\BeforeTemplateRenderedEventEvento
\OCA\Files_Sharing::loadAdditionalScripts: escuchar\OCA\Files_Sharing\Event\BeforeTemplateRenderedEventEvento
\OCA\User_LDAP\User\User::postLDAPBackendAdded: escuchar\OCA\User_LDAP\Events\UserBackendRegisteredEvento
\OCA\User_LDAP\User\User::postLDAPBackendAdded: escuchar\OCA\User_LDAP\Events\GroupBackendRegisteredEvento
\OCP\AppFramework\Http\StandaloneTemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPT: escuchar\OCP\AppFramework\Http\Events\BeforeTemplateRenderedEventEvento
\OCP\AppFramework\Http\StandaloneTemplateResponse::EVENT_LOAD_ADDITIONAL_SCRIPTS_LOGGEDIN: escuchar\OCP\AppFramework\Http\Events\BeforeTemplateRenderedEventEvento
\OCP\WorkflowEngine::loadAdditionalSettingScripts: escuchar\OCP\WorkflowEngine\Events\LoadSettingsScriptsEvent
Eliminado del espacio de nombres público¶
\OCP\IServerContainer::getAppFolderHook
\OCA\DAV\Connector\Sabre::authInit: usar en su lugar el evento\OCA\DAV\Events\SabrePluginAuthInitEventEvento
\OC_User::post_removeFromGroup: escuchar\OCP\Group\Events\UserRemovedEventEvento
\OCA\DAV\Connector\Sabre::authInit: escuchar\OCA\DAV\Events\SabrePluginAuthInitEvent