dialog = DialogTable::make($this->label); } /** * 设置弹窗标题. * * @param string $title * * @return $this */ public function title($title) { $this->dialog->title($title); return $this; } /** * 设置弹窗宽度. * * @example * $this->width('500px'); * $this->width('50%'); * * @param string $width * * @return $this */ public function dialogWidth(string $width) { $this->dialog->width($width); return $this; } /** * 设置表格异步渲染实例. * * @param LazyRenderable $renderable * * @return $this */ public function from(LazyRenderable $renderable) { $this->dialog->from($renderable); return $this; } /** * 设置选中的key以及标题字段. * * @param $visibleColumn * @param $key * * @return $this */ public function pluck(?string $visibleColumn, ?string $key = 'id') { $this->visibleColumn = $visibleColumn; $this->key = $key; return $this; } /** * 联动加载. * * @param string $field * @param string $sourceUrl * @param string $idField * @param string $textField * * @return $this */ public function load($field, $sourceUrl, string $idField = 'id', string $textField = 'text') { if (Str::contains($field, '.')) { $field = $this->formatName($field); } $class = $this->normalizeElementClass($field); $url = admin_url($sourceUrl); return $this->addVariables(['load' => compact('url', 'class', 'idField', 'textField')]); } /** * 联动加载多个字段. * * @param string $fields * @param string $sourceUrls * @param string $idField * @param string $textField * * @return $this */ public function loads($fields = [], $sourceUrls = [], string $idField = 'id', string $textField = 'text') { $fieldsStr = implode('^', array_map(function ($field) { if (Str::contains($field, '.')) { return $this->normalizeElementClass($field).'_'; } return $this->normalizeElementClass($field); }, (array) $fields)); $urlsStr = implode('^', array_map(function ($url) { return admin_url($url); }, (array) $sourceUrls)); return $this->addVariables(['loads' => [ 'fields' => $fieldsStr, 'urls' => $urlsStr, 'idField' => $idField, 'textField' => $textField, ]]); } /** * @param array $options * * @return $this */ public function options($options = []) { $this->options = $options; return $this; } /** * 设置选中数据显示. * * @param string $model * @param string $id * @param string $text * * @return $this */ public function model(string $model, string $id = 'id', string $text = 'title') { return $this->pluck($text, $id)->options(function ($v) use ($model, $id, $text) { if (! $v) { return []; } return $model::find($v)->pluck($text, $id); }); } protected function formatOptions() { $value = Helper::array($this->value()); if ($this->options instanceof \Closure) { $this->options = $this->options->call($this->values(), $value, $this); } $values = []; foreach (Helper::array($this->options) as $id => $label) { foreach ($value as $v) { if ($v == $id && $v !== null) { $values[] = ['id' => $v, 'label' => $label]; } } } $this->options = $values; } protected function setUpTable() { $this->dialog ->footer($this->renderFooter()) ->button($this->renderButton()); // 设置选中的字段和待显示的标题字段 $this->dialog ->getTable() ->getRenderable() ->payload([ LazyRenderable::ROW_SELECTOR_COLUMN_NAME => [$this->key, $this->visibleColumn], ]); } public function render() { $this->setUpTable(); $this->formatOptions(); $this->prepend('') ->defaultAttribute('class', 'form-control '.$this->getElementClassString()) ->defaultAttribute('type', 'text') ->defaultAttribute('name', $this->getElementName()); $this->addVariables([ 'prepend' => $this->prepend, 'append' => $this->append, 'style' => $this->style, 'dialog' => $this->dialog->render(), 'placeholder' => $this->placeholder(), 'dialogSelector' => $this->dialog->getElementSelector(), ]); return parent::render(); } protected function renderButton() { return <<    HTML; } /** * 弹窗底部内容构建. * * @return string */ protected function renderFooter() { $submit = trans('admin.submit'); $cancel = trans('admin.cancel'); return << {$submit}   HTML; } }