Class luya\yii\helpers\ExportHelper
Inheritance | luya\yii\helpers\ExportHelper |
---|---|
Subclasses | luya\helpers\ExportHelper |
Available since version | 1.0.0 |
Source Code | https://github.com/luyadev/yii-helpers/blob/master/src/helpers/ExportHelper.php |
Exporting into Formats.
Public Methods
Method | Description | Defined By |
---|---|---|
csv() | Export an Array or QueryInterface instance into a CSV formated string. | luya\yii\helpers\ExportHelper |
sanitizeValue() | Sanitize Certain Values to increase security from user generated output. | luya\yii\helpers\ExportHelper |
xlsx() | Export an Array or QueryInterface instance into a Excel formatted string. | luya\yii\helpers\ExportHelper |
Protected Methods
Method | Description | Defined By |
---|---|---|
generateContentArray() | Generate content by rows. | luya\yii\helpers\ExportHelper |
generateOutputString() | Generate the output string with delimiters. | luya\yii\helpers\ExportHelper |
generateRow() | Generate a row by its items. | luya\yii\helpers\ExportHelper |
transformInput() | Check type of input and return correct array. | luya\yii\helpers\ExportHelper |
Method Details
Export an Array or QueryInterface instance into a CSV formated string.
public static string csv ( $input, array $keys = [], $header = true, array $options = [] ) | ||
$input | array|yii\db\QueryInterface |
The data to export into a csv |
$keys | array |
Defines which keys should be packed into the generated CSV. The defined keys does not change the sort behavior of the generated csv. |
$header | boolean |
Whether the column name should be set as header inside the csv or not. |
$options | array |
Options
|
return | string |
The generated CSV as string. |
---|
public static function csv($input, array $keys = [], $header = true, array $options = [])
{
$delimiter = ",";
$input = self::transformInput($input);
$array = self::generateContentArray($input, $keys, $header, $options);
return self::generateOutputString($array, $delimiter);
}
Generate content by rows.
protected static array generateContentArray ( $contentRows, array $keys, $generateHeader = true, $options = [] ) | ||
$contentRows | array|string | |
$keys | array | |
$generateHeader | boolean | |
$options | array |
Options
|
throws | luya\Exception |
---|
protected static function generateContentArray($contentRows, array $keys, $generateHeader = true, $options = [])
{
if (is_scalar($contentRows)) {
throw new Exception("Content must be either an array, object or traversable.");
}
$attributeKeys = $keys;
$header = [];
$rows = [];
$i = 0;
foreach ($contentRows as $content) {
// handle rows content
if (!empty($keys) && is_array($content)) {
foreach ($content as $k => $v) {
if (!in_array($k, $keys)) {
unset($content[$k]);
}
}
} elseif (!empty($keys) && is_object($content)) {
$attributeKeys[get_class($content)] = $keys;
}
$row = ArrayHelper::toArray($content, $attributeKeys, false);
if (ArrayHelper::getValue($options, 'sort', true)) {
ksort($row);
}
$rows[$i] = $row;
// handle header
if ($i == 0 && $generateHeader) {
if ($content instanceof Model) {
/** @var Model $content */
foreach ($content as $k => $v) {
if (empty($keys)) {
$header[$k] = $content->getAttributeLabel($k);
} elseif (in_array($k, $keys)) {
$header[$k] = $content->getAttributeLabel($k);
}
}
} else {
$header = array_keys($rows[0]);
}
if (ArrayHelper::getValue($options, 'sort', true)) {
ksort($header);
}
}
unset($row);
gc_collect_cycles();
$i++;
}
if ($generateHeader) {
return ArrayHelper::merge([$header], $rows);
}
return $rows;
}
Generate the output string with delimiters.
protected static null|string generateOutputString ( array $input, $delimiter ) | ||
$input | array | |
$delimiter | string |
protected static function generateOutputString(array $input, $delimiter)
{
$output = null;
foreach ($input as $row) {
$output.= self::generateRow($row, $delimiter, '"');
}
return $output;
}
Generate a row by its items.
protected static string generateRow ( array $row, $delimiter, $enclose ) | ||
$row | array | |
$delimiter | string | |
$enclose | string |
protected static function generateRow(array $row, $delimiter, $enclose)
{
array_walk($row, function (&$item) use ($enclose) {
if (is_bool($item)) {
$item = (int) $item;
} elseif (is_null($item)) {
$item = '';
} elseif (!is_scalar($item)) {
$item = "[array]";
}
$item = $enclose.self::sanitizeValue($item).$enclose;
});
return implode($delimiter, $row) . PHP_EOL;
}
Sanitize Certain Values to increase security from user generated output.
See also https://owasp.org/www-community/attacks/CSV_Injection.
public static string sanitizeValue ( $value ) | ||
$value | string |
public static function sanitizeValue($value)
{
$value = str_replace([
'"',
], [
'""',
], trim($value));
$firstChar = substr($value, 0, 1);
if (in_array($firstChar, ['=', '+', '-', '@', PHP_EOL, "\t", "\n"])) {
$value = StringHelper::replaceFirst($firstChar, "'$firstChar", $value);
}
return $value;
}
Check type of input and return correct array.
protected static array transformInput ( $input ) | ||
$input | array|yii\db\QueryInterface |
protected static function transformInput($input)
{
if ($input instanceof QueryInterface) {
return $input->all();
}
return $input;
}
Export an Array or QueryInterface instance into a Excel formatted string.
public static mixed xlsx ( $input, array $keys = [], $header = true, array $options = [] ) | ||
$input | array|yii\db\QueryInterface | |
$keys | array |
Defines which keys should be packed into the generated xlsx. The defined keys does not change the sort behavior of the generated xls. |
$header | boolean | |
$options | array |
Options
|
throws | luya\Exception |
---|
public static function xlsx($input, array $keys = [], $header = true, array $options = [])
{
$input = self::transformInput($input);
$array = self::generateContentArray($input, $keys, $header, $options);
$writer = new XLSXWriter();
$writer->writeSheet($array);
return $writer->writeToString();
}