Ir para o conteúdo

 Voltar a OpenACS: Des...
Tela cheia

Implementando portlets em subsites: problemas

21 de Novembro de 2011, 15:08 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 21 vezes

Olá pessoal,

Estamos reformulando o site da comunidade 5CQualiBr no Portal do SPB e depois de várias semanas discutindo o formato e organização do site chegou a hora de botar a mão na massa.

Como o 5CQualiBr foi construído como um sub-site do SPB ele é muito limitado na criação de comunidades com as funcionalidades do dotLRN. A solução que encontrei para evitar uma instalação completa do dotLRN no cliente ou a migração para uma comunidade padrão do SPB foi utilizar o script Alessandro Landim para implementar Portlets em sub-sites.



Inclusive corrigi um pequeno erro de revisão que está no final desta linha (em negrito)
 "<property name="header_stuff">@header_stuff;noquote@lt;/property>"

Também fiz o procedimento para upgrade do pacote New-Portal, atualizando-o com a nova tabela.

Porém estou obtendo o erro abaixo quando implemento os códigos finais no Zen-Theme.

Reparei que o código para o ADP é somente para exibição do novo menu de controle dos portlets e por isso o coloquei no final da DIV "Cabeçalho". Já o TCL coloquei dentro do "Site wide admin link", comentando parte do código original que chama o "subsite_admin_p".

Parece que o erro agora está na variável "$portal_id.

Quem puder me ajudar, agradeço.

Um abraço,
Jaime

Código de erro:
can't read "subsite_info(package_id)": no such variable
    while executing
"portal::get_mapped_portal -object_id $subsite_info(package_id)"
    ("uplevel" body line 41)
    invoked from within
"uplevel {
    	  ad_page_contract {

    Master template for any subsite

    @author  Nick Carroll (nick.c@rroll.net)
    @creation-date 2005-03-24
 ..."
    (procedure "code::tcl::/usr/share/dotlrn/packages/theme-zen/lib/5cqualib..." line 2)
    invoked from within
"code::tcl::$__adp_stub"
    ("uplevel" body line 12)
    invoked from within
"uplevel {

    if { [file exists $__adp_stub.tcl] } {

      # ensure that data source preparation procedure exists and is up-to-date
      adp_init t..."
    (procedure "adp_prepare" line 2)
    invoked from within
"adp_prepare"
    invoked from within
"template::adp_parse $__adp_master  [concat [list __adp_slave $__adp_output] [array get __adp_properties]]"
    invoked from within
"template::adp_parse [file root [ad_conn file]] {}"
    (procedure "adp_parse_ad_conn_file" line 6)
    invoked from within
"$handler"
    ("uplevel" body line 2)
    invoked from within
"uplevel $code"
    invoked from within
"ad_try {
                $handler
            } ad_script_abort val {
                # do nothing
            }"
    invoked from within
"rp_serve_concrete_file [ad_conn file]"
    (procedure "rp_serve_abstract_file" line 60)
    invoked from within
"rp_serve_abstract_file "$root/[ad_conn extra_url]""
    ("uplevel" body line 2)
    invoked from within
"uplevel $code"
    invoked from within
"ad_try {
            rp_serve_abstract_file "$root/[ad_conn extra_url]"
            set tcl_url2file([ad_conn url]) [ad_conn file]
            set tcl..."

Autor: Jaime Balbino


77 comentários

  • 7cbe4e406599478e7042a9fb27066e31?only path=false&size=50&d=404Alessandro Landim(usuário não autenticado)
    21 de Novembro de 2011, 21:02

     

    Oi Jaime,

    Ele está reclamando da variável que não existe $subsite_info(package_id).

     

    Parece que quando você comentou o código TCL do "subsite_admin_p" você também comentou a linha abaixo:

    subsite::get -array subsite_info

    Descomente-a e veja se funciona.

     

    Abraços,

     

     

    • A9b58ada0c7ca8c6e9b083c1dea0b72f?only path=false&size=50&d=404Jaime Balbino(usuário não autenticado)
      22 de Novembro de 2011, 18:05

       

      Alessandro,

      Acho que mandei o código de erro errado. Eu refiz os passos e o erro é mesmo na  variável $portal_id, na linha 159:

      set all_datasources [portal::list_datasources]

      A parte do código completa é:

      if {$subsite_admin_p} {

            set portal_datasources [portal::list_datasources $portal_id]

            set all_datasources [portal::list_datasources]

            ...

       Ela é chamada pelo $subsite_info(package_id), mas parece que agora está passando, já que o erro "avançou" duas linhas do código.

      O código de erro persistente é:

      can't read "portal_id": no such variable
      while executing
      "portal::list_datasources $portal_id"
      ("uplevel" body line 159)
      invoked from within
      "uplevel {
      ad_page_contract {

      Master template for any subsite

      @author Nick Carroll (nick.c@rroll.net)
      @creation-date 2005-03-24
      ..."
      (procedure "code::tcl::/usr/share/dotlrn/packages/theme-zen/lib/5cqualib..." line 2)
      invoked from within
      "code::tcl::$__adp_stub"
      ("uplevel" body line 12)
      invoked from within
      "uplevel {

      if { [file exists $__adp_stub.tcl] } {

      # ensure that data source preparation procedure exists and is up-to-date
      adp_init t..."
      (procedure "adp_prepare" line 2)
      invoked from within
      "adp_prepare"
      invoked from within
      "template::adp_parse $__adp_master [concat [list __adp_slave $__adp_output] [array get __adp_properties]]"
      invoked from within
      "template::adp_parse [file root [ad_conn file]] {}"
      (procedure "adp_parse_ad_conn_file" line 6)
      invoked from within
      "$handler"
      ("uplevel" body line 2)
      invoked from within
      "uplevel $code"
      invoked from within
      "ad_try {
      $handler
      } ad_script_abort val {
      # do nothing
      }"
      invoked from within
      "rp_serve_concrete_file [ad_conn file]"
      (procedure "rp_serve_abstract_file" line 60)
      invoked from within
      "rp_serve_abstract_file "$root/[ad_conn extra_url]""
      ("uplevel" body line 2)
      invoked from within
      "uplevel $code"
      invoked from within
      "ad_try {
      rp_serve_abstract_file "$root/[ad_conn extra_url]"
      set tcl_url2file([ad_conn url]) [ad_conn file] 
      set tcl..." 

      • 7cbe4e406599478e7042a9fb27066e31?only path=false&size=50&d=404Alessandro Landim(usuário não autenticado)
        22 de Novembro de 2011, 19:43

         

        Realmente Jaime, tem um erro no tutorial, mas já corrigi. Basta você adicionar a linha em destaque abaixo. Acho que agora você vai conseguir.

         

        subsite::get -array subsite_info
        set subsite_admin_p [permission::permission_p -object_id $subsite_info(package_id) -party_id [ad_conn user_id] -privilege admin]
        set portal_id [portal::get_mapped_portal -object_id $subsite_info(package_id)]

        set return_url [ad_return_url]
        set new_portal_url [site_node::get_package_url -package_key new-portal]
        set subsite_portal_id [portal::get_mapped_portal -object_id $subsite_info(package_id)]

        if {$subsite_admin_p} {
              set portal_datasources [portal::list_datasources $portal_id]
              set all_datasources [portal::list_datasources]

              set subsite_node_id $subsite_info(node_id)

              db_multirow -extend {available} applications select_applications {
                   select p.package_id,
                          p.instance_name,
                          n.node_id,
                          n.name,
                          p.package_key
                   from site_nodes n,
                        apm_packages p,
                        apm_package_types t
                   where n.parent_id = :subsite_node_id
                   and p.package_id = n.object_id
                   and t.package_key = p.package_key
                   and t.package_type = 'apm_application'       

                   and exists (select 1
                               from   all_object_party_privilege_map perm
                               where  perm.object_id = p.package_id
                               and    perm.privilege = 'read'
                               and    perm.party_id = :user_id)
                   order  by upper(instance_name)
               } {
              

                  if {[acs_user::site_wide_admin_p]} {
                       switch $package_key {
                           file-storage {set package_key fs}
                       }

                       foreach datasource $all_datasources {
                            set package_portlet_key [lindex [split $package_key "_"] 0]
                            if {[lsearch [split $datasource "_"] $package_portlet_key] != -1 &amp;&amp; [lsearch $portal_datasources $datasource] == -1} {
                                set available "1"
                            }
                       }
                   }

              }
        }

        • A9b58ada0c7ca8c6e9b083c1dea0b72f?only path=false&size=50&d=404Jaime Balbino(usuário não autenticado)
          23 de Novembro de 2011, 1:40

           

          Ufa! Agora funcionou! Puxa, assim você acaba comigo! Revisei esse código de cabo a rabo e fiquei achando que estava faltando definir essa variável.

          Valeu! Agora é colocar os códigos dos portlets e partir para o abraço! 

          Uma dúvida conceitual: o calendário num subsite (e consequentemente seu portlet) é uma instância separada do resto do site ou herda os privilêgios e eventos do portal inteiro e de outros subsites e comunidades do dotLRN?

          Quer dizer: na prática, um calendário num subsite exibe todos os eventos do usuário no portal inteiro, como no dotLRN?

          Um abraço,

          Jaime 

          • 7cbe4e406599478e7042a9fb27066e31?only path=false&size=50&d=404Alessandro Landim(usuário não autenticado)
            23 de Novembro de 2011, 2:00

             

            Desculpe, e engraçado que eu testei o tutorial.

            É uma instância separada do resto do site e herda os privilégios do subsite, por padrão.

            Então não, ele não exibe os eventos do usuário no portal inteiro. O que dotLRN faz é associar os calendários das comunidades ao portlet do usuário, por isso que ele mostra todos os eventos das comunidades que o usuário faz parte.

            O portlet do subsite não é vinculado ao usuário e sim ao calendar_id. Então vai mostrar somente os eventos daquele calendário.

            Abraços,

            • A9b58ada0c7ca8c6e9b083c1dea0b72f?only path=false&size=50&d=404Jaime Balbino(usuário não autenticado)
              9 de Dezembro de 2011, 22:35

               

              Alessandro,

               

              Estou com outro problema persistente nos portlets que está me impedindo de fechar o projeto. Já tentei mapeá-lo mas sem sucesso. Ele ocorreu nas duas instalações e teste que fiz e não deixa exibir o subsite.

              Parece que o erro está em "Portal":

               Houve um erro ao processar seu pedido. Pedimos desculpas.

              Me leve de volta para onde eu estava (antes do erro)
              invalid command name "portal::get_page_header_stuff"
              while executing
              "portal::get_page_header_stuff -portal_id $portal_id -page_num 0"
              ("uplevel" body line 78)
              invoked from within
              "uplevel {
              # packages/mbryzek-subsite/www/index.tcl

              ad_page_contract {

              @author rhs@mit.edu
              @author mbryzek@mit.edu

              @creation-date 2000-..."
              (procedure "code::tcl::/usr/share/dotlrn/packages/acs-subsite/www/index" line 2)
              invoked from within
              "code::tcl::$__adp_stub"
              ("uplevel" body line 12)
              invoked from within
              "uplevel {

              if { [file exists $__adp_stub.tcl] } {

              # ensure that data source preparation procedure exists and is up-to-date
              adp_init t..."
              (procedure "adp_prepare" line 2)
              invoked from within
              "adp_prepare"
              invoked from within
              "template::adp_parse [file root [ad_conn file]] {}"
              (procedure "adp_parse_ad_conn_file" line 6)
              invoked from within
              "$handler"
              ("uplevel" body line 2)
              invoked from within
              "uplevel $code"
              invoked from within
              "ad_try {
              $handler
              } ad_script_abort val {
              # do nothing
              }"
              invoked from within
              "rp_serve_concrete_file [ad_conn file]"
              (procedure "rp_serve_abstract_file" line 60)
              invoked from within
              "rp_serve_abstract_file "$root/[ad_conn extra_url]""
              ("uplevel" body line 2)
              invoked from within
              "uplevel $code"
              invoked from within
              "ad_try {
              rp_serve_abstract_file "$root/[ad_conn extra_url]"
              set tcl_url2file([ad_conn url]) [ad_conn file] 
              set tcl..." 

              • A9b58ada0c7ca8c6e9b083c1dea0b72f?only path=false&size=50&d=404Jaime Balbino(usuário não autenticado)
                12 de Dezembro de 2011, 3:58

                 

                Alarme falso, pessoal. Eu apenas esqueci de comentar uma linha conforme o tutorial do Alessandro. Agora voltou a funcionar perfeitamente.

                Obrigado.

Oportunidade de Trabalho com OpenACS

9 de Dezembro de 2011, 16:07, por Desconhecido

Domí­nio do ambiente Linux em modo Shell;



Fundamentos de desenvolvimento e criação de comunidades virtuais com o framework OpenACS

28 de Outubro de 2010, 16:51, por Desconhecido

Durante o Latinoware, que será realizado em Foz do Iguaçu entre os dias 10 e 12 de Novembro, será realizada uma oficina sobre desenvolvimento em OpenACS. A oficina é parte da iniciativa de compartilhamento do Projeto Software Público Internacional, e conta com apoio da organização.



Oficina sobre OpenACS em Belo Horizonte

19 de Novembro de 2008, 9:43, por Desconhecido

No dia 27 de novembro de 2008, será realizado durante o Encontro Mineiro de Software Livre, uma oficina para formação de desenvolvedores OpenACS. A oficina tem por objetivo introduzir a ferramenta na cidade e atender a uma demanda crescente por especialistas na área.



Treinamento em OpenACS em Brasília tem sua aula inaugural

10 de Novembro de 2008, 9:43, por Desconhecido

Fruto de uma paceria entre a Lupa Treinamento e a Secretaria de Logística e Tecnologia da Informação do Ministério do Planejamento, começou no último Sábado o terceiro treinamento em OpenACS realizado em Brasília.



Instalacao do OACS 5.3 em Debian e Ubuntu

29 de Janeiro de 2008, 16:52, por Desconhecido

Acaba http://cognovis.de/developer/ou de sair do forno...