/** * This tool generates an inline editor to edit the content or attribute of a stream. * @class Streams inplace * @constructor * @param {array} $options Options for the tool * An associative array of parameters, containing: * @param {string} [$options.inplaceType='textarea'] The type of the fieldInput. Can be "textarea" or "text" * @param {array} [$options.convert] The characters to convert to HTML. Pass an array containing zero or more of "\n", " " * @param {Streams_Stream} $options.stream A Streams_Stream object * @param {string} [$options.field] Optional, name of an field to change instead of the content of the stream * @param {string} [$options.attribute] Optional, name of an attribute to change instead of any field. * @param {string} [$options.beforeSave] Reference to a callback to call after a successful save. This callback can cancel the save by returning false. * @param {string} [$options.onSave] Reference to a callback or event to run after a successful save. * @param {string} [$options.onCancel] Reference to a callback or event to run after cancel. * @param {array} [$options.inplace=array()] Additional fields to pass to the child Q/inplace tool, if any * @uses Q inplace */ function Streams_inplace_tool($options) { if (empty($options['stream'])) { if (empty($options['publisherId']) or empty($options['streamName'])) { throw new Q_Exception_RequiredField(array('field' => 'stream')); } $publisherId = $options['publisherId']; $streamName = $options['streamName']; $stream = Streams::fetchOne(null, $publisherId, $streamName); if (!$stream) { throw new Q_Exception_MissingRow(array('table' => 'stream', 'criteria' => "publisherId={$publisherId}, name={$streamName}")); } } else { $stream = $options['stream']; } $inplaceType = Q::ifset($options, 'inplaceType', 'textarea'); $inplace = array('action' => $stream->actionUrl(), 'method' => 'PUT', 'type' => $inplaceType); if (isset($options['inplace'])) { $inplace = array_merge($options['inplace'], $inplace); } $convert = Q::ifset($options, 'convert', array("\n")); $inplace['hidden']['convert'] = json_encode($convert); if (!empty($options['attribute'])) { $field = 'attributes[' . urlencode($options['attribute']) . ']'; $content = $stream->get($options['attribute'], ''); $maxlength = $stream->maxSize_attributes - strlen($stream->maxSize_attributes) - 10; } else { $field = !empty($options['field']) ? $options['field'] : 'content'; $content = $stream->{$field}; $maxlength = $stream->maxSizeExtended($field); } switch ($inplaceType) { case 'text': $inplace['fieldInput'] = Q_Html::input($field, $content, array('placeholder' => Q::ifset($input, 'placeholder', null), 'maxlength' => $maxlength)); $inplace['staticHtml'] = Q_Html::text($content); break; case 'textarea': $inplace['fieldInput'] = Q_Html::textarea($field, 5, 80, array('placeholder' => Q::ifset($inplace, 'placeholder', null), 'maxlength' => $maxlength), $content); $inplace['staticHtml'] = Q_Html::text($content, $convert); break; default: return "inplaceType must be 'textarea' or 'text'"; } if (!$stream->testWriteLevel('suggest')) { if (!isset($options['classes'])) { $options['classes'] = ''; } Q_Response::setToolOptions(array('publisherId' => $stream->publisherId, 'streamName' => $stream->name)); $staticClass = $options['inplaceType'] === 'textarea' ? 'Q_inplace_tool_blockstatic' : 'Q_inplace_tool_static'; return "<span class='Q_inplace_tool_container {$options['classes']}' style='position: relative;'>" . "<div class='{$staticClass}'>{$inplace['staticHtml']}</div></span>"; } $toolOptions = array('publisherId' => $stream->publisherId, 'streamName' => $stream->name, 'inplaceType' => $options['inplaceType']); Q::take($options, array('attribute', 'field', 'convert'), $toolOptions); $toolOptions['inplace'] = $inplace; Q_Response::setToolOptions($toolOptions); return Q::tool("Q/inplace", $inplace); }