Scatter chart
El scatter chart o gráfico de dispersión es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
Drupal\user\Entity\Role::postLoad(Object, Array) (Line: 423) Drupal\Core\Entity\EntityStorageBase->postLoad(Array) (Line: 353) Drupal\Core\Entity\EntityStorageBase->loadMultiple(Array) (Line: 16) Drupal\user\RoleStorage->isPermissionInRoles('access site in maintenance mode', Array) (Line: 112) Drupal\Core\Session\UserSession->hasPermission('access site in maintenance mode') (Line: 105) Drupal\Core\Session\AccountProxy->hasPermission('access site in maintenance mode') (Line: 83) Drupal\redirect\RedirectChecker->canRedirect(Object) (Line: 120) Drupal\redirect\EventSubscriber\RedirectRequestSubscriber->onKernelRequestCheckRedirect(Object, 'kernel.request', Object) call_user_func(Array, Object, 'kernel.request', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.request') (Line: 145) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54) Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 141) Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104) Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82) Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33) Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894) Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045) Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903) Drupal\views\ViewExecutable->initHandlers() (Line: 2318) Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697) Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54) Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228) Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 144) Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104) Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82) Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33) Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894) Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045) Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903) Drupal\views\ViewExecutable->initHandlers() (Line: 2318) Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697) Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54) Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228) Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 110) Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82) Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33) Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894) Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045) Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903) Drupal\views\ViewExecutable->initHandlers() (Line: 2318) Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697) Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 35) Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894) Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045) Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903) Drupal\views\ViewExecutable->initHandlers() (Line: 2318) Drupal\views\Plugin\views\display\DisplayPluginBase->preExecute() (Line: 1697) Drupal\views\ViewExecutable->preExecute(Array) (Line: 1632) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('views') (Line: 1316) Drupal\views\Plugin\views\query\Sql->query() (Line: 1454) Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326) Drupal\views\ViewExecutable->build() (Line: 392) Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196) Drupal\views\Plugin\views\display\Page->execute() (Line: 1635) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('views_substitutions', Array) (Line: 1418) Drupal\views\Plugin\views\query\Sql->query() (Line: 1454) Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326) Drupal\views\ViewExecutable->build() (Line: 392) Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196) Drupal\views\Plugin\views\display\Page->execute() (Line: 1635) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('views') (Line: 1316) Drupal\views\Plugin\views\query\Sql->query(1) (Line: 1455) Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326) Drupal\views\ViewExecutable->build() (Line: 392) Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196) Drupal\views\Plugin\views\display\Page->execute() (Line: 1635) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('views_substitutions', Array) (Line: 1418) Drupal\views\Plugin\views\query\Sql->query(1) (Line: 1455) Drupal\views\Plugin\views\query\Sql->build(Object) (Line: 1326) Drupal\views\ViewExecutable->build() (Line: 392) Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196) Drupal\views\Plugin\views\display\Page->execute() (Line: 1635) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54) Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 141) Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104) Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82) Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33) Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894) Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045) Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903) Drupal\views\ViewExecutable->initHandlers() (Line: 1876) Drupal\views\ViewExecutable->buildTitle() (Line: 338) Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733) Drupal\views\ViewExecutable->attachDisplays() (Line: 1333) Drupal\views\ViewExecutable->build() (Line: 392) Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196) Drupal\views\Plugin\views\display\Page->execute() (Line: 1635) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54) Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228) Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 144) Drupal\views\Plugin\views\PluginBase->init(Object, Object, Array) (Line: 104) Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82) Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33) Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894) Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045) Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903) Drupal\views\ViewExecutable->initHandlers() (Line: 1876) Drupal\views\ViewExecutable->buildTitle() (Line: 338) Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733) Drupal\views\ViewExecutable->attachDisplays() (Line: 1333) Drupal\views\ViewExecutable->build() (Line: 392) Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196) Drupal\views\Plugin\views\display\Page->execute() (Line: 1635) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 54) Drupal\views\Plugin\views\argument\ManyToOne->defineOptions() (Line: 228) Drupal\views\Plugin\views\PluginBase->unpackOptions(Array, Array) (Line: 110) Drupal\views\Plugin\views\HandlerBase->init(Object, Object, Array) (Line: 82) Drupal\views\Plugin\views\argument\ArgumentPluginBase->init(Object, Object, Array) (Line: 33) Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894) Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045) Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903) Drupal\views\ViewExecutable->initHandlers() (Line: 1876) Drupal\views\ViewExecutable->buildTitle() (Line: 338) Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733) Drupal\views\ViewExecutable->attachDisplays() (Line: 1333) Drupal\views\ViewExecutable->build() (Line: 392) Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196) Drupal\views\Plugin\views\display\Page->execute() (Line: 1635) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\views\ManyToOneHelper->__construct(Object) (Line: 35) Drupal\views\Plugin\views\argument\ManyToOne->init(Object, Object, Array) (Line: 894) Drupal\views\Plugin\views\display\DisplayPluginBase->getHandlers('argument') (Line: 1045) Drupal\views\ViewExecutable->_initHandler('argument', Array) (Line: 903) Drupal\views\ViewExecutable->initHandlers() (Line: 1876) Drupal\views\ViewExecutable->buildTitle() (Line: 338) Drupal\views\Plugin\views\display\Feed->attachTo(Object, 'page_1', Array) (Line: 1733) Drupal\views\ViewExecutable->attachDisplays() (Line: 1333) Drupal\views\ViewExecutable->build() (Line: 392) Drupal\views\Plugin\views\display\PathPluginBase->execute() (Line: 196) Drupal\views\Plugin\views\display\Page->execute() (Line: 1635) Drupal\views\ViewExecutable->executeDisplay('page_1', Array) (Line: 81) Drupal\views\Element\View::preRenderViewElement(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '989b4cd6-dcc3-4346-8608-9b230bc33a60') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '989b4cd6-dcc3-4346-8608-9b230bc33a60') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '989b4cd6-dcc3-4346-8608-9b230bc33a60') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '989b4cd6-dcc3-4346-8608-9b230bc33a60') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '27b51a97-0ac5-40b2-abb0-9e708b1db394') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '27b51a97-0ac5-40b2-abb0-9e708b1db394') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '27b51a97-0ac5-40b2-abb0-9e708b1db394') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '27b51a97-0ac5-40b2-abb0-9e708b1db394') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '20dfd04d-26a3-48d9-8c42-1aeb4b16be01') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '20dfd04d-26a3-48d9-8c42-1aeb4b16be01') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '20dfd04d-26a3-48d9-8c42-1aeb4b16be01') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '20dfd04d-26a3-48d9-8c42-1aeb4b16be01') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '78e6968d-a9bc-4584-a509-ae06835a660f') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '78e6968d-a9bc-4584-a509-ae06835a660f') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '78e6968d-a9bc-4584-a509-ae06835a660f') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '78e6968d-a9bc-4584-a509-ae06835a660f') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '237ffa4e-15ec-4415-ab54-14fb61e498ce') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '237ffa4e-15ec-4415-ab54-14fb61e498ce') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '237ffa4e-15ec-4415-ab54-14fb61e498ce') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '237ffa4e-15ec-4415-ab54-14fb61e498ce') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Multi KPI</strong> de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés. Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración: Comencemos llevando el campo <em>Date</em> del calendario de nuestro modelo de datos al campo <em>Date</em> de la visualización. Al campo <em>Values</em> deberemos llevar la métrica cuya evolución en el tiempo queremos analizar. Si se trata de una medida discreta, como el total de ventas por día, la gráfica resultante va a ser poco informativa: Es por ello que resulta más interesante representar métricas como acumulados en el tiempo, o valores medios, etc. Si definimos, por ejemplo, la medida siguiente para calcular el acumulado de ventas: Sales running total in Date = CALCULATE( [Sales]; FILTER( ALLSELECTED('Calendar'[Date]); ISONORAFTER('Calendar'[Date]; MAX('Calendar'[Date]); DESC) ) ) ...y la llevamos a nuestra visualización, el resultado es mucho más útil: En la visualización se muestra el valor actual de la métrica (3 millones de euros), el incremento que esta cifra representa respecto al dato del primer día (354.33K%) y el número de días representados (1.825). Moviendo el cursor por encima de la gráfica podemos ver, para la fecha correspondiente, cuál era el valor de la métrica: En la imagen vemos que el sábado 4 de marzo de 2017 las ventas acumuladas eran de 1M€. Podemos cambiar el formato de los valores (para que se muestren en miles, por ejemplo) en <em>Formato > Values Display Units</em>, aunque esto puede obligarnos a modificar el tamaño de la fuente a usar con los valores. Para la gráfica principal podemos cambiar el tamaño de la fuente del valor representado desactivando la opción <em>Formato > KPI > Auto Font Size</em>, y fijando el tamaño que nos interese en <em>Formato > KPI > Value Font Size</em>. Por supuesto podemos configurar muchas otras características de la fuente. Los tamaños a usar cuando estemos moviendo el cursor por encima de la gráfica son configurables por separado, en <em>Formato > KPI On Hover</em>. Si llevamos al campo <em>Values</em> de la visualización más de un campo de nuestro modelo de datos, se muestran pequeñas gráficas (<em>sparklines</em>) para éstos -completamente configurables- en la parte inferior de la visualización. Así, si llevamos los campos <em>Units</em> (número de unidades vendidas), <em>Sales</em> (cifra de ventas) y <em>Margin</em> (margen de ventas), la visualización mostrará el aspecto mostrado en la siguiente imagen, mostrándose la cifra de dichas métricas para la fecha sobre la que mantengamos el cursor: Una opción muy útil: Si movemos el cursor encima de alguna de estas sparklines, pasa a ocupar la posición de la gráfica principal. Para volver al estado inicial, basta con mover el cursor fuera de la visualización. Los campos <em>Warning State</em> y <em>Change start</em> date no parecen estar siendo considerados (lo estarán, simplemente no consigo ver cómo se aplican). Visualización sumamente práctica y muy configurable, tal vez solo se le puede echar en cara la falta de documentación al respecto de los campos mencionados y de algunas de las opciones de formato que no resultan excesivamente obvias. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c150cdcd-2cab-46d5-9225-e22442deedd8') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c150cdcd-2cab-46d5-9225-e22442deedd8') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c150cdcd-2cab-46d5-9225-e22442deedd8') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c150cdcd-2cab-46d5-9225-e22442deedd8') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9c87924a-f094-48f8-b551-30f8fd402e28') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9c87924a-f094-48f8-b551-30f8fd402e28') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9c87924a-f094-48f8-b551-30f8fd402e28') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9c87924a-f094-48f8-b551-30f8fd402e28') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f95784f-71a3-4f76-99cc-79b70cff766a') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f95784f-71a3-4f76-99cc-79b70cff766a') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f95784f-71a3-4f76-99cc-79b70cff766a') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0f95784f-71a3-4f76-99cc-79b70cff766a') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '5acbd221-133f-40a8-bf27-70c559cd6206') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '5acbd221-133f-40a8-bf27-70c559cd6206') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '5acbd221-133f-40a8-bf27-70c559cd6206') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '5acbd221-133f-40a8-bf27-70c559cd6206') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4bf8ba46-380e-4b24-86c2-abb097d794c2') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4bf8ba46-380e-4b24-86c2-abb097d794c2') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4bf8ba46-380e-4b24-86c2-abb097d794c2') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '4bf8ba46-380e-4b24-86c2-abb097d794c2') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'bfb7a225-76e2-4b01-83e0-b189606af97f') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'bfb7a225-76e2-4b01-83e0-b189606af97f') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'bfb7a225-76e2-4b01-83e0-b189606af97f') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'bfb7a225-76e2-4b01-83e0-b189606af97f') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1bb663e9-0764-47ac-ba09-2d078f5d4d6b') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1bb663e9-0764-47ac-ba09-2d078f5d4d6b') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1bb663e9-0764-47ac-ba09-2d078f5d4d6b') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1bb663e9-0764-47ac-ba09-2d078f5d4d6b') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '69abf18e-c7c5-4538-be99-9e73e7859b0f') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '69abf18e-c7c5-4538-be99-9e73e7859b0f') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '69abf18e-c7c5-4538-be99-9e73e7859b0f') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '69abf18e-c7c5-4538-be99-9e73e7859b0f') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3a83bf56-f7fe-47ae-98bd-213f92b3899e') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3a83bf56-f7fe-47ae-98bd-213f92b3899e') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3a83bf56-f7fe-47ae-98bd-213f92b3899e') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3a83bf56-f7fe-47ae-98bd-213f92b3899e') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '79727987-392a-4c40-8d53-77dc448506e8') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '79727987-392a-4c40-8d53-77dc448506e8') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '79727987-392a-4c40-8d53-77dc448506e8') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '79727987-392a-4c40-8d53-77dc448506e8') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('<strong>Pulse Chart</strong> es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa. Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización: Partimos de una tabla que contiene un campo temporal (<em>Date</em> en el ejemplo), un campo cuantitativo que será el que mostremos en el gráfico asociado a las fechas (<em>Sales</em>) y, para algunos registros, tenemos un titular (<em>Event Title</em>) y una descripción (<em>Event</em>). Por último, hay una cifra asociada a los registros que contienen eventos (<em>Size</em>). Los campos de la visualización son los siguientes: Los nombres de éstos son bastante explícitos y encajan con los contenidos en la tabla. Arrastremos los campos <em>Date</em> a <em>Marca de tiempo</em>, y <em>Sales</em> a <em>Valores</em>: El resultado inicial puede resultar un poco confuso al mostrarse la gráfica sobre las marcas temporales, pero podemos configurar la gráfica para que éstas se muestren en la parte inferior en <em>Formato > Eje X > Posición (Inferior)</em>. Vemos también que la gráfica exige demasiado espacio por debajo (espacio vacío) para mostrarse con un tamaño adecuado. Al contrario de lo que cabría esperar, la visualización no muestra una ventana emergente con el valor siendo representado al mover el cursor por encima de la gráfica. Vemos en la parte superior un conjunto de controles de reproducción: un clic en el botón de "<em>Play</em>" (el situado en el extremo izquierdo) elimina la gráfica y comienza a dibujarla poco a poco: Lo verdaderamente interesante ocurre cuando llevamos nuestros campos <em>Event Title</em> y <em>Event</em> a los campos de la visualización <em>Título del evento</em> y <em>Descripción del evento</em>, respectivamente. Ahora la gráfica muestra un conjunto de puntos para aquellas fechas en las que exista un evento, y un clic en uno de estos puntos abre una ventana emergente con la descripción del evento: Un par de consideraciones que nos vienen a la cabeza en seguida: la ventana en cuestión tiene un diseño bastante feo (aunque es hasta cierto punto configurable), no muestra el título del evento, solo la descripción, y el mes no se muestra correctamente (aparece una etiqueta "MM" en su lugar, claro error de programación). El aspecto de la ventana emergente es modificable en <em>Formato > Emergente</em>. Podemos modificar sus dimensiones, el color del fondo y de la fuente, podemos mostrar u ocultar el título y la fecha... Y vemos aquí que, por otro error de programación, la fecha se muestra sobre el título. Y basta con aplicar un ancho suficiente a la ventana para ver tanto el título como la fecha. Aun así, en cuanto el título tiene varias palabras de ancho ya solapa con ésta. Además, los texto correspondientes al título y a la fecha no son configurables (su tamaño, por ejemplo): Si, ahora que hemos llevado los eventos a la visualización, volvemos a hacer clic en el botón de reproducción que se muestra en la esquina superior izquierda, la gráfica volverá a redibujarse parando en cada uno de los eventos y mostrando la ventana asociada. La reproducción es configurable en <em>Formato > Reproducción</em>: Para empezar podemos activar o desactivar la reproducción automática: si está activa, la reproducción comenzará automáticamente nada más mostrarse la visualización en pantalla (puede retrasarse este arranque especificando en el campo <em>Retraso de inicio</em> el número de segundos a esperar). Por el contrario, si está desactivada, tendremos que hacer nosotros clic en el botón de reproducción comentado. Las ventanas se mostrarán durante el número de segundos indicado en el campo <em>Duración de la pausa</em> que se ve en la imagen anterior. Si deseamos que la ventana permanezca hasta que nosotros hagamos otro clic en el botón de reproducción, la única opción que tenemos es la de introducir un valor muy elevando en el campo mencionado (por ejemplo, 999). Volviendo a la configuración de la visualización, el campo <em>Tamaño del evento</em> controla el tamaño del punto que se muestra para cada evento. Si llevamos hasta aquí nuestro campo <em>Size</em>, la visualización se muestra de la siguiente forma: Podemos regular el tamaño relativo de estos puntos en <em>Formato > Puntos</em>, así como configurar su color y grado de transparencia: El resultado de aplicar la anterior configuración es el siguiente: El campo de la visualización <em>Contador acumulado</em> debería -según se deduce de su nombre- controlar un contador que se fuese incrementando, por ejemplo, a medida que se recorre la gráfica o los eventos. Por el contrario, aparentemente se limita a mostrar una cifra asociada a cada fecha, sin acumular ni contar nada. Podemos ver esto si llevamos el campo <em>Sales</em> a este campo y reproducimos la gráfica. En general se trata de una idea muy interesante, que puede resultar de una gran utilidad en escenarios muy concretos, aunque los errores de programación comentados y un diseño gráfico mejorable lastran un poco su atractivo. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3bd8bb92-c2d3-4983-8e0e-8bc4022cb2f6') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3bd8bb92-c2d3-4983-8e0e-8bc4022cb2f6') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3bd8bb92-c2d3-4983-8e0e-8bc4022cb2f6') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '3bd8bb92-c2d3-4983-8e0e-8bc4022cb2f6') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c8f5c4ae-442b-458f-9af8-3b54d5175733') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c8f5c4ae-442b-458f-9af8-3b54d5175733') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c8f5c4ae-442b-458f-9af8-3b54d5175733') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c8f5c4ae-442b-458f-9af8-3b54d5175733') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b944e72-aa10-4092-9e8f-30dba1aa5706') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b944e72-aa10-4092-9e8f-30dba1aa5706') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b944e72-aa10-4092-9e8f-30dba1aa5706') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '1b944e72-aa10-4092-9e8f-30dba1aa5706') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8f9ecbd0-cc9f-4f47-9f0e-f95e2f4b43ac') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8f9ecbd0-cc9f-4f47-9f0e-f95e2f4b43ac') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8f9ecbd0-cc9f-4f47-9f0e-f95e2f4b43ac') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8f9ecbd0-cc9f-4f47-9f0e-f95e2f4b43ac') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'da590f8f-a413-49ed-8062-461742a8f9a3') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'da590f8f-a413-49ed-8062-461742a8f9a3') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'da590f8f-a413-49ed-8062-461742a8f9a3') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'da590f8f-a413-49ed-8062-461742a8f9a3') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8585059e-bb24-4930-9341-453661998d33') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8585059e-bb24-4930-9341-453661998d33') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8585059e-bb24-4930-9341-453661998d33') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '8585059e-bb24-4930-9341-453661998d33') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '66f64f25-8585-4075-a857-fb7fd0f20176') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '66f64f25-8585-4075-a857-fb7fd0f20176') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '66f64f25-8585-4075-a857-fb7fd0f20176') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '66f64f25-8585-4075-a857-fb7fd0f20176') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c056598d-3108-4264-814d-2728e43bebbb') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c056598d-3108-4264-814d-2728e43bebbb') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c056598d-3108-4264-814d-2728e43bebbb') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c056598d-3108-4264-814d-2728e43bebbb') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'eb08a528-773e-4a35-a991-04fcd9e88809') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'eb08a528-773e-4a35-a991-04fcd9e88809') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'eb08a528-773e-4a35-a991-04fcd9e88809') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'eb08a528-773e-4a35-a991-04fcd9e88809') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b332d446-34ef-4505-8036-5154853b7af3') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b332d446-34ef-4505-8036-5154853b7af3') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b332d446-34ef-4505-8036-5154853b7af3') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'b332d446-34ef-4505-8036-5154853b7af3') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '536cb58e-e441-47d8-8340-194286bb245b') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '536cb58e-e441-47d8-8340-194286bb245b') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '536cb58e-e441-47d8-8340-194286bb245b') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '536cb58e-e441-47d8-8340-194286bb245b') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '35427fe6-deb6-4e96-a4e8-500e5e1a46db') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '35427fe6-deb6-4e96-a4e8-500e5e1a46db') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '35427fe6-deb6-4e96-a4e8-500e5e1a46db') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '35427fe6-deb6-4e96-a4e8-500e5e1a46db') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c599aec3-b047-4878-a643-b5b29b65bec1') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c599aec3-b047-4878-a643-b5b29b65bec1') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c599aec3-b047-4878-a643-b5b29b65bec1') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'c599aec3-b047-4878-a643-b5b29b65bec1') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Pivot Slicer</strong> es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización: Como puede verse, los campos -aun un tanto desordenados- hacen referencia a dos tipos de objetos: <em>items</em> e <em>items enlazados</em> ("<em>linked items</em>"). El reparto es el siguiente: Campos relativos a items: <ul><li>Item (required)</li> <li>Item Type</li> <li>Item Attributes (up to 10)</li> <li>Item Filter Key</li> </ul>Campos relativos a linked items: <ul><li>Item Linker (object format)</li> <li>Linked Item (edge format)</li> <li>Linked Item Type (edge format)</li> <li>Link Weight (edge format)</li> <li>Linked Item Filter Key (edge format)</li> </ul>De hecho puede verse que los linked items parecen existir en dos formas: en formato "objeto" y en formato "edge". Items Comencemos por lo básico, que es llevar algún campo de nuestro modelo de datos al campo <em>Item (required)</em> de la visualización (campo que, tal y como su nombre indica, es obligatorio). Y solo es posible llevar un único campo. Vamos a llevar uno que contiene el nombre de nuestros clientes, <em>Full Name</em>. Y para ver cómo funciona el slicer, llevamos al informe también una tabla con el listado de clientes, otra con los valores del campo <em>Gender</em> (<em>Female</em> y <em>Male</em>) y una tarjeta de varias filas con varias medidas (ventas totales, unidades vendidas y margen total). De este modo veremos cómo se filtran las tablas al hacer una selección en el slicer: El slicer, en este momento, simplemente muestra los valores del campo que hemos llevado a <em>Item (required)</em>: los nombres de los clientes. Se muestra el nombre por defecto que recibe la lista ("<em>Item</em>") y, junto a este nombre, el número de elementos que la componen (999 en nuestro ejemplo). Si hacemos clic en un nombre de la lista, se selecciona, filtrando también el resto de visualizaciones del informe. En la siguiente imagen se muestra nuestro informe tras haber hecho clic en el nombre de "Adriana Sánchez Morata": Vemos en la imagen anteior que ha aparecido un bloque ("<em>SELECTED</em>") en la parte superior de la lista con el nombre del elemento seleccionado. Un clic en otro nombre de la lista sustituiría el seleccionado por el nuevo (solo se puede seleccionar uno), y un clic en el nombre incluido en el bloque <em>SELECTED </em>lo deseleccionaría, volviendo al estado inicial. Item Type Podemos desagregar nuestros datos utilizando el campo <em>Item Type</em> de la visualización. Por ejemplo, si llevamos el campo <em>Gender</em> que contiene el sexo del cliente a este campo, la visualización muestra el siguiente aspecto: De esta forma puede resultar más sencillo buscar el elemento que queremos seleccionar al tenerlos separados según el criterio escogido. Pero el comportamiento del slicer no ha cambiado: un clic selecciona al elemento, filtrando el resto de visualizaciones, un clic en otro elemento sustituye al que se encuentre en <em>SELECTED</em> por el nuevo, y un clic en el elemento que se encuentre en <em>SELECTED</em> lo deselecciona. Vemos que en nuestra tabla de clientes hay 488 hombres y 511 mujeres. Ahora, cuando seleccionamos un elemento se muestra el "tipo" al que pertenece: En la esquina superior derecha de la imagen anterior vemos el símbolo "<". Nos sirve para recorrer los estados anteriores por los que hemos pasado. Por ejemplo, seleccionamos a "Adrián Gil Ocaña" y, a continuación, a "Adriana Montero Nieto": Ahora hacemos clic en el icono mencionado. La visualización mostrará el estado anterior (en el que había seleccionado a "Adrián Gil Ocaña") y el icono cambia para permitirnos seguir retrocediendo o volver al último estado: Item Attributes Otro de los campos que se incluyen en la visualización es el de <em>Item Attributes (up to 10)</em>. A este campo deberemos arrastrar campos de nuestro modelo de datos (no se permiten medidas) que permitan aplicar un rango a los items (a los clientes en nuestro ejemplo). Por ejemplo, supongamos que el número de unidades adquiridas por cada cliente y el total de ventas (de cada cliente) nos resultan criterios adecuados para la aplicación de estos rangos. Arrastramos entonces tanto el campo <em>Amount</em> (cifra de ventas) como el campo <em>Units</em> al campo mencionado de la visualización (tal y como indica el nombre del campo, el máximo número de campos de nuestro modelo de datos que podemos arrastrar hasta aquí es de 10). Ahora el icono que nos permitía recorrer el histórico de selecciones se desplaza al centro de la visualización y en su lugar aparece una etiqueta: <em>ITEMS</em>. Un clic en esta etiqueta cambia la visualización para mostrar la pantalla de <em>ATTRIBUTES</em> y nos muestra la siguiente imagen: Lo que estamos viendo son tres listados: "<em>combined sum</em>" (en la parte superior), "<em>Amount</em>" (en el centro) y "<em>Units</em>" (en la parte inferior). También vemos que el número de "items" de cada lista es de 984 (señal de que hay otras 15 personas que, a pesar de figurar en la tabla de clientes, no han comprado nunca nada). La lista inferior, <em>Units</em>, muestra los "items" (clientes) ordenados según cierta cifra (6, 6, 6, 5...) de mayor a menor. Estos números no son el número total de unidades compradas por cada cliente, <strong>sino el valor máximo que cada cliente ha adquirido en una única compra</strong>. Es decir, si un cliente a realizado 3 compras y el número de unidades ha sido, por ejemplo, 4, 1, y 2, este cliente aparecería en el listado anterior con un 4. Si quisiéramos que la cifra asociada a cada cliente fuese el número total de unidades adquiridas, habría que agregar la información previamente. La lista central, <em>Amount</em>, hace lo propio, mostrando los clientes ordenados de mayor a menor según otra cifra que, nuevamente, no representa la suma de las ventas realizadas a cada cliente, sino la mayor cifra de las ventas realizadas a cada uno. Otro ejemplo: si un cliente ha realizado tres compras de 3.000, 2.000 y 1.000 euros, en el listado aparecería con 3.000€. La decisión de mostrar el valor máximo en lugar de la suma o el promedio (y el hecho de no poder cambiarse esta función de agregación) compromete notablemente la utilidad de la visualización. Sería mucho más versátil si pudiésemos escoger la función a aplicar. En todo caso, lo interesante es lo que tenemos en la lista superior: tal y como se ve en la imagen anterior, las listas inferiores reciben un peso (<em>weight</em>) que, por defecto, toma el valor 1. Además, cada item de las listas recibe un coeficiente relativo al valor máximo de su lista. Por ejemplo, en la imagen anterior vemos que, en la lista de "<em>Amount</em>", el valor máximo es de 3.675, valor que recibe el coeficiente 1.00 (que se muestra a la derecha de dicha cifra). El siguiente valor en la lista es 3.173, que recibe el coeficiente 0.85 (pues esta cifra es aproximadamente el 85% del valor máximo), y así con todos los elementos de la lista. Los elementos de las demás listas (<em>Units</em> solamente en nuestro ejemplo) también reciben un coeficiente semejante que se calculan con respecto al máximo de la lista a la que pertenezca. Pues bien, la lista superior muestra los clientes según la suma de los coeficientes indicados (para cada cliente) ponderados por los pesos de cada lista. Es decir, nos muestra los "mejores" items según todos nuestros criterios, ponderados según los pesos que hemos dado a cada uno. Podemos modificar el peso que damos a cada lista haciendo clic en los símbolos + y - que se muestran a la derecha de la etiqueta weight. Por defecto, cada clic añade o resta 0.25, pero podemos modificar este incremento en <em>Formato > Configuration > Attribute Weight Delta</em>. Las listas pueden tener asignado un peso negativo si es que un valor mayor supone una disminución en el criterio de "calidad" del que estemos hablando. Por ejemplo, si estamos valorando proveedores, el descuento que nos hagan puede ser considerado positivo mientras que el tiempo de entrega (el tiempo que tarden en entregarnos la mercancía) puede ser negativo (un mayor tiempo puede suponer entregar un producto al cliente final más tarde, por ejemplo). Si hacemos clic en la etiqueta <em>ATTRIBUTES</em> que ahora se muestra en la esquina superior derecha volvemos al listado original (desglosado según el criterio que hayamos llevado a <em>Item Type</em>). Tanto en esta sección de "<em>Items</em>" como en la "<em>Attributes</em>" vemos que a la derecha de los nombres se muestra un icono con aspecto de marcador de libro. Un clic en este icono para un item concreto lo resalta en todas las listas y lo mueve encima de la visualización (sin seleccionarlo). En la siguiente imagen se ha hecho clic en los "marcadores" que acompañan a tres clientes: La utilidad de esta herramienta puede ser la de ver en qué posiciones queda en las diferentes listas un elemento concreto, por ejemplo. Podemos eliminar uno de estos items de dicha zona haciendo clic en el aspa que lo acompaña, o podemos seleccionarlo haciendo clic en el nombre (en cuyo caso pasaría a la zona de <em>SELECTED</em> y filtraría el resto de visualizaciones). Un clic en el aspa que acompaña a la etiqueta <em>All</em> eliminaría todos los nombres situados en la zona superior de la visualización. Linked Items Y comentamos al comienzo que la visualización hace referencia a "<em>items</em>" (ya vistos) y a "<em>linked items</em>" (elementos enlazados). Veamos cuál es la idea que hay detrás de esto: si los items son, por ejemplo, clientes, los elementos enlazados pueden ser los productos que adquieren, o las categorías de éstos, o los países en los que se realizan las compras, por poner algunos ejemplos. Y una vez establecidos ambos elementos, <em>items</em> y <em>linked items</em>, podemos estar interesados en ordenar unos en función de los otros: Suponiendo que los <em>items</em> sean clientes y los <em>linked items</em> sean productos ¿cuáles son los clientes que más productos adquieren? o ¿qué productos son los más adquiridos? o ¿qué productos son los más adquiridos si damos a cada uno un peso equivalente a su precio? Este es el tipo de información a la que vamos a poder acceder. Ya hemos visto que los elementos enlazados parecen encontrarse en dos formas: formato de "objeto" (campo <em>Item Linker (object format)</em>) y formato de "edge" (todos los demás campos que hacen referencia a elementos enlazados). Y digo que "parecen encontrarse" porque todo apunta a que tenemos que escoger entre un formato u otro, ya que si hacemos uso de campos de los dos tipos, la visualización deja de ofrecer información sobre elementos enlazados. Así que comencemos por lo que parece ser la opción más simple, el formato de objeto. Item Linker (object format) Al campo de la visualización <em>Item Linker (object format)</em> podemos llevar un campo que provoca que se muestren otras dos secciones en la visualización (accesible haciendo clics en la etiqueta superior derecha de la misma), de nombre <em>LINKS</em> y <em>JOINT LINKS</em> respectivamente, ambas con contenidos aparentemente idénticos que muestran el recuento de los elementos del campo que hemos llevado que estén asociados a cada item. Por ejemplo, si llevamos el campo <em>Product Name</em> de nuestra tabla de productos y nos movemos a la nueva sección <em>LINKS</em> (haciendo clic en la ya mencionada etiqueta de la esquina superior derecha) la visualización muestra lo siguiente: Lo que estamos viendo es el número de productos adquiridos por cada cliente (número de productos, no número de unidades: si un cliente ha realizado una compra de 3 unidades del producto A y 5 del producto B, aparecería con un 2 -dos productos adquiridos-). Linked Item (edge format) Otro campo de la visualización, <em>Linked Item (edge format)</em> aparentemente tiene el mismo comportamiento que éste último mencionado salvo que hagamos uso del resto de campos de la visualización que se refieren a este tipo de elementos enlazados. Si hacemos uso de este campo llevando el campo de <em>Product Name</em> (para lo cual deberemos eliminar el posible campo que haya en <em>Item Linker (object format)</em>), la etiqueta que se muestra en la esquina superior derecha de la visualización es "<em>OUT LINKS</em>". También se crea en este caso otra sección de nombre "<em>JOINT OUT LINKS</em>" (con los mismos contenidos que <em>OUT LINKS</em>) y una tercera de nombre "IN LINKS" que muestra los elementos del nuevo campo según el número de veces que aparecen relacionados con nuestros items originales (es decir, el número de clientes que los han adquirido): En la imagen anterior vemos que los productos que más clientes han adquirido son el "Product 008-BL" y el "Product 012-GS", adquiridos por 31 clientes. Nuevamente, no estamos hablando de los productos más veces vendidos, ni con más unidades vendidas, sino de los productos que más clientes han comprado. Por ejemplo, si el producto A ha sido adquirido por un único cliente en una compra que involucra 1.000 unidades, y el producto B ha sido adquirido por dos clientes involucrando una única unidad en cada una de las compras, en la lista mostrada en la imagen aparecerían con los valores 2 y 1 respectivamente. Linked Item Type (edge format) Podemos desagregar estos elementos enlazados si arrastramos una dimensión de dichos elementos al campo de la visualización <em>Linked Item Type (edge format)</em>. Por ejemplo, si arrastramos el campo <em>Category</em> (categoría de cada producto) a este campo, la visualización muestra, en la sección <em>IN LINKS</em>, lo siguiente: Es decir, vemos los productos vendidos a mayor número de clientes clasificados por categoría. Pero podemos estar interesados no en saber qué productos fueron los vendidos a mayor número de clientes, sino de acuerdo al precio de cada producto, por ejemplo. Veamos qué obtenemos si hacemos uso del campo <em>Link Weight (edge format)</em> arrastrando el campo <em>Price</em> (precio de cada producto) al campo en cuestión: Ahora, el criterio de clasificación es el precio de cada producto multiplicado por el número de clientes que lo han adquirido. Filters Hay todavía dos campos que no hemos mencionado: <em>Item Filter Key</em> y <em>Linked Item Filter Key (edge format)</em>, pero su utilidad es todo un misterio, pues no parecen influir en la visualización (al menos yo no he averiguado). Resumen En resumen, buena y original idea, compleja implementación, nula documentación y algunas decisiones mejorables hacen de esta visualización algo de lo que resulta muy difícil sacar provecho. Más parece un producto en fase alfa (en fase de desarrollo) que un desarrollo terminado. Dudo que lo vaya a utilizar mientras no mejore su usabilidad. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '645b8c30-1158-40e7-9945-e0140a2c48be') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '645b8c30-1158-40e7-9945-e0140a2c48be') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '645b8c30-1158-40e7-9945-e0140a2c48be') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '645b8c30-1158-40e7-9945-e0140a2c48be') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '33a1cadb-19ae-43f7-b8e9-b440ed9bdb4a') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '33a1cadb-19ae-43f7-b8e9-b440ed9bdb4a') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '33a1cadb-19ae-43f7-b8e9-b440ed9bdb4a') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '33a1cadb-19ae-43f7-b8e9-b440ed9bdb4a') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'd6c5e3db-3d74-4edc-a537-bdca340993ca') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'd6c5e3db-3d74-4edc-a537-bdca340993ca') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'd6c5e3db-3d74-4edc-a537-bdca340993ca') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'd6c5e3db-3d74-4edc-a537-bdca340993ca') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('El <strong>Text Filter</strong> ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos. En el siguiente ejemplo se ha asociado al <em>Text Filter</em> el campo <em>Full Name</em> que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre: En cuanto escribimos algún texto en el filtro y presionamos <em>Intro</em>, la tabla inferior se filtra para mostrar solo aquellos valores de <em>Full Name</em> que contienen el texto en cuestión: La configuración de esta visualización es sumamente simple: ...apenas, el campo con el que va asociada. A la derecha del recuadro de búsqueda se muestra in pequeño icono (representando una goma de borrar) que permite reinicializar la búsqueda. Y no se ofrecen herramientas adicionales de configuración, es decir, no podemos controlar el tamaño del texto de la visualización, ni colores. Práctica visualización, aunque se agradecería alguna opción adicional de personalización.', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0fc8e6e2-9db8-4474-8115-b7eca53a400b') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0fc8e6e2-9db8-4474-8115-b7eca53a400b') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0fc8e6e2-9db8-4474-8115-b7eca53a400b') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '0fc8e6e2-9db8-4474-8115-b7eca53a400b') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9f58dcfb-443d-4c9f-8d26-e952871b7f42') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9f58dcfb-443d-4c9f-8d26-e952871b7f42') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9f58dcfb-443d-4c9f-8d26-e952871b7f42') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '9f58dcfb-443d-4c9f-8d26-e952871b7f42') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '96de1e47-dcd9-45dd-8678-4085c71f60a3') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '96de1e47-dcd9-45dd-8678-4085c71f60a3') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '96de1e47-dcd9-45dd-8678-4085c71f60a3') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '96de1e47-dcd9-45dd-8678-4085c71f60a3') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '218506fe-9ae4-4c55-a251-ef69bbe23e33') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '218506fe-9ae4-4c55-a251-ef69bbe23e33') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '218506fe-9ae4-4c55-a251-ef69bbe23e33') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '218506fe-9ae4-4c55-a251-ef69bbe23e33') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '10150c97-3208-490e-a2bb-0b6d9dfab601') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '10150c97-3208-490e-a2bb-0b6d9dfab601') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '10150c97-3208-490e-a2bb-0b6d9dfab601') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '10150c97-3208-490e-a2bb-0b6d9dfab601') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '95545e62-e91c-4485-912a-c4ff84a4c396') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '95545e62-e91c-4485-912a-c4ff84a4c396') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '95545e62-e91c-4485-912a-c4ff84a4c396') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '95545e62-e91c-4485-912a-c4ff84a4c396') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'd1f47400-fbae-427b-b1bf-f757f0ddd433') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'd1f47400-fbae-427b-b1bf-f757f0ddd433') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'd1f47400-fbae-427b-b1bf-f757f0ddd433') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', 'd1f47400-fbae-427b-b1bf-f757f0ddd433') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '009423c5-209c-4150-b5ff-ef3d4d1d8379') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '009423c5-209c-4150-b5ff-ef3d4d1d8379') (Line: 95) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addMetaData('entity_type', 'file') (Line: 115) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '009423c5-209c-4150-b5ff-ef3d4d1d8379') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\Core\Database\Query\Select->addTag('entity_query') (Line: 147) Drupal\Core\Entity\Query\Sql\Query->prepare() (Line: 80) Drupal\Core\Entity\Query\Sql\Query->execute() (Line: 640) Drupal\Core\Entity\EntityStorageBase->loadByProperties(Array) (Line: 63) Drupal\Core\Entity\EntityRepository->loadEntityByUuid('file', '009423c5-209c-4150-b5ff-ef3d4d1d8379') (Line: 124) Drupal\editor\Plugin\Filter\EditorFileReference->process('La visualización <strong>Card Browser</strong> de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa: Obsérvese la configuración de la visualización: Como puede apreciarse, simplemente se ha llevado el título que deseamos dar a cada tarjeta (campo <em>Title</em>, el nombre del cliente en nuestro ejemplo), la imagen asociada a cada cliente (<em>Title Image (URL)</em>) y un identificador (campo <em>Document Id</em>). En realidad la imagen ni siquiera es necesaria para visualizar las tarjetas. Al campo <em>Preview</em> podemos llevar un campo (solo uno) que se mostrará en la parte inferior de las imágenes (al ocupar este campo la imagen ve reducida automáticamente su altura). En la imagen siguiente se ha llevado el campo <em>Description</em> de nuestra tabla de clientes a este campo <em>Preview</em>, campo que, tal y como indica su nombre, contiene una descripción del cliente: También disponemos de un campo <em>Subtitle Fields</em> al que podemos llevar campos (uno o varios) que serán elegantemente mostrados debajo del título (campos <em>Gender</em> y <em>Age</em> indicando el sexo y la edad en el ejemplo mostrado en la siguiente imagen): Al campo <em>MetaData Fields</em> de la visualización podemos llevar tantos campos como deseemos: Así que introducimos el primer campo, se muestra en la parte superior de la visualización un icono: Un clic en este icono (en los dos cuadrados de la derecha) provoca que todas las tarjetas se giren, mostrando el reverso: En este reverso se encuentran los campos que acabamos de añadir a <em>MetaData Fields</em>. Un pequeño error en la visualización es que el ancho dedicado a las etiquetas de estos campos es fijo, y éstas no siempre se leen correctamente (obsérvese, por ejemplo, la etiqueta "<em>Household income</em>" en las tarjetas de la imagen anterior). En el reverso también se muestra una imagen que, por defecto, es la misma que la que se muestra en anverso, aunque es personalizable (para esto es para lo que existe el campo <em>Badge (Image URL)</em>). Como se observa en la imagen anterior, también se muestra en la parte superior del reverso el contenido de los campos <em>Title</em> y <em>Subtitle Fields</em>. Si volvemos al anverso haciendo clic nuevamente en el icono superior de la visualización (en los dos cuadrados de la izquierda) y hacemos clic en cualquier parte de una tarjeta se abrirá una ventana inferior, mostrando la misma información que hemos visto en el reverso aunque, en este caso, solo para la tarjeta seleccionada: Unos controles situados a derecha y a izquierda de esta ventana nos permite ir moviéndonos cómodamente por cada una de las tarjetas. El contenido del campo <em>Content</em>, que todavía no hemos mencionado, se mostrará en la parte superior de esta ventana (no en el reverso de las tarjetas). Al respecto de las opciones de formato, podemos ajustar el ancho y el alto de las tarjetas (lo que determina el número de columnas en función del ancho que demos a la visualización), activar o no el giro de éstas, la sombra que se ve alrededor de las tarjetas... No hay demasiadas opciones, pero tampoco resultan muy necesarias. Muy buena visualización, no aplicable en cualquier escenario, pero sumamente útil cuando se está buscando una herramienta para mostrar información de elementos de forma ordenada y elegante. ', 'es') (Line: 118) Drupal\filter\Element\ProcessedText::preRenderText(Array) call_user_func_array(Array, Array) (Line: 101) Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #pre_render callbacks must be methods of a class that implements \Drupal\Core\Security\TrustedCallbackInterface or be an anonymous function. The callback was %s. See https://www.drupal.org/node/2966725', 'exception', 'Drupal\Core\Render\Element\RenderCallbackInterface') (Line: 788) Drupal\Core\Render\Renderer->doCallback('#pre_render', Array, Array) (Line: 374) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 88) __TwigTemplate_a7d6005c89ae729617b9a0c2bccb1776->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 46) __TwigTemplate_804f7948456cfe20e11a34c43439c7c2->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array, Array) (Line: 43) __TwigTemplate_bd990293b89f3b78c69fe0ee2f7828b5->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/field/field--text-with-summary.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('field', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_94047fbdba6937b76a4479dfa1763452->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/node.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('node', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 74) __TwigTemplate_43dffa6ad507293d1ceeb24e05ce942c->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/custom/yg_aesthetic/templates/views-view-unformatted.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view_unformatted', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array) (Line: 479) Drupal\Core\Template\TwigExtension->escapeFilter(Object, Array, 'html', NULL, 1) (Line: 110) __TwigTemplate_349d2f5aada73507d566397721f27ea4->doDisplay(Array, Array) (Line: 405) Twig\Template->displayWithErrorHandling(Array, Array) (Line: 378) Twig\Template->display(Array) (Line: 390) Twig\Template->render(Array) (Line: 55) twig_render_template('themes/contrib/classy/templates/views/views-view.html.twig', Array) (Line: 384) Drupal\Core\Theme\ThemeManager->render('views_view', Array) (Line: 433) Drupal\Core\Render\Renderer->doRender(Array) (Line: 446) Drupal\Core\Render\Renderer->doRender(Array, ) (Line: 204) Drupal\Core\Render\Renderer->render(Array, ) (Line: 242) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 580) Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 235) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
include('/var/www/vhosts/interactivechaos.ovh/httpdocs/modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php') (Line: 578) Composer\Autoload\ClassLoader::Composer\Autoload\{closure}('/var/www/vhosts/interactivechaos.ovh/httpdocs/modules/contrib/google_analytics/src/Component/Render/GoogleAnalyticsJavaScriptSnippet.php') (Line: 432) Composer\Autoload\ClassLoader->loadClass('Drupal\google_analytics\Component\Render\GoogleAnalyticsJavaScriptSnippet') (Line: 372) google_analytics_page_attachments(Array) (Line: 313) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}(Object, 'google_analytics') (Line: 405) Drupal\Core\Extension\ModuleHandler->invokeAllWith('page_attachments', Object) (Line: 310) Drupal\Core\Render\MainContent\HtmlRenderer->invokePageAttachmentHooks(Array) (Line: 288) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
Drupal\user\Entity\Role::postLoad(Object, Array) (Line: 423) Drupal\Core\Entity\EntityStorageBase->postLoad(Array) (Line: 353) Drupal\Core\Entity\EntityStorageBase->loadMultiple() (Line: 126) eu_cookie_compliance_page_attachments(Array) (Line: 313) Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}(Object, 'eu_cookie_compliance') (Line: 405) Drupal\Core\Extension\ModuleHandler->invokeAllWith('page_attachments', Object) (Line: 310) Drupal\Core\Render\MainContent\HtmlRenderer->invokePageAttachmentHooks(Array) (Line: 288) Drupal\Core\Render\MainContent\HtmlRenderer->prepare(Array, Object, Object) (Line: 132) Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse(Array, Object, Object) (Line: 90) Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray(Object, 'kernel.view', Object) call_user_func(Array, Object, 'kernel.view', Object) (Line: 142) Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object, 'kernel.view') (Line: 174) Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 81) Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 58) Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 191) Drupal\page_cache\StackMiddleware\PageCache->fetch(Object, 1, 1) (Line: 128) Drupal\page_cache\StackMiddleware\PageCache->lookup(Object, 1, 1) (Line: 82) Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48) Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51) Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 23) Stack\StackedHttpKernel->handle(Object, 1, 1) (Line: 713) Drupal\Core\DrupalKernel->handle(Object) (Line: 19)
El scatter chart o gráfico de dispersión es una visualización integrada en Power BI. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos:
Esta visualización de Microsoft, Sunburst, nos permite visualizar una métrica asociada a datos jerárquicos, mostrándose esta información en círculos concéntricos que representan cada uno de los niveles de la jerarquía. La configuración de esta visualización es muy sencilla:
Esta visualización permite mostrar una red de elementos relacionados, ofreciendo una buena cantidad de herramientas para configurar los enlaces que la forman. El panel de configuración es el siguiente:
Cluster Map muestra información -supuestamente agrupada en clusters según algún criterio- en forma de nube de imágenes. Su configuración es la mostrada en la siguiente imagen:
La visualización Multi KPI de Microsoft permite presentar un KPI (indicador clave de rendimiento) junto a información adicional que puede resultar de interés.
Una vez instanciada en nuestro lienzo, podemos ver qué campos definen su configuración:
Pulse Chart es una interesante visualización que permite mostrar un gráfico de líneas anotado con eventos, muy apropiado para narrar una historia basándose en la evolución de una variable cuantitativa.
Veamos, antes de nada, el aspecto de los datos con los que vamos a alimentar esta visualización:
El Scatter Chart (o gráfico de dispersión en español) es una versátil visualización integrada en Power BI que, como indica su nombre, permite crear gráficos de dispersión. Su objetivo es permitirnos mostrar dos conjuntos de valores o pares de datos mostrando la relación entre ellos.
El Pivot Slicer es una (probablemente) potente visualización cuya utilidad queda un tanto limitada por la falta de documentación y por algunas decisiones tomadas en su desarrollo que veremos a continuación. Se muestra a continuación el panel de campos de la visualización:
El Text Filter ofrece una herramienta de búsqueda que puede ser utilizada para filtrar otras visualizaciones de nuestros informes, funcionalidad básica que, sin embargo, no está disponible más que usando los filtros estándar de Power BI, menos cómodos.
En el siguiente ejemplo se ha asociado al Text Filter el campo Full Name que contiene el nombre completo de nuestros clientes, y se muestra debajo una tabla con datos de éstos, incluyendo su nombre:
La visualización Card Browser de Microsoft permite visualizar de forma elegante información (no solo textual) con una o dos imágenes asociadas. En la siguiente captura de pantalla, por ejemplo, se muestra información sobre los clientes de la empresa:
Obsérvese la configuración de la visualización:
Excepto donde se indique otra cosa, los contenidos de este sitio web se ofrecen bajo una licencia Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional