/** * Renders an edit form for a slot * * @param sfSympalContent $content The content on which the slot should be rendered * @param sfSympalContentSlot $slot The slot to render in a form * @param array $options An options array. Available options include: * * edit_mode * */ function get_sympal_content_slot_editor($content, $slot, $options = array()) { $slot->setContentRenderedFor($content); // merge in some global default slot options $options = array_merge(array('edit_mode' => sfSympalConfig::get('inline_editing', 'default_edit_mode'), 'view_url' => url_for('sympal_content_slot_view', array('id' => $slot->id, 'content_id' => $slot->getContentRenderedFor()->id))), $options); // merge the default config for this slot into the given config $slotOptions = sfSympalConfig::get($slot->getContentRenderedFor()->Type->slug, 'content_slots', array()); if (isset($slotOptions[$slot->name])) { $options = array_merge($slotOptions[$slot->name], $options); } /* * Finally, override the "type" option, it should be set to whatever's * in the database, regardless of what the original slot options were */ $options['type'] = $slot->type; /* * Give the slot a default value if it's blank. * * @todo Move this somewhere where it can be specified on a type-by-type * basis (e.g., if we had an "image" content slot, it might say * "Click to choose image" */ $renderedValue = $slot->render(); if (!$renderedValue) { $renderedValue = __('[Hover over and click edit to change.]'); } $inlineContent = sprintf('<a href="%s" class="sympal_slot_button">' . __('Edit') . '</a>', url_for('sympal_content_slot_form', array('id' => $slot->id, 'content_id' => $slot->getContentRenderedFor()->id))); $inlineContent .= sprintf('<span class="sympal_slot_content">%s</span>', $renderedValue); return sprintf('<span class="sympal_slot_wrapper %s" id="sympal_slot_wrapper_%s">%s</span>', htmlentities(json_encode($options)), $slot->id, $inlineContent); }
function get_sympal_content_slot_editor(sfSympalContent $content, sfSympalContentSlot $slot, $options = array()) { $content->setEditableSlotsExistOnPage(true); $slot->setContentRenderedFor($content); $name = $slot->getName(); $isColumn = $slot->getIsColumn(); $form = $slot->getEditForm(); $renderedValue = $slot->render(); if (!$renderedValue && sfSympalContext::getInstance()->shouldLoadFrontendEditor()) { $renderedValue = __('[Double click to enable inline edit mode.]'); } return ' <span title="' . __('[Double click to enable inline edit mode.]') . '" id="sympal_content_slot_' . $slot->getId() . '" class="sympal_content_slot"> <input type="hidden" class="content_slot_id" value="' . $slot->getId() . '" /> <input type="hidden" class="content_id" value="' . $slot->getContentRenderedFor()->getId() . '" /> <span class="editor">' . get_partial('sympal_edit_slot/slot_editor', array('form' => $form, 'contentSlot' => $slot)) . '</span> <span class="value toggle_edit_mode">' . $renderedValue . '</span> </span>'; }
/** * Renders the actual form that edits a content slot * * @param sfSympalContent $content The content record being modified * @param sfSympalContentSlot $slot The content slot to edit * * @return string */ function get_sympal_content_slot_form($content, $slot) { $slot->setContentRenderedFor($content); $form = $slot->getEditForm(); return get_partial('sympal_edit_slot/slot_editor', array('form' => $form, 'contentSlot' => $slot)); }
/** * Retrieves or creates an sfSympalContentSlot object with the given * name for this sfSympalContent object * * @return sfSympalContentSlot */ public function getOrCreateSlot($name, $options = array()) { if (!($hasSlot = $this->hasSlot($name))) { $isColumn = $this->hasField($name) ? true : false; // if type isn't specified, give it a type of Column or Text if (isset($options['type'])) { $type = $options['type']; } else { $type = $isColumn ? 'Column' : 'Text'; } if (!$isColumn && $type == 'Column') { throw new sfException('Cannot set a non-column slot to type "Column"'); } $slot = new sfSympalContentSlot(); $slot->setContentRenderedFor($this); $slot->is_column = $isColumn; $slot->name = $name; $slot->type = $type; if (isset($options['default_value'])) { $slot->value = $options['default_value']; } $slot->save(); $this->addSlot($slot); } else { $slot = $this->getSlot($name); } $slot->setContentRenderedFor($this); return $slot; }
<?php $app = 'sympal'; require_once dirname(__FILE__) . '/../../bootstrap/unit.php'; $t = new lime_test(7); $sympal_configuration = $plugin_configuration->getSympalConfiguration(); $content = sfSympalContent::createNew('sfSympalPage'); $slotRenderer = new sfSympalSlotRenderer($sympal_configuration); $t->info('1 - Test renderSlotByName()'); $t->is($content->getEditableSlotsExistOnPage(), false, '->getEditableSlotsExistOnPage() on Content begins as false'); $value = $slotRenderer->renderSlotByName('title', $content, array('edit_mode' => 'test', 'default_value' => 'testing default')); $t->is($content->getEditableSlotsExistOnPage(), true, '->getEditableSlotsExistOnPage() is true after rendering a slot'); $t->is($slotRenderer->getOption('fake', 'default'), 'default', '->getOption() returns the default value if the option does not exist'); $t->is($slotRenderer->getOption('edit_mode', 'default'), 'test', '->getOption() returns the correct option value'); $t->is($value, 'testing default', 'Renders the default value we passed via default_value'); $content->title = 'testing'; $value = $slotRenderer->renderSlotByName('title', $content, array('edit_mode' => 'test')); $t->is($value, 'testing', 'Renders "testing" once we set its value to testing'); $t->info('2 - Test ->renderSlot()'); $slot = new sfSympalContentSlot(); $slot->name = 'body'; $slot->is_column = false; $slot->value = 'testing body value'; $slot->setContentRenderedFor($content); $value = $slotRenderer->renderSlot($slot); $t->is($value, 'testing body value', '->renderSlot() returns the correct value');