Пример #1
0
 public function register()
 {
     parent::register();
     $app = App::i();
     $metadata = ['MapasCulturais\\Entities\\Event' => ['num_sniic' => ['label' => 'Nº SNIIC:', 'private' => false]], 'MapasCulturais\\Entities\\Project' => ['num_sniic' => ['label' => 'Nº SNIIC:', 'private' => false]], 'MapasCulturais\\Entities\\Space' => ['num_sniic' => ['label' => 'Nº SNIIC:', 'private' => false], 'cnpj' => ['label' => 'CNPJ', 'private' => false, 'validations' => ['v::cnpj()' => 'O CNPJ informado é inválido']], 'esfera' => ['label' => 'Esfera', 'type' => 'select', 'options' => ['Pública', 'Privada']], 'esfera_tipo' => ['label' => 'Tipo de esfera', 'type' => 'select', 'options' => ['Federal', 'Estadual', 'Distrital', 'Municipal', 'Associação', 'Empresa', 'Fundação', 'Particular', 'Religiosa', 'Mista', 'Entidade Sindical', 'Outra']], 'certificado' => ['label' => 'Títulos e Certificados', 'type' => 'select', 'options' => ['ONG' => 'Organização não Governamental (ONG)', 'OSCIP' => 'Organização da Sociedade Civil de Interesse Público (OSCIP)', 'OS' => 'Organização Social (OS)', 'CEBAS' => 'Certificado de Entidade Beneficente de Assistência Social (CEBAS)', 'UPF' => 'Certificado de Utilidade Pública Federal (UPF)', 'UPE' => 'Certificado de Utilidade Pública Estadual (UPE)', 'UPM' => 'Certificado de Utilidade Pública Municipal (UPM)']]], 'MapasCulturais\\Entities\\Agent' => ['num_sniic' => ['label' => 'Nº SNIIC:', 'private' => false], 'tipologia_nivel1' => ['label' => 'Tipologia Nível 1', 'private' => false], 'tipologia_nivel2' => ['label' => 'Tipologia Nível 2', 'private' => false], 'tipologia_nivel3' => ['label' => 'Tipologia Nível 3', 'private' => false, 'validations' => ['required' => 'A tipologia deve ser informada.']]]];
     $prefix = $this->getMetadataPrefix();
     foreach ($this->_getAgentMetadata() as $key => $cfg) {
         $key = $prefix . $key;
         $metadata['MapasCulturais\\Entities\\Agent'][$key] = $cfg;
     }
     foreach ($this->_getSpaceMetadata() as $key => $cfg) {
         $key = $prefix . $key;
         $metadata['MapasCulturais\\Entities\\Space'][$key] = $cfg;
     }
     foreach ($this->_getEventMetadata() as $key => $cfg) {
         $key = $prefix . $key;
         $metadata['MapasCulturais\\Entities\\Event'][$key] = $cfg;
     }
     foreach ($this->_getProjectMetadata() as $key => $cfg) {
         $key = $prefix . $key;
         $metadata['MapasCulturais\\Entities\\Project'][$key] = $cfg;
     }
     foreach ($metadata as $entity_class => $metas) {
         foreach ($metas as $key => $cfg) {
             $def = new \MapasCulturais\Definitions\Metadata($key, $cfg);
             $app->registerMetadata($def, $entity_class);
         }
     }
 }
Пример #2
0
 function _init()
 {
     parent::_init();
     $app = App::i();
     $app->hook('view.render(<<*>>):before', function () use($app) {
         $this->_publishAssets();
     });
 }
Пример #3
0
 function _init()
 {
     parent::_init();
     $app = App::i();
     $app->hook('view.render(<<*>>):before', function () use($app) {
         $this->jsObject['assets']['logo-prefeitura'] = $this->asset('img/logo-prefeitura.png', false);
     });
 }
Пример #4
0
 protected function _init()
 {
     parent::_init();
     $app = App::i();
     $app->hook("controller(site).render(page)", function () use($app) {
         $page = $this->data[0];
         $app->view->bodyClasses[] = "page-" . $page;
     });
 }
Пример #5
0
 public function addDocumentMetas()
 {
     parent::addDocumentMetas();
     $app = App::i();
     foreach ($this->documentMeta as $key => $meta) {
         if (isset($meta['property']) && ($meta['property'] === 'og:image' || $meta['property'] === 'og:image:url')) {
             $this->documentMeta[$key] = array('property' => $meta['property'], 'content' => $app->view->asset('img/share-rs.png', false));
         }
     }
 }
Пример #6
0
 function _init()
 {
     parent::_init();
     $app = App::i();
     $app->hook('API.<<*>>(space).query', function (&$data, &$select_properties, &$dql_joins, &$dql_where) {
         $dql_where .= ' AND e._type = 132';
     });
     $app->hook('view.render(<<*>>):before', function () use($app) {
         $this->_publishAssets();
     });
 }
Пример #7
0
 public function addDocumentMetas()
 {
     parent::addDocumentMetas();
     if (in_array($this->controller->action, ['single', 'edit'])) {
         return;
     }
     $app = App::i();
     foreach ($this->documentMeta as $key => $meta) {
         if (isset($meta['property']) && ($meta['property'] === 'og:image' || $meta['property'] === 'og:image:url')) {
             $this->documentMeta[$key] = array('property' => $meta['property'], 'content' => $app->view->asset('img/share-jp.png', false));
         }
     }
 }
 public function register()
 {
     parent::register();
     $app = App::i();
     $app->registerController('rede', 'CulturaViva\\Controllers\\Rede');
     $app->registerController('cadastro', 'CulturaViva\\Controllers\\Cadastro');
     $app->registerController('admin', 'CulturaViva\\Controllers\\Admin');
     //        $app->registerFileGroup('agent', new \MapasCulturais\Definitions\FileGroup('portifolio', ['^application\/pdf$'], 'O portifólio deve ser um arquivo pdf.', true));
     $app->registerFileGroup('agent', new \MapasCulturais\Definitions\FileGroup('portifolio', ['.*'], 'O portifólio deve ser um arquivo pdf.', true));
     $app->registerFileGroup('agent', new \MapasCulturais\Definitions\FileGroup('carta1', ['.*'], 'a carta deve ser um arquivo pdf.', true));
     $app->registerFileGroup('agent', new \MapasCulturais\Definitions\FileGroup('carta2', ['.*'], 'a carta deve ser um arquivo pdf.', true));
     $app->registerFileGroup('agent', new \MapasCulturais\Definitions\FileGroup('logoponto', ['.*'], 'O logotipo deve ser uma imagem.', true));
     $metadata = ['MapasCulturais\\Entities\\User' => ['redeCulturaViva' => ['private' => true, 'label' => 'Id do Agente, Agente Coletivo e Registro da inscrição']], 'MapasCulturais\\Entities\\Space' => ['En_Bairro' => ['label' => 'Bairro', 'private' => true], 'En_Num' => ['label' => 'Número', 'private' => true], 'En_Nome_Logradouro' => ['label' => 'Logradouro', 'private' => true], 'En_Complemento' => ['label' => 'Complemento', 'private' => true]], 'MapasCulturais\\Entities\\Agent' => ['rcv_sede_spaceId' => ['label' => 'Id do espaço linkado ao ponto de cultura', 'private' => true], 'rcv_tipo' => ['label' => 'Tipo de agente da Rede Cultura Viva', 'private' => false], 'rcv_Ds_Edital' => ['label' => 'Ds_Edital', 'private' => true], 'rcv_Ds_Tipo_Ponto' => ['label' => 'Ds_Edital', 'private' => true], 'rcv_Id_Tipo_Esfera' => ['label' => 'Id_Tipo_Esfera', 'private' => true], 'rcv_Cod_pronac' => ['label' => 'Cod_pronac', 'private' => true], 'rcv_Cod_salic' => ['label' => 'Cod_salic', 'private' => true], 'rcv_Cod_scdc' => ['label' => 'Cod_scdc', 'private' => true], 'emailPrivado2' => ['label' => 'Email privado 2', 'private' => true], 'emailPrivado3' => ['label' => 'Email privado 3', 'private' => true], 'rg' => ['label' => 'RG', 'private' => true], 'rg_orgao' => ['label' => 'Órgão Expedidor', 'private' => true], 'cpf' => ['label' => 'CPF', 'private' => true], 'telefone1' => ['label' => 'Telefone', 'private' => true, 'validations' => ['v::regex("#^\\d{2}[ ]?\\d{4,5}\\d{4}$#")' => 'Por favor, informe o telefone público no formato xx xxxx xxxx.']], 'telefone1_operadora' => ['label' => 'Operadora do Telefone 1', 'private' => true], 'relacaoPonto' => ['label' => 'Relação com o Ponto de Cultura', 'private' => true, 'type' => 'select', 'options' => array('responsavel' => 'Sou o responsável pelo Ponto/Pontão de Cultura', 'funcionario' => 'Trabalho no Ponto/Pontão de Cultura', 'parceiro' => 'Sou parceiro do Ponto/Pontão e estou ajudando a cadastrar')], 'semCNPJ' => ['label' => 'CNPJ', 'private' => true, 'type' => 'boolean'], 'tipoPontoCulturaDesejado' => ['label' => 'Tipo de Ponto de Cultura', 'private' => true, 'type' => 'select', 'options' => array('ponto' => 'Ponto', 'pontao' => 'Pontão')], 'tipoOrganizacao' => ['label' => 'Tipo de Organização', 'private' => true, 'type' => 'select', 'options' => array('coletivo' => 'Coletivo Cultural', 'entidade' => 'Entidade Cultural')], 'cnpj' => ['label' => 'CNPJ', 'private' => true], 'representanteLegal' => ['label' => 'Representante Legal', 'private' => true], 'tipoCertificacao' => ['label' => 'Tipo de Certificação', 'private' => true, 'options' => array('ponto_coletivo' => 'Ponto de Cultura - Grupo ou Coletivo', 'ponto_entidade' => 'Ponto de Cultura - Entidade', 'pontao_entidade' => 'Pontão de Cultura - Entidade')], 'foiFomentado' => ['label' => 'Você já foi fomentado pelo MinC', 'private' => true], 'tipoFomento' => ['label' => 'Você já foi fomentado pelo MinC', 'private' => true, 'type' => 'select', 'options' => array('convenio' => 'Direto com o MinC', 'tcc' => 'Estatual', 'bolsa' => 'Municipal', 'premio' => 'Intermunicipal', 'rouanet' => 'Intermunicipal', 'outros' => 'Outros')], 'tipoFomentoOutros' => ['label' => 'Você já foi fomentado pelo MinC', 'private' => true], 'tipoReconhecimento' => ['label' => 'Tipo de Reconhecimento', 'private' => true, 'type' => 'select', 'options' => array('minc' => 'Direto com o MinC', 'estadual' => 'Estatual', 'municipal' => 'Municipal', 'intermunicpal' => 'Intermunicipal')], 'edital_num' => ['label' => 'Número do Edital de Seleção', 'private' => true], 'edital_ano' => ['label' => 'Ano do Edital de Seleção', 'private' => true], 'edital_projeto_nome' => ['label' => 'Nome do Projeto', 'private' => true], 'edital_localRealizacao' => ['label' => 'Local de Realização', 'private' => true], 'edital_projeto_etapa' => ['label' => 'Etapa do Projeto', 'private' => true], 'edital_proponente' => ['label' => 'Proponente', 'private' => true], 'edital_projeto_resumo' => ['label' => 'Resumo do projeto (objeto)', 'private' => true], 'edital_prestacaoContas_envio' => ['label' => 'Prestação de Contas - Envio', 'private' => true, 'type' => 'select', 'options' => array('enviada' => 'Enviada', 'naoEnviada' => 'Não Enviada', 'premiado' => 'Ponto de Cultura Premiado')], 'edital_prestacaoContas_status' => ['label' => 'Prestação de Contas - Status', 'required' => false, 'private' => true, 'type' => 'select', 'options' => array('aprovada' => 'Aprovada', 'naoaprovada' => 'Não Aprovada', 'analise' => 'Em análise')], 'edital_projeto_vigencia_inicio' => ['label' => 'Vigência', 'private' => true], 'edital_projeto_vigencia_fim' => ['label' => 'Vigência', 'private' => true], 'outrosFinanciamentos' => ['label' => 'Recebe ou recebeu outros financiamentos? (apoios, patrocínios, prêmios, bolsas, convênios, etc)', 'private' => true], 'outrosFinanciamentos_descricao' => ['label' => 'Descrição dos outros financiamentos (apoios, patrocínios, prêmios, bolsas, convênios, etc)', 'required' => false, 'private' => true], 'telefone2' => ['label' => 'Telefone', 'private' => true, 'validations' => ['v::regex("#^\\d{2}[ ]?\\d{4,5}\\d{4}$#")' => 'Por favor, informe o telefone público no formato xx xxxx xxxx.']], 'telefone2_operadora' => ['label' => 'Operadora', 'private' => true], 'responsavel_nome' => ['label' => 'Nome do responsável', 'private' => true], 'responsavel_cargo' => ['label' => 'Cargo do responsável', 'private' => true], 'responsavel_email' => ['label' => 'Email do responsável', 'private' => true], 'responsavel_telefone' => ['label' => 'Telefone do responsável', 'private' => true], 'responsavel_operadora' => ['label' => 'Operadora do telefone do responsável', 'private' => true], 'En_Bairro' => ['label' => 'Bairro', 'private' => function () {
         return !$this->publicLocation;
     }], 'En_Num' => ['label' => 'Número', 'private' => function () {
         return !$this->publicLocation;
     }], 'En_Nome_Logradouro' => ['label' => 'Logradouro', 'private' => function () {
         return !$this->publicLocation;
     }], 'En_Complemento' => ['label' => 'Complemento', 'private' => function () {
         return !$this->publicLocation;
     }], 'geoEstado' => ['label' => 'Estado', 'private' => function () {
         return !$this->publicLocation;
     }], 'pais' => ['label' => 'Pais', 'private' => function () {
         return !$this->publicLocation;
     }], 'geoMunicipio' => ['label' => 'Município', 'private' => function () {
         return !$this->publicLocation;
     }], 'mesmoEndereco' => ['label' => 'Mesmo Endereco', 'required' => false, 'private' => true], 'tem_sede' => ['label' => 'Tem sede propria?'], 'sede_realizaAtividades' => ['label' => 'Realiza atividades culturais na sede'], 'sede_cnpj' => ['label' => 'O endereço da sede é o mesmo registrado para o CNPJ?', 'required' => false], 'cep' => ['label' => 'CEP', 'private' => function () {
         return !$this->publicLocation;
     }], 'localRealizacao_estado' => ['label' => 'Estado', 'required' => false], 'localRealizacao_cidade' => ['label' => 'Cidade', 'required' => false], 'local_de_acao_espaco' => ['label' => 'Espaço', 'required' => false], 'atividadesEmRealizacao' => ['label' => 'Atividades culturais em realização'], 'atividadesEmRealizacaoLink' => ['label' => 'Link para suas atividades culturais em realização'], 'flickr' => ['label' => 'Flickr', 'required' => false], 'diaspora' => ['label' => 'Diáspora', 'required' => false], 'youtube' => ['label' => 'Youtube', 'required' => false], 'telegram' => ['label' => 'Telegram', 'required' => false], 'whatsapp' => ['label' => 'WhatsApp', 'required' => false], 'culturadigital' => ['label' => 'CulturaDigital', 'required' => false], 'instagram' => ['label' => 'Instagram', 'required' => false], 'participacaoMovPolitico' => ['label' => '', 'required' => false, 'private' => true], 'participacaoForumCultura' => ['label' => '', 'required' => false, 'private' => true], 'parceriaPoderPublico' => ['label' => '', 'required' => false, 'private' => true], 'simPoderPublico' => ['label' => 'Quais para radio participa poder publico', 'private' => true], 'simMovimentoPoliticoCultural' => ['label' => 'Quais para radio participa movimento politico cultural', 'private' => true], 'simForumCultural' => ['label' => 'Quais para radio participa forum cultural', 'private' => true], 'pontoOutrosRecursosRede' => ['label' => '', 'required' => false, 'private' => true], 'pontoNumPessoasNucleo' => ['label' => '', 'required' => false, 'private' => true], 'pontoNumPessoasColaboradores' => ['label' => '', 'required' => false, 'private' => true], 'pontoNumPessoasIndiretas' => ['label' => '', 'required' => false, 'private' => true], 'pontoNumPessoasParceiros' => ['label' => '', 'required' => false, 'private' => true], 'pontoNumPessoasApoiadores' => ['label' => '', 'required' => false, 'private' => true], 'pontoNumRedes' => ['label' => '', 'required' => false, 'private' => true], 'pontoRedesDescricao' => ['label' => '', 'required' => false, 'private' => true], 'pontoMovimentos' => ['label' => '', 'required' => false, 'private' => true], 'pontoEconomiaSolidaria' => ['label' => '', 'required' => false, 'private' => true], 'pontoEconomiaSolidariaDescricao' => ['label' => '', 'required' => false, 'private' => true], 'pontoEconomiaCultura' => ['label' => '', 'required' => false, 'private' => true], 'pontoEconomiaCulturaDescricao' => ['label' => '', 'required' => false, 'private' => true], 'pontoMoedaSocial' => ['label' => '', 'required' => false, 'private' => true], 'pontoMoedaSocialDescricao' => ['label' => '', 'required' => false, 'private' => true], 'pontoTrocasServicos' => ['label' => '', 'required' => false, 'private' => true], 'pontoTrocasServicosOutros' => ['label' => '', 'required' => false, 'private' => true], 'pontoContrataServicos' => ['label' => '', 'required' => false, 'private' => true], 'pontoContrataServicosOutros' => ['label' => '', 'required' => false, 'private' => true], 'pontoInvestimentosColetivos' => ['label' => '', 'required' => false, 'private' => true], 'pontoInvestColetivosOutros' => ['label' => '', 'required' => false, 'private' => true], 'pontoCustoAnual' => ['label' => '', 'required' => false, 'private' => true], 'formador1_nome' => ['label' => '', 'required' => false, 'private' => true], 'formador1_email' => ['label' => '', 'required' => false, 'private' => true], 'formador1_telefone' => ['label' => '', 'required' => false, 'private' => true], 'formador1_operadora' => ['label' => '', 'required' => false, 'private' => true], 'formador1_areaAtuacao' => ['label' => '', 'required' => false, 'private' => true], 'formador1_bio' => ['label' => '', 'required' => false, 'private' => true], 'formador1_facebook' => ['label' => '', 'required' => false, 'private' => true], 'formador1_twitter' => ['label' => '', 'required' => false, 'private' => true], 'formador1_google' => ['label' => '', 'required' => false, 'private' => true], 'espacoAprendizagem1_atuacao' => ['label' => '', 'required' => false, 'private' => true], 'espacoAprendizagem1_tipo' => ['label' => '', 'required' => false, 'private' => true], 'espacoAprendizagem1_desc' => ['label' => '', 'required' => false, 'private' => true], 'metodologia1_nome' => ['label' => '', 'required' => false, 'private' => true], 'metodologia1_desc' => ['label' => '', 'required' => false, 'private' => true], 'metodologia1_necessidades' => ['label' => '', 'required' => false, 'private' => true], 'metodologia1_capacidade' => ['label' => '', 'required' => false, 'private' => true], 'metodologia1_cargaHoraria' => ['label' => '', 'required' => false, 'private' => true], 'metodologia1_certificacao' => ['label' => '', 'required' => false, 'private' => true], 'metodologia1_tipo' => ['label' => '', 'required' => false, 'private' => true], 'termos_de_uso' => ['label' => '', 'required' => false, 'private' => true]]];
     foreach ($metadata as $entity_class => $metas) {
         foreach ($metas as $key => $cfg) {
             $def = new \MapasCulturais\Definitions\Metadata($key, $cfg);
             $app->registerMetadata($def, $entity_class);
         }
     }
     $taxonomies = ['contemplado_edital' => 'Editais do Ministério da Cultura em que foi contemplado', 'acao_estruturante' => 'Ações Estruturantes', 'publico_participante' => 'Públicos que participam das ações', 'local_realizacao' => 'Locais onde são realizadas as ações culturais', 'area_atuacao' => 'Área de experiência e temas', 'instancia_representacao_minc' => 'Instância de representação junto ao Ministério da Cultura', 'ponto_infra_estrutura' => '', 'ponto_equipamentos' => '', 'ponto_recursos_humanos' => '', 'ponto_hospedagem' => '', 'ponto_deslocamento' => '', 'ponto_comunicacao' => '', 'ponto_sustentabilidade' => '', 'metodologias_areas' => ''];
     $id = 10;
     foreach ($taxonomies as $slug => $description) {
         $id++;
         $def = new \MapasCulturais\Definitions\Taxonomy($id, $slug, $description);
         $app->registerTaxonomy('MapasCulturais\\Entities\\Agent', $def);
     }
 }
Пример #9
0
    function _init()
    {
        parent::_init();
        $app = App::i();
        $app->hook('view.render(<<*>>):before', function () use($app) {
            $this->jsObject['assets']['logo-prefeitura'] = $this->asset('img/logo-prefeitura.png', false);
        });
        $theme = $this;
        $app->hook('GET(project.virada-cultural-2015.docx)', function () use($app, $theme) {
            $this->requireAuthentication();
            $project_id = 632;
            $entity = $app->repo('Project')->find($project_id);
            $entity->checkPermission('@control');
            $ids = $entity->getChildrenIds();
            $ids[] = $entity->id;
            $in = implode(',', array_map(function ($e) {
                return '@Project:' . $e;
            }, $ids));
            $events = $app->controller('Event')->apiQuery(['@select' => 'id,name,classificacaoEtaria,singleUrl,occurrences,terms,status,owner.id,owner.name,owner.singleUrl,project.id,project.name', 'project' => 'IN(' . $in . ')', '@permissions' => 'view', '@files' => '(avatar.avatarSmall):url']);
            $parceiros = ['Centro Acadêmico XI de Agosto' => [], 'Cultura Inglesa Festival' => [], 'Secretaria da Cultura do Estado de São Paulo' => [], 'Coletivo Teatral Commune' => [], 'Sesc São Paulo' => [], 'Família 100 Conflito' => [], 'Movimento Cultural Penha' => [], 'RenattodSousa Foto Galeria' => [], 'Kaapora Cultural' => [], 'Garageclub' => [], 'Associação Viva e Deixe Viver Contadores de História' => [], 'Garrafas Bar' => [], 'Cia. Teatral Bola de Neve' => [], 'Memorial da Inclusão: Os Caminhos da Pessoa com Deficiência' => [], 'Caixa Cultural São Paulo' => [], 'Dia da Música' => [], 'Serviço Funerário do Município de São Paulo' => [], 'Espaçoarte eventos' => [], 'UNAS' => [], 'Centro de Tradições Nordestinas' => [], 'Virada Coral' => [], 'Consulado Geral de Portugal em São Paulo' => [], 'Auditório Ibirapuera' => [], 'MASP' => []];
            $eventos_smc = [];
            foreach ($events as $e) {
                $e['owner']['name'] = trim(str_replace('  ', ' ', $e['owner']['name']));
                if (isset($parceiros[$e['owner']['name']])) {
                    $parceiros[$e['owner']['name']][] = $e;
                } else {
                    $eventos_smc[] = $e;
                }
            }
            $enderecos = [];
            $group_events = function ($events) use($enderecos) {
                $spaces = [];
                foreach ($events as $event) {
                    foreach ($event['occurrences'] as $occ) {
                        if (!isset($spaces[$occ->space->name])) {
                            $spaces[$occ->space->name] = [$occ->space->endereco];
                        }
                        if ($occ->rule->duration != 1440) {
                            $data = $occ->startsOn->format('Y-m-d') . ' ' . $occ->startsAt->format('H:i');
                            $spaces[$occ->space->name][$data] = $event['name'];
                        } else {
                            if (!isset($spaces[$occ->space->name]['24h'])) {
                                $spaces[$occ->space->name]['24h'] = [];
                            }
                            $spaces[$occ->space->name]['24h'][] = $event['name'];
                        }
                    }
                }
                foreach ($spaces as $name => $evts) {
                    ksort($spaces[$name]);
                }
                return $spaces;
            };
            $print_parceiro = function ($eventos, $parceiro = false) use($project_id, $group_events) {
                $projetos = [];
                $eventos_parceiro = [];
                foreach ($eventos as $evento) {
                    if ($evento['project']['id'] != $project_id) {
                        if (!isset($projetos[$evento['project']['name']])) {
                            $projetos[$evento['project']['name']] = [];
                        }
                        $projetos[$evento['project']['name']][] = $evento;
                    } else {
                        $eventos_parceiro[] = $evento;
                    }
                }
                $eventos_smc = $group_events($eventos_parceiro);
                $eventos_projeto = [];
                foreach ($projetos as $name => $evts) {
                    $eventos_projeto[$name] = $group_events($evts);
                }
                //                var_dump($eventos_smc);
                $print = function ($eventos, $h = 'h1') {
                    ksort($eventos);
                    foreach ($eventos as $palco => $evts) {
                        echo "<{$h}>{$palco}</{$h}>";
                        $endereco = $evts[0];
                        unset($evts[0]);
                        if ($endereco != $palco) {
                            echo "<em>{$endereco}</em><br><br>";
                        }
                        if (isset($evts['24h'])) {
                        } else {
                            $format = 'H:i';
                        }
                        $format = '\\d\\i\\a d \\à\\s H:i';
                        foreach ($evts as $hora => $nome) {
                            if ($hora == '24h') {
                                foreach ($nome as $n) {
                                    echo "  <b>{$hora}</b>   -   {$n}<br>";
                                }
                            } else {
                                $dt = new \DateTime($hora);
                                $hora = $dt->format($format);
                                echo "  <b>{$hora}</b>   -   {$nome}<br>";
                            }
                        }
                    }
                };
                if ($parceiro) {
                    $h1 = 'h2';
                    $h2 = 'h3';
                    $h3 = 'h4';
                } else {
                    $h1 = 'h1';
                    $h2 = 'h2';
                    $h3 = 'h3';
                }
                if ($parceiro) {
                    echo "<h1>{$parceiro}</h1>";
                }
                $print($eventos_smc, $h2);
                foreach ($eventos_projeto as $projeto => $evts) {
                    echo "<{$h1}>{$projeto}</{$h1}>";
                    $print($evts, $h3);
                }
            };
            $response = $app->response();
            $response->header("Content-Type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
            $response->header('Content-Disposition', 'attachment; filename=virada-cultural-2015.docx');
            ?>
<html>
    <body>
        <?php 
            $print_parceiro($eventos_smc);
            ?>

        <?php 
            foreach ($parceiros as $parceiro => $eventos) {
                if (!$eventos) {
                    continue;
                }
                ?>
            <?php 
                $print_parceiro($eventos, $parceiro);
                ?>
        <?php 
            }
            ?>
    </body>
</html>
            <?php 
        });
    }