cl-ds / data /repos /cl-forms /src /fields /subform.lisp
j14i's picture
3375 CL macro transformation examples from 85 libraries
43203b4 verified
(in-package :cl-forms)
(defclass subform-form-field (form-field)
((subform-builder :initarg :subform-builder
:initform nil
:type (or null function)
:accessor field-subform-builder)
(subform :initarg :subform
:initform nil
:type (or null symbol)
:accessor field-subform-name))
(:documentation "A field that contains a form (subform)"))
(defmethod subform-builder ((field subform-form-field))
(or (field-subform-builder field)
(get (field-subform-name field) :form)
(error "Cannot build the subform in ~s" field)))
(defmethod field-subform ((field subform-form-field))
(funcall (subform-builder field)))
(defmethod make-form-field ((field-type (eql :subform)) &rest args)
(apply #'make-instance 'subform-form-field args))
(defmethod field-read-from-request ((field subform-form-field) form parameters)
(let ((field-subform (field-subform field)))
(loop for field in (form-fields field-subform)
do (field-read-from-request (cdr field) form
parameters))
(setf (field-value field) field-subform)))
(defmethod field-add-to-path ((form-field subform-form-field) form &optional (path *field-path*))
(cons (string-downcase (string (field-name form-field)))
path))