*/ class Helper { /** * Places item of extra columns into results by care of their order. * * @param array $item * @param array $array * @return array */ public static function includeInArray($item, $array) { if (self::isItemOrderInvalid($item, $array)) { return array_merge($array, [$item['name'] => $item['content']]); } else { $count = 0; $last = $array; $first = []; foreach ($array as $key => $value) { if ($count == $item['order']) { return array_merge($first, [$item['name'] => $item['content']], $last); } unset($last[$key]); $first[$key] = $value; $count++; } } } /** * Check if item order is valid. * * @param array $item * @param array $array * @return bool */ protected static function isItemOrderInvalid($item, $array) { return $item['order'] === false || $item['order'] >= count($array); } /** * Determines if content is callable or blade string, processes and returns. * * @param string|callable $content Pre-processed content * @param array $data data to use with blade template * @param mixed $param parameter to call with callable * @return string Processed content */ public static function compileContent($content, array $data, $param) { if (is_string($content)) { return static::compileBlade($content, static::getMixedValue($data, $param)); } elseif (is_callable($content)) { return $content($param); } return $content; } /** * Parses and compiles strings by using Blade Template System. * * @param string $str * @param array $data * @return string * @throws \Exception */ public static function compileBlade($str, $data = []) { if (view()->exists($str)) { return view($str, $data)->render(); } $empty_filesystem_instance = new Filesystem(); $blade = new BladeCompiler($empty_filesystem_instance, 'datatables'); $parsed_string = $blade->compileString($str); ob_start() && extract($data, EXTR_SKIP); try { eval('?>' . $parsed_string); } catch (\Exception $e) { ob_end_clean(); throw $e; } $str = ob_get_contents(); ob_end_clean(); return $str; } /** * Get a mixed value of custom data and the parameters. * * @param array $data * @param mixed $param * @return array */ public static function getMixedValue(array $data, $param) { $param = self::castToArray($param); foreach ($data as $key => $value) { if (isset($param[$key])) { $data[$key] = $param[$key]; } } return $data; } /** * Cast the parameter into an array. * * @param mixed $param * @return array */ public static function castToArray($param) { if ($param instanceof \stdClass) { $param = (array) $param; return $param; } if ($param instanceof Arrayable) { return $param->toArray(); } return $param; } /** * Get equivalent or method of query builder. * * @param string $method * @return string */ public static function getOrMethod($method) { if (! Str::contains(Str::lower($method), 'or')) { return 'or' . ucfirst($method); } return $method; } /** * Wrap value depending on database type. * * @param string $database * @param string $value * @return string */ public static function wrapDatabaseValue($database, $value) { $parts = explode('.', $value); $column = ''; foreach ($parts as $key) { $column = static::wrapDatabaseColumn($database, $key, $column); } return substr($column, 0, strlen($column) - 1); } /** * Database column wrapper. * * @param string $database * @param string $key * @param string $column * @return string */ public static function wrapDatabaseColumn($database, $key, $column) { switch ($database) { case 'mysql': $column .= '`' . str_replace('`', '``', $key) . '`' . '.'; break; case 'sqlsrv': $column .= '[' . str_replace(']', ']]', $key) . ']' . '.'; break; case 'pgsql': case 'sqlite': $column .= '"' . str_replace('"', '""', $key) . '"' . '.'; break; default: $column .= $key . '.'; } return $column; } /** * Converts array object values to associative array. * * @param mixed $row * @return array */ public static function convertToArray($row) { $data = $row instanceof Arrayable ? $row->toArray() : (array) $row; foreach (array_keys($data) as $key) { if (is_object($data[$key]) || is_array($data[$key])) { $data[$key] = self::convertToArray($data[$key]); } } return $data; } /** * @param array $data * @return array */ public static function transform(array $data) { return array_map(function ($row) { return self::transformRow($row); }, $data); } /** * Transform row data into an array. * * @param mixed $row * @return array */ protected static function transformRow($row) { foreach ($row as $key => $value) { if ($value instanceof DateTime) { $row[$key] = $value->format('Y-m-d H:i:s'); } else { if (is_object($value)) { $row[$key] = (string) $value; } else { $row[$key] = $value; } } } return $row; } /** * Build parameters depending on # of arguments passed. * * @param array $args * @return array */ public static function buildParameters(array $args) { $parameters = []; if (count($args) > 2) { $parameters[] = $args[0]; foreach ($args[1] as $param) { $parameters[] = $param; } } else { foreach ($args[0] as $param) { $parameters[] = $param; } } return $parameters; } /** * Replace all pattern occurrences with keyword * * @param array $subject * @param string $keyword * @param string $pattern * @return array */ public static function replacePatternWithKeyword(array $subject, $keyword, $pattern = '$1') { $parameters = []; foreach ($subject as $param) { if (is_array($param)) { $parameters[] = self::replacePatternWithKeyword($param, $keyword, $pattern); } else { $parameters[] = str_replace($pattern, $keyword, $param); } } return $parameters; } }