source: ZMS/trunk/_objinputs.py @ 1875

Revision 1875, 13.0 KB checked in by zmsdev, 13 days ago (diff)

Ticket #60 (uni-bern): fail to edit textarea with invalid links

Line 
1################################################################################
2# _objinputs.py
3#
4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License
6# as published by the Free Software Foundation; either version 2
7# of the License, or (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17################################################################################
18
19# Imports.
20from App.special_dtml import HTMLFile
21# Product Imports.
22import _globals
23import _zreferableitem
24
25
26class ObjInputs:
27
28  # ----------------------------------------------------------------------------
29  #  ObjInputs.getUrlInput:
30  #
31  #     @param fmName
32  #     @param elName
33  #     @param elTextName
34  #     @param size
35  #     @param value
36  #     @param enabled
37  #     @param REQUEST
38  #     @param css      CSS-Class
39  #     @return String
40  # ----------------------------------------------------------------------------
41  def getUrlInput(self, fmName, elName, elTextName, size, value, enabled, REQUEST, css='form-element'):
42    lang = self.REQUEST.get('lang')
43    html = []
44    styles = ['float:left']
45    if size:
46      styles.append( 'width:%iem'%size)
47    else:
48      styles.append( 'width:80%')
49    html.append(self.getTextInput(fmName,elName,size,value,'text',enabled,REQUEST,css,extra=' style="%s"'%(';'.join(styles))))
50    if enabled:
51      html.append('<div class="zmi-icon ui-widget ui-helper-clearfix ui-corner-all ui-state-default" style="float:left">')
52      html.append('<span class="ui-icon ui-icon-newwin" onclick="return zmiBrowseObjs(\'%s\',\'%s\',\'%s\')"></span>'%(fmName,elName,lang))
53      html.append('</div>')
54    ref_obj = self.getLinkObj(value,REQUEST)
55    if ref_obj is not None:
56      html.append('<div class="form-small" style="clear:both">')
57      html.append('<span class="ui-icon ui-icon-extlink" style="float:left"></span>')
58      html.append(ref_obj.f_breadcrumbs(objectPathElements=ref_obj.breadcrumbs_obj_path(),no_icon=1,lang=lang,REQUEST=REQUEST))
59      html.append('</div>')
60    return ''.join(html)
61
62
63  # ----------------------------------------------------------------------------
64  #  getHiddenInput:
65  #
66  #     @param fmName
67  #     @param elName
68  #     @param value
69  # ----------------------------------------------------------------------------
70  def getHiddenInput(self, fmName, elName, value, onchange=''):
71    html = []
72    html.append('<input ')
73    html.append(' type="hidden"')
74    html.append(' name="%s"'%elName)
75    html.append(' value="%s"'%str(value))
76    if onchange:
77      html.append(' onchange="%s"'%onchange)
78    html.append('/>')
79    return ''.join(html)
80
81
82  # ----------------------------------------------------------------------------
83  #  getDateTimeInput:
84  #
85  #     @param fmName
86  #     @param elName
87  #     @param size
88  #     @param value
89  #     @param enabled
90  #     @param REQUEST
91  #     @param css      CSS-Class
92  #     @return String
93  # ----------------------------------------------------------------------------
94  def getDateTimeInput(self, fmName, elName, size, value, enabled, fmt_str, REQUEST, css='form-element', extra=''):
95    manage_lang = self.get_manage_lang()
96    html = []
97    if not type(value) is str:
98      value = self.getLangFmtDate(value,manage_lang,fmt_str)
99    if value is not None and self.parseLangFmtDate(value) is None:
100      value = ''
101    html.append('<span class="%s" title="%s">'%(css,self.getZMILangStr(fmt_str)))
102    if enabled:
103      if fmt_str == 'DATE_FMT':
104        css += ' datepicker'
105      elif fmt_str == 'DATETIME_FMT':
106        css += ' datetimepicker'
107    html.append(self.getTextInput(fmName,elName,size,value,'text',enabled,REQUEST,css,extra))
108    html.append('</span>')
109    return ''.join(html)
110
111
112  # ----------------------------------------------------------------------------
113  #  getDateInput:
114  #
115  #     @param fmName
116  #     @param elName
117  #     @param value
118  #     @param enabled
119  #     @param REQUEST
120  #     @param css      CSS-Class
121  #     @return String
122  # ----------------------------------------------------------------------------
123  def getDateInput(self, fmName, elName, value, enabled, REQUEST, css='form-element', extra=''):
124    return self.getDateTimeInput(fmName=fmName,elName=elName,size=8,value=value,enabled=enabled,fmt_str='DATE_FMT',REQUEST=REQUEST,css=css, extra=extra)
125
126
127  # ----------------------------------------------------------------------------
128  #  getPasswordInput:
129  #
130  #     @param fmName
131  #     @param elName
132  #     @param size
133  #     @param value
134  #     @param enabled
135  #     @param css      CSS-Class
136  #     @return String
137  # ----------------------------------------------------------------------------
138  def getPasswordInput(self, fmName, elName, size=15, value='', enabled=True, REQUEST=None, css='form-element', extra=''):
139    return self.getTextInput(fmName,elName,size,value,'password',enabled,REQUEST,css,extra)
140
141
142  # ----------------------------------------------------------------------------
143  #     getTextInput:
144  #
145  #     @param fmName
146  #     @param elName
147  #     @param size
148  #     @param value (optional)
149  #     @param type (optional: "text" or "password")
150  #     @param css      CSS-Class
151  #     @return String
152  # ----------------------------------------------------------------------------
153  def getTextInput(self, fmName, elName, size=None, value='', type='text', enabled=True, REQUEST=None, css='form-element', extra=''):
154    html = []
155    html.append('<span class="%s">'%css)
156    html.append('<input ')
157    html.append(' class="%s"'%css)
158    html.append(' type="%s"'%type)
159    html.append(' id="%s"'%elName.replace(':int',''))
160    html.append(' name="%s"'%elName)
161    if size:
162      html.append(' size="%i"'%size)
163    if value is not None:
164      html.append(' value="%s"'%_globals.html_quote(value))
165    if extra.find('style=') < 0:
166      styles = []
167      if size:
168        styles.append( 'width:%iem'%size)
169      else:
170        styles.append( 'width:80%')
171      if elName.endswith(':int'):
172        styles.append( 'text-align:right')
173      html.append(' style="%s"'%(';'.join(styles)))
174    if not enabled:
175      html.append(' disabled="disabled"')
176    html.append(' %s/>'%extra)
177    html.append('</span>')
178    return ''.join(html)
179
180
181  # ----------------------------------------------------------------------------
182  #     getSelect:
183  #
184  #     @param fmName
185  #     @param elName
186  #     @param value
187  #     @param inputtype
188  #     @param lang_str
189  #     @param required
190  #     @param optpl
191  #     @param enabled
192  #     @param REQUEST          Http-Request
193  #     @param css              CSS-Class
194  #     @return String
195  # ----------------------------------------------------------------------------
196  def getSelect(self, fmName, elName, value, inputtype, lang_str, required, optpl, enabled, REQUEST, css='form-element', maxlen=30):
197    return self.f_selectInput(self,fmName=fmName,elName=elName,value=value,type=inputtype,lang_str=lang_str,required=required,optpl=optpl,maxlen=maxlen,enabled=enabled,css=css,REQUEST=REQUEST)
198
199
200  # ----------------------------------------------------------------------------
201  #     getCheckbox:
202  #
203  #     @param fmName
204  #     @param elName
205  #     @param elId
206  #     @param value
207  #     @param enabled
208  #     @param hidden           Add hidden Input-Field if not enabled
209  #     @param REQUEST          Http-Request
210  #     @param css              CSS-Class
211  #     @param extra            Extra-Parameters
212  #     @return String
213  # ----------------------------------------------------------------------------
214  def getCheckbox(self, fmName, elName, elId=None, value=None, enabled=True, hidden=True, REQUEST=None, css='form-checkbox', extra=''):
215    html = []
216    checked = str(value) == '1'
217    if elName.find(':int') > 0 and value in [True, False]:
218      value = int(value)
219    html.append('<input ')
220    html.append(' type="hidden"')
221    html.append(' name="%s"'%elName)
222    html.append(' value="%s"'%str(value))
223    html.append(' />')
224    html.append('<input ')
225    if type(elId) is str:
226      html.append(' id="%s"'%elId)
227    html.append(' class="%s"'%css)
228    html.append(' type="checkbox"')
229    if not enabled:
230      html.append(' disabled="disabled"')
231    if checked:
232      html.append(' checked="checked"')
233    html.append(' onclick="if (this.checked){$(\'input[name=\\x22%s\\x22]\',this.form).val(1)}else{$(\'input[name=\\x22%s\\x22]\',this.form).val(0)}"'%(elName,elName))
234    html.append(' />')
235    return ''.join(html)
236
237
238  # ----------------------------------------------------------------------------
239  #     getTextArea:
240  #
241  #     @param fmName
242  #     @param elName
243  #     @param cols
244  #     @param rows
245  #     @param value
246  #     @param enabled
247  #     @param REQUEST          Http-Request
248  #     @param css              CSS-Class
249  #     @param wrap             Word-Wrap (on|off)
250  #     @param extra            Extra-Parameters
251  #     @return String
252  # ----------------------------------------------------------------------------
253  def getTextArea(self, fmName, elName, cols, rows, value, enabled, REQUEST, css='form-element', wrap='virtual', extra=''):
254    lang = REQUEST.get('lang')
255    html = []
256    html.append('<textarea ')
257    html.append(' class="%s"'%css)
258    html.append(' id="%s"'%elName)
259    html.append(' name="%s"'%elName)
260    if cols:
261      html.append(' cols="%i"'%cols)
262    if rows:
263      html.append(' rows="%i"'%rows)
264    html.append(' wrap="%s"'%wrap)
265    if extra.find('style=') < 0:
266      styles = []
267      if cols:
268        styles.append( 'width:%iem'%cols)
269      else:
270        styles.append( 'width:80%')
271      html.append(' style="%s"'%(';'.join(styles)))
272    if not enabled:
273      html.append(' disabled="disabled"')
274    html.append('%s>'%extra)
275    if value is not None:
276      if type(value) is list:
277        for item in value:
278          html.append('%s\n'%_globals.html_quote(item))
279      else:
280        html.append('%s'%_globals.html_quote(value))
281    html.append('</textarea>')
282    if type(value) is str and not REQUEST.get('URL','').find('manage_customize') >= 0:
283      inline_links = []
284      # Inline-links: getLinkUrl (deprecated!)
285      i = -1
286      start = '{$'
287      end = '}'
288      while True:
289        i = value.find( start, i + 1)
290        j = value.find( end, i + len( start))
291        if i < 0 or j < 0:
292          break
293        inline_links.append( value[i:j+1])
294      # Inline-links: relative
295      i = -1
296      start = 'href="./'
297      end = '"'
298      while True:
299        i = value.find( start, i + 1)
300        j = value.find( end, i + len( start))
301        if i < 0 or j < 0:
302          break
303        href = value[ i + len( start) :j]
304        if href.rfind( '#') > 0:
305          if href.rfind( '/') > 0:
306            href = href[ :href.rfind( '/')] + '/' + href[ href.rfind( '#') + 1:]
307          else:
308            href = href[ href.rfind( '#') + 1:]
309        else:
310          if href.rfind( '/') > 0:
311            href = href[ :href.rfind( '/')]
312          else:
313            href = ''
314        ref_obj = self.getSelf( self.PAGES)
315        for el in href.split( '/'):
316          if ref_obj is not None:
317            if el == '..':
318              ref_obj = ref_obj.aq_parent
319            elif len( el) > 0:
320              ref_obj = getattr( ref_obj, el, None)
321        if ref_obj is None:
322          ref_url = '{$__' + href.split( '/')[ -1] + '__}'
323          inline_links.append( ref_url)
324        elif isinstance( ref_obj, _zreferableitem.ZReferableItem):
325          inline_links.append( self.getRefObjPath( ref_obj))
326      if len( inline_links) > 0:
327        html.append('<table cellspacing="0" cellpadding="1" border="0" align="left">')
328        html.append('<tr valign="top">')
329        html.append('<td class="form-small" align="left"><b>%s</b>:</td>'%(self.getZMILangStr('ATTR_TARGET')))
330        html.append('<td class="form-small" align="left">')
331        for c in range( len( inline_links)):
332          if c % 2 == 0:
333            html.append('<div class="zmiTableRowEven">')
334          else:
335            html.append('<div class="zmiTableRowOdd">')
336          html.append('<div class="form-small">')
337          ref_url = inline_links[c]
338          ref_obj = self.getLinkObj(ref_url,REQUEST)
339          if ref_obj is not None:
340            html.append('<img src="%sinternal_link.gif" border="0" align="absmiddle"/> %s'%(self.MISC_ZMS,ref_obj.f_breadcrumbs(objectPathElements=ref_obj.breadcrumbs_obj_path(),no_icon=1,lang=lang,REQUEST=REQUEST)))
341          elif isinstance( ref_obj, _zreferableitem.ZReferableItem):
342            html.append('<img src="%sinternal_link_broken.gif" border="0" align="absmiddle"/> %s'%(self.MISC_ZMS,ref_url))
343          html.append('</div>')
344          html.append('</div>')
345        html.append('</td>')
346        html.append('</tr>')
347        html.append('</table>')
348    return ''.join(html)
349
350################################################################################
Note: See TracBrowser for help on using the repository browser.