2017-05-04 10 views
0

리플렛 wagtail 블록 통합 작업 중입니다. 아무것도 표시 : I 스트림에 새 블록을 addStreamField :지도 추가 블록

https://github.com/frague59/wagtail-leaflet

나는 위젯 렌더링 어려움을했습니다. django-leaflet/django-geojson의 위젯은 템플릿 창안에 반영되지 않은 geojson 매개 변수 'window wide'의 설정을 포함합니다. 내 leaflet/widget.html에서

:

<script type="text/javascript"> 
    var geodjango___prefix___value = {}; 
    geodjango___prefix___value.fieldid = '__prefix__-value'; 
    geodjango___prefix___value.modifiable = true; 
    geodjango___prefix___value.geom_type = 'Geometry'; 
    geodjango___prefix___value.srid = 4326; 


    function __prefix___value_map_callback(map, options) { 
     geodjango___prefix___value.store_class = L.FieldStore; 
     (new L.GeometryField(geodjango___prefix___value)).addTo(map); 

    }; 

</script> 

Streamfield 블록 API가 명확하게 사용 사례를 언급하지 않습니다 text/template 요소에서

<script type="text/javascript"> 
    {% block vars %}var {{ module }} = {}; 
    {{ module }}.fieldid = '{{ id_css }}'; 
    {{ module }}.modifiable = {{ modifiable|yesno:"true,false" }}; 
    {{ module }}.geom_type = '{{ geom_type }}'; 
    {{ module }}.srid = {{ map_srid }}; 
    {% endblock vars %} 
     function {{ id_map_callback }}(map, options) { 
     window.LEAFLET_DATA['{{ module }}'].store_class = {{ field_store_class }}; 
     (new {{ geometry_field_class}}(window.LEAFLET_DATA['{{ module }}'])).addTo(map); 
     {% block callback %}{% endblock callback %} 
    }; 

    {% if target_map %} 
     window.addEventListener('map:init', function (e) { 
      var target_map = e.detail.map; 
      target_map.on('map:loadfield', function (me) { 
       if (me.fieldid == 'id_{{ target_map }}') { 
        setTimeout(function() { 
         {{ id_map_callback }}(target_map, e.detail.options); 
        }, 0); 
       } 
      }); 
     }, false); 
    {% endif %} 
</script> 

.

이런 종류의 블록이있는 작동중인 블록 예가 있습니까?

감사합니다.

+0

[최소, 완전하고 검증 가능한] (https://stackoverflow.com/help/mcve) 코드 예제를 제공해주십시오. 이 https://github.com/frague59/wagtail-leaflet 여기 – gasman

+0

https://github.com/makinacorpus/django-leaflet/issues/189 – frague

+0

내 저장소에 관련 코드 @gasman 전체 프로젝트를 조사하여 문제가 무엇인지 확인하십시오. https://stackoverflow.com/help/mcve에서 설명한 것처럼 코드를 문제를 나타내는 가장 작은 예제로 줄여야합니다. – frague

답변

0

요구 사항 :

django-leaflet 
django-geosjon 
jsonfield 

블록 정의 :

from wagtail.wagtailadmin.edit_handlers import StreamFieldPanel 
from wagtail.wagtailcore.fields import StreamField 
from wagtail.wagtailcore.models import Page 
from wagtail.wagtailcore import blocks 
from wagtailleaflet.blocks import GeoJSONPointBlock 

class DemoPage(Page): 
    """ 
    Simple demo page 
    """ 
    body = StreamField([('text', blocks.RichTextBlock()), 
         ('map', GeoJSONPointBlock()), ]) 

    content_panels = Page.content_panels + [StreamFieldPanel('body')] 

나는 것으로 나타났습니다 :

class GeoJSONBlock(FieldBlock): 
    geom_type = 'POINT' 

    def __init__(self, required=True, help_text=None, max_length=None, min_length=None, **kwargs): 
     if self.geom_type is None: 
      raise NotImplemented('You are attempting to use ``GeoJSONBlock`` directly, which *WILL* not work !') 

     self.field = GeoJSONFormField(required=required, 
             help_text=help_text, 
             max_length=max_length, 
             min_length=min_length, 
             geom_type=self.geom_type) 
     super(GeoJSONBlock, self).__init__(**kwargs) 

    def render_form(self, value, prefix='', errors=None): 
     """ 
     Renders ``edit`` form 

     :param value: current value 
     :param prefix: prefix of the form item 
     :param errors: Validations errors 
     :returns: HTML Fragment 
     """ 
     logger.debug('MapBlock::render_form() value = %s', value) 
     rendered = super(GeoJSONBlock, self).render_form(value=value, prefix=prefix, errors=errors) 
     return rendered 

    def render(self, value, context=None): 
     """ 
     Renders the widget in the web site 

     :param value: current value 
     :param context: Additional render context 
     :returns: HTML Fragment 
     """ 
     logger.debug('MapBlock::render() value = %s', value) 
     rendered = super(GeoJSONBlock, self).render(value=value, context=context) 
     return rendered 

    @property 
    def media(self): 
     return forms.Media(
      js=['wagtailleaflet/leaflet_init.js', ] 
     ) 

    def js_initializer(self): 
     """ 
     JS function to launch on start'up 
     :returns: JS function name, from ``wagtailleaflet/leaflet_init.js`` 
     """ 
     output = 'drawMap' 
     logger.debug('MapBlock::js_initializer() output = %s', output) 
     return output 

     def html_declarations(self): 
      output = render_to_string('wagtailleaflet/leaflet_forms.html') 
      return output 

가 사용 장고 - 전단지/장고 - geosjon에서 전단지 위젯을 사용 문제는 slugify (id를 낮게 설정)을 사용하는 전단 구현에서 발생합니다. 이 id는 블록 초기화시 sequence.js에있는 __PREFIX__ 교체를 나눕니다.

다시 제작하기가 약간 복잡하기 때문에 데모 wagtail 프로젝트로 내 레포에 링크를 넣었습니다.