2011-11-01 19 views
7

Dự án tôi đang làm việc trên sử dụng plugin khéo léo tuyệt vời của Plone. Một vài loại nội dung tùy chỉnh của tôi có tên rất cụ thể phải được tính toán. Con đường tôi đã ban đầu thực hiện điều này trước khi là bằng cách thêm plone.app.content.interfaces.INameFromTitle như một hành vi trong mục cài đặt chung của đối tượng, mỗi chỉ dẫn của nhãn hiệu:Có cách nào để mở rộng hành vi INameFromTitle của Plone Dexterity không?

<?xml version="1.0"?> 
<object name="avrc.aeh.cycle" meta_type="Dexterity FTI"> 
    ... 
    <property name="schema">myproject.mytype.IMyType</property> 
    <property name="klass">plone.dexterity.content.Item</property> 
    ... 
    <property name="behaviors"> 
    <element value="plone.app.content.interfaces.INameFromTitle" /> 
    </property> 
    ... 
</object> 

Sau đó, tôi tạo ra một adapter sẽ cung cấp INameFromTitle:

from five import grok 
from zope.interface import Interface 
import zope.schema 
from plone.app.content.interfaces import INameFromTitle 

class IMyType(Interface): 

    foo = zope.schema.TextLine(
     title=u'Foo' 
     ) 

class NameForMyType(grok.Adapter): 
    grok.context(IMyType) 
    grok.provides(INameFromTitle) 

    @property 
    def title(self): 
     return u'Custom Title %s' % self.context.foo 

phương pháp này là rất tương tự như đề xuất trong bài viết trên blog này:

http://davidjb.com/blog/2010/04/plone-and-dexterity-working-with-computed-fields

Thật không may, phương pháp này đã ngừng hoạt động sau phiên bản beta plone.app.dexterity và bây giờ các mục nội dung của tôi không được gán tên đúng cách.

Có ai muốn biết cách mở rộng hành vi INameFromTitle của Thủ Thuật đối với các trường hợp sử dụng tên rất cụ thể không?

Trợ giúp của bạn được đánh giá cao, cảm ơn!

Trả lời

4

Bạn có thể thử cách sau.

trong interfaces.py

from plone.app.content.interfaces import INameFromTitle 

class INameForMyType(INameFromTitle): 

    def title(): 
     """Return a custom title""" 

trong behaviors.py

from myproject.mytype.interfaces import INameForMyType 

class NameForMyType(object): 
    implements(INameForMyType) 

    def __init__(self, context): 
     self.context = context 

    @property 
    def title(self): 
     return u"Custom Title %s" % self.context.foo 

Tôi thường thích định adapter của tôi sử dụng ZCML; trong configure.zcml

<adapter for="myproject.mytype.IMyType" 
     factory=".behaviors.NameForMyType" 
     provides=".behaviors.INameForMyType" 
     /> 

nhưng bạn có thể có lẽ cũng sử dụng một grok.global_adapter.

3

tôi đã làm nó với một hành vi, bằng cách thích nghi với INameFromTitle

trong behaviors.py

class INameFromBrandAndModel(Interface): 
    """ Interface to adapt to INameFromTitle """ 

class NameFromBrandAndModel(object): 
    """ Adapter to INameFromTitle """ 
    implements(INameFromTitle) 
    adapts(INameFromBrandAndModel) 

    def __init__(self, context): 
     pass 

    def __new__(cls, context): 
     brand = context.brand 
     model = context.modeltype  
     title = u'%s %s' % (brand,model) 
     inst = super(NameFromBrandAndModel, cls).__new__(cls) 

     inst.title = title 
     context.setTitle(title) 

     return inst 

trong behaviors.zcml hoặc configure.zcml

<plone:behavior 

    title="Name from brand and model" 
    description="generates a name from brand and model attributes" 
    for="plone.dexterity.interfaces.IDexterityContent" 
    provides=".behavios.INameFromBrandAndModel" 
    /> 

<adapter factory=".behaviors.NameFromBrandAndModel" /> 

Sau đó vô hiệu hóa hành vi INameFromTitle trong profiles/types/your.contenttype.xml.

Voila. Điều này tích hợp rất tốt và hiển thị một tiêu đề phù hợp trong chế độ xem và điều hướng mặc định. Xóa context.setTitle(title) khỏi bộ điều hợp sẽ chỉ để lại cho chúng tôi id hợp lệ, nhưng không có tiêu đề nào được đặt.

Điều này không thay đổi tiêu đề một cách độc lập sau khi chỉnh sửa.Tôi đã có, cho đến nay, không thành công với việc ghi đè thuộc tính klass của các loại nội dung của tôi, như thường được đề xuất.

Nếu bạn xác định title thuộc tính trong lược đồ, như:

class IBike(form.Schema): 
    """A bike 
    """ 

    title = schema.TextLine(
     title = _(u'Title'), 
     required = False, 
    ) 

bạn có thể dễ dàng thay đổi tiêu đề sau. Ẩn trường tiêu đề trong addForm nên được thực hiện, để tránh hiểu lầm.

Các vấn đề liên quan