261 lines
10 KiB
PHP
261 lines
10 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace eftec\bladeone;
|
||
|
|
||
|
/**
|
||
|
* trait BladeOneHtmlBootstrap
|
||
|
* Copyright (c) 2016 Jorge Patricio Castro Castillo MIT License. Don't delete this comment, its part of the license.
|
||
|
* Extends the tags of the class BladeOne. Its optional
|
||
|
* It adds the next tags
|
||
|
* <code>
|
||
|
* select:
|
||
|
* @ select('idCountry','value',[,$extra])
|
||
|
* @ item('0','--select a country'[,$extra])
|
||
|
* @ items($countries,'id','name',$currentCountry[,$extra])
|
||
|
* @ endselect()
|
||
|
* input:
|
||
|
* @ input('iduser',$currentUser,'text'[,$extra])
|
||
|
* button:
|
||
|
* @ commandbutton('idbutton','value','text'[,$extra])
|
||
|
*
|
||
|
* </code>
|
||
|
* Note. The names of the tags are based in Java Server Faces (JSF)
|
||
|
*
|
||
|
* @package BladeOneHtmlBootstrap
|
||
|
* @version 1.9.1 2018-06-11 (1)
|
||
|
* @link https://github.com/EFTEC/BladeOne
|
||
|
* @author Jorge Patricio Castro Castillo <jcastro arroba eftec dot cl>
|
||
|
* @deprecated use https://github.com/eftec/BladeOneHtml
|
||
|
*/
|
||
|
trait BladeOneHtmlBootstrap
|
||
|
{
|
||
|
use BladeOneHtml {
|
||
|
BladeOneHtml::select as selectParent;
|
||
|
BladeOneHtml::input as inputParent;
|
||
|
BladeOneHtml::commandButton as commandButtonParent;
|
||
|
BladeOneHtml::textArea as textAreaParent;
|
||
|
BladeOneHtml::item as itemParent;
|
||
|
BladeOneHtml::checkbox as checkboxParent;
|
||
|
BladeOneHtml::compileEndCheckbox as compileEndCheckboxParent;
|
||
|
BladeOneHtml::radio as radioParent;
|
||
|
BladeOneHtml::compileEndRadio as compileEndRadioParent;
|
||
|
}
|
||
|
|
||
|
//<editor-fold desc="Override methods">
|
||
|
public function select($name, $value, $extra = '')
|
||
|
{
|
||
|
$extra = $this->addClass($extra, 'form-control');
|
||
|
return $this->selectParent($name, $value, $extra);
|
||
|
}
|
||
|
|
||
|
public function input($id, $value = '', $type = 'text', $extra = '')
|
||
|
{
|
||
|
$extra = $this->addClass($extra, 'form-control');
|
||
|
return $this->inputParent($id, $value, $type, $extra);
|
||
|
}
|
||
|
|
||
|
public function commandButton($id, $value = '', $text = 'Button', $type = 'submit', $extra = '')
|
||
|
{
|
||
|
$extra = $this->addClass($extra, 'btn');
|
||
|
return $this->commandButtonParent($id, $value, $text, $type, $extra);
|
||
|
}
|
||
|
|
||
|
public function textArea($id, $value = '', $extra = '')
|
||
|
{
|
||
|
$extra = $this->addClass($extra, 'form-control');
|
||
|
return $this->textAreaParent($id, $value, $extra);
|
||
|
}
|
||
|
|
||
|
|
||
|
public function file($id, $fullfilepath = '', $file = '', $extra = '')
|
||
|
{
|
||
|
return "<input id='" . static::e($id) . "_file' name='" . static::e($id) . "_file' type='hidden' value='" . static::e($file) . "' />
|
||
|
<div class='input-group'>
|
||
|
<label class='input-group-btn'>
|
||
|
<span class='btn btn-primary'>
|
||
|
Browse…<a href='$fullfilepath' class='afile' ><i class='fa fa-paperclip'></i></a>
|
||
|
<input type='file' style='display: none;' id='" . static::e($id) . "' name='" . static::e($id) . "' $extra />
|
||
|
</span>
|
||
|
</label>
|
||
|
<input type='text' class='form-control' readonly></div>";
|
||
|
// return "<a href='$fullfilepath'>$file</a>
|
||
|
//<input id='".static::e($id)."_file' name='".static::e($id)."_file' type='hidden' value='".static::e($file)."' />
|
||
|
// <input id='".static::e($id)."' name='".static::e($id)."' type='file' ".$this->convertArg($extra)." value='".static::e($fullfilepath)."' />\n";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $id of the field
|
||
|
* @param string $fullfilepath full file path of the image
|
||
|
* @param string $file filename of the file
|
||
|
* @param string $extra extra field of the input file
|
||
|
* @return string html
|
||
|
*/
|
||
|
public function image($id, $fullfilepath = '', $file = '', $extra = '')
|
||
|
{
|
||
|
return "<input id='" . static::e($id) . "_file' name='" . static::e($id) . "_file' type='hidden' value='" . static::e($file) . "' />
|
||
|
<img src='$fullfilepath' class='img-thumbnail' />
|
||
|
<div class='input-group'>
|
||
|
|
||
|
<label class='input-group-btn'>
|
||
|
<span class='btn btn-primary'>
|
||
|
Browse…
|
||
|
<input type='file' style='display: none;' id='" . static::e($id) . "' name='" . static::e($id) . "' $extra />
|
||
|
</span>
|
||
|
</label>
|
||
|
<input type='text' class='form-control' readonly></div>";
|
||
|
// return "<a href='$fullfilepath'>$file</a>
|
||
|
//<input id='".static::e($id)."_file' name='".static::e($id)."_file' type='hidden' value='".static::e($file)."' />
|
||
|
// <input id='".static::e($id)."' name='".static::e($id)."' type='file' ".$this->convertArg($extra)." value='".static::e($fullfilepath)."' />\n";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $type type of the current open tag
|
||
|
* @param array|string $valueId if is an array then the first value is used as value, the second is used as
|
||
|
* extra
|
||
|
* @param $valueText
|
||
|
* @param array|string $selectedItem Item selected (optional)
|
||
|
* @param string $wrapper Wrapper of the element. For example, <li>%s</li>
|
||
|
* @param string $extra
|
||
|
* @return string
|
||
|
* @internal param string $fieldId Field of the id
|
||
|
* @internal param string $fieldText Field of the value visible
|
||
|
*/
|
||
|
public function item($type, $valueId, $valueText, $selectedItem = '', $wrapper = '', $extra = '')
|
||
|
{
|
||
|
$id = @\end($this->htmlCurrentId);
|
||
|
$wrapper = ($wrapper == '') ? '%s' : $wrapper;
|
||
|
|
||
|
if (\is_array($selectedItem)) {
|
||
|
$found = \in_array($valueId, $selectedItem);
|
||
|
} else {
|
||
|
if (\is_null($selectedItem)) {
|
||
|
// diferentiate null = '' != 0
|
||
|
$found = $valueId === '' || $valueId === null;
|
||
|
} else {
|
||
|
$found = $selectedItem == $valueId;
|
||
|
}
|
||
|
}
|
||
|
$valueHtml = (!\is_array($valueId)) ? "value='{$valueId}'" : "value='{$valueId[0]}' data='{$valueId[1]}'";
|
||
|
switch ($type) {
|
||
|
case 'select':
|
||
|
$selected = ($found) ? 'selected' : '';
|
||
|
return \sprintf($wrapper, "<option $valueHtml $selected " .
|
||
|
$this->convertArg($extra) . ">{$valueText}</option>\n");
|
||
|
break;
|
||
|
case 'radio':
|
||
|
$selected = ($found) ? 'checked' : '';
|
||
|
return \sprintf($wrapper, "<label><input type='radio' id='" . static::e($id)
|
||
|
. "' name='" . static::e($id) . "' $valueHtml $selected "
|
||
|
. $this->convertArg($extra) . "> {$valueText}</label>\n");
|
||
|
break;
|
||
|
case 'checkbox':
|
||
|
$selected = ($found) ? 'checked' : '';
|
||
|
return \sprintf($wrapper, "<label><input type='checkbox' id='" . static::e($id)
|
||
|
. "' name='" . static::e($id) . "' $valueHtml $selected "
|
||
|
. $this->convertArg($extra) . "> {$valueText}</label>\n");
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return '???? type undefined: [$type] on @item<br>';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function checkbox($id, $value = '', $text = '', $valueSelected = '', $extra = '')
|
||
|
{
|
||
|
$num = \func_num_args();
|
||
|
if ($num > 2) {
|
||
|
if ($value == $valueSelected) {
|
||
|
if (\is_array($extra)) {
|
||
|
$extra['checked'] = 'checked';
|
||
|
} else {
|
||
|
$extra .= ' checked="checked"';
|
||
|
}
|
||
|
}
|
||
|
//return '<div class="checkbox"><label>'.$this->inputParent($id, $value, 'checkbox', $extra) . ' ' . $text.'</label></div>';
|
||
|
return '<div><label>' . $this->inputParent($id, $value, 'checkbox', $extra) . ' ' . $text . '</label></div>';
|
||
|
} else {
|
||
|
\array_push($this->htmlCurrentId, $id);
|
||
|
return '<div>';
|
||
|
//return '<div class="checkbox">';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function radio($id, $value = '', $text = '', $valueSelected = '', $extra = '')
|
||
|
{
|
||
|
$num = \func_num_args();
|
||
|
if ($num > 2) {
|
||
|
if ($value == $valueSelected) {
|
||
|
if (\is_array($extra)) {
|
||
|
$extra['checked'] = 'checked';
|
||
|
} else {
|
||
|
$extra .= ' checked="checked"';
|
||
|
}
|
||
|
}
|
||
|
return '<div class="radio"><label>' . $this->inputParent($id, $value, 'radio', $extra) . ' ' . $text . '</label></div>';
|
||
|
} else {
|
||
|
\array_push($this->htmlCurrentId, $id);
|
||
|
return '<div class="radio">';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function compileEndCheckbox()
|
||
|
{
|
||
|
$r = $this->compileEndCheckboxParent();
|
||
|
$r .= '</div>';
|
||
|
return $r;
|
||
|
}
|
||
|
|
||
|
public function compileEndRadio()
|
||
|
{
|
||
|
$r = $this->compileEndRadioParent();
|
||
|
$r .= '</div>';
|
||
|
return $r;
|
||
|
}
|
||
|
//</editor-fold>
|
||
|
|
||
|
//<editor-fold desc="Misc members">
|
||
|
|
||
|
/**
|
||
|
* It adds a class to a html tag parameter
|
||
|
*
|
||
|
* @example addClass('type="text" class="btn","btn-standard")
|
||
|
* @param string|array $txt
|
||
|
* @param string $newclass The class(es) to add, example "class1" or "class1 class"
|
||
|
* @return string|array
|
||
|
*/
|
||
|
protected function addClass($txt, $newclass)
|
||
|
{
|
||
|
if (\is_array($txt)) {
|
||
|
$txt = \array_change_key_case($txt);
|
||
|
@$txt['class'] = ' ' . $newclass;
|
||
|
return $txt;
|
||
|
}
|
||
|
$p0 = \stripos(' ' . $txt, ' class');
|
||
|
if ($p0 === false) {
|
||
|
// if the content of the tag doesn't contain a class then it adds one.
|
||
|
return $txt . ' class="' . $newclass . '"';
|
||
|
}
|
||
|
// the class tag exists so we found the closes character ' or " and we add the class (or classes) inside it
|
||
|
// may be it could duplicates the tag.
|
||
|
$p1 = \strpos($txt, "'", $p0);
|
||
|
$p2 = \strpos($txt, '"', $p0);
|
||
|
$p1 = ($p1 === false) ? 99999 : $p1;
|
||
|
$p2 = ($p2 === false) ? 99999 : $p2;
|
||
|
|
||
|
if ($p1 < $p2) {
|
||
|
return \substr_replace($txt, $newclass . ' ', $p1 + 1, 0);
|
||
|
} else {
|
||
|
echo $p2 . "#";
|
||
|
return \substr_replace($txt, $newclass . ' ', $p2 + 1, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected function separatesParam($txt)
|
||
|
{
|
||
|
$result = [];
|
||
|
\preg_match_all("~\"[^\"]++\"|'[^']++'|\([^)]++\)|[^,]++~", $txt, $result);
|
||
|
return $result;
|
||
|
}
|
||
|
//</editor-fold>
|
||
|
}
|