1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/limesurvey_ynh.git synced 2024-09-03 19:36:32 +02:00
limesurvey_ynh/sources/application/extensions/bootstrap/widgets/TbExtendedTooltip.php

177 lines
No EOL
4.6 KiB
PHP

<?php
/**
* TbExtendedTooltip class
*
* @author: antonio ramirez <antonio@clevertech.biz>
* Date: 10/18/12
* Time: 5:53 PM
*/
class TbExtendedTooltip extends CWidget
{
/**
* @var string the name of the table for keeping applied migration information.
* This table will be automatically created if not exists. Defaults to 'tbl_tooltip'.
* The table structure is: (key varchar(255) primary key, tooltip varchar(255))
*/
public $tooltipTable = 'tbl_tooltip';
/**
* @var string the application component ID that specifies the database connection for
* storing tooltip information. Defaults to 'db'.
*/
public $connectionID = 'db';
/**
* @var string the tooltip
*/
public $key;
/**
* @var string the text to display on the tooltip if no value has been found
*/
public $emptyTooltipText = 'empty';
/**
* @var bool whether the tooltip should be editable or not
*/
public $editable = true;
/**
* @var string the type of editable form. Possible values
*/
public $editableType = 'textarea';
/**
* @var string the popup placement of the tooltip editor. Possible values: right | left | top | bottom.
*/
public $editablePopupPlacement = 'right';
/**
* @var string the url to call
*/
public $url;
/**
* @var CDbConnection
*/
private $_db;
/**
* Widget's initialization
* @throws CException
*/
public function init()
{
if ($this->key === null)
throw new CException(Yii::t('zii', '"{attribute}" cannnot be null', array('{attribute}' => 'key')));
if ($this->url === null && $this->editable)
throw new CException(Yii::t('zii', '"url" cannot be null if tooltip is required to be edited'));
}
/**
* Widget's run
*/
public function run()
{
$this->renderContent();
$this->registerClientScript();
}
/**
* Renders the HTML tag element that renders
*/
protected function renderContent()
{
echo CHtml::openTag('span', array('rel' => 'editable-tooltip', 'title' => $this->getTooltip($this->key), 'name' => $this->key));
if (!$this->editable)
{
// the bootstrap-editable-tooltip plugin, renders the icon automatically
echo '<i class="icon-info-sign"></i>';
}
echo '</span>';
}
/**
* Registers the
*/
protected function registerClientScript()
{
// register common javascript
// any AJAX updated content with editable tooltips should be handled by the coder
// coding a call
// if not editable, just render the tooltip
if (!$this->editable)
{
// not editable, just make the tooltip
$js = "$('span[name=\"{$this->key}\"]').tooltip();";
} else
{
// editable, make use of bootstrap-editable-tooltip plugin
Yii::app()->bootstrap->registerAssetCss('bootstrap-editable-tooltip.css');
Yii::app()->bootstrap->registerAssetJs('bootstrap-editable-tooltip.js');
$options = CJavaScript::encode(array(
'send' => 'always',
'url' => $this->url,
'placement' => $this->editablePopupPlacement
));
$js = "$('span[name=\"{$this->key}\"]').editableTooltip($options);";
}
Yii::app()->clientScript->registerScript(__CLASS__.'#'.$this->getId(), $js);
}
/**
* Returns the tooltip stored at the database.
* @param $key
* @return mixed|string emptyTool
*/
protected function getTooltip($key)
{
$db = $this->getDbConnection();
if ($db->schema->getTable($this->tooltipTable) === null)
{
$this->createTooltipsTable();
return $this->emptyTooltipText;
}
$tip = $db->createCommand()
->select('tooltip')
->from($this->tooltipTable)
->where('tooltip_key=:key', array(':key' => $key))
->queryScalar();
return !$tip ? $this->emptyTooltipText : $tip;
}
/**
* Returns the currently active database connection.
* By default, the 'db' application component will be returned and activated.
* You can call {@link setDbConnection} to switch to a different database connection.
* Methods such as {@link insert}, {@link createTable} will use this database connection
* to perform DB queries.
* @return CDbConnection the currently active database connection
*/
protected function getDbConnection()
{
if ($this->_db === null)
{
$this->_db = Yii::app()->getComponent($this->connectionID);
if (!$this->_db instanceof CDbConnection)
throw new CException(Yii::t('zii', 'The "db" application component must be configured to be a CDbConnection object.'));
}
return $this->_db;
}
/**
* Creates the database table to store all edited tooltips
*/
protected function createTooltipsTable()
{
$db = $this->getDbConnection();
$db->createCommand()->createTable($this->tooltipTable, array(
'tooltip_key' => 'string NOT NULL PRIMARY KEY',
'tooltip' => 'string',
));
}
}