/** * Экстрактит все записи словаря внутри коллекции * * $collection = DicVal::extracts($collection); * * @param $elements * @param bool $unset * @param bool $extract_ids * @return Collection */ public static function extracts($elements, $field = null, $unset = false, $extract_ids = true) { return DicLib::extracts($elements, $field, $unset, $extract_ids); }
<?php return array('fields' => function () { return array('desc' => array('title' => 'Описание параметра', 'type' => 'textarea')); }, 'hooks' => array('before_all' => function ($dic) { }, 'before_index' => function ($dic) { }, 'before_index_view' => function ($dic, $dicvals) { $dicvals->load('textfields'); #Helper::tad($dicvals); $dicvals = DicLib::extracts($dicvals, null, true, true); }), 'second_line_modifier' => function ($line, $dic, $dicval) { #$dicval->extract(true); return $dicval->slug . (isset($dicval->desc) && $dicval->desc ? ' — <i>' . $dicval->desc . '</i>' : ''); }, 'slug_label' => 'Системное имя параметра');
/** * Возвращает записи из словаря по системному имени словаря и набору IDs нужных записей. * Третьим параметром можно передать метку, указывающую на необходимость сделать экстракт каждой записи. * * @param $slug * @param $val_ids * @param string $with * @param bool $extract * @param bool $unset * @return $this|Collection|\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|null|static */ public static function valuesBySlugAndIds($slug, $val_ids, $with = 'all', $extract = true, $unset = true, $extract_ids = false) { $return = new Collection(); #$dic = Dic::where('slug', $slug)->first(); #$dic = @Config::get(self::$cache_key)['by_slug'][$slug]; $dic = Dic::by_slug($slug); if (!is_object($dic) || !is_array($val_ids) || !count($val_ids)) { return $return; } $values = DicVal::where('dic_id', $dic->id)->where('version_of', NULL)->whereIn('id', $val_ids); if ($with == 'all') { $with = ['meta', 'fields', 'textfields', 'seo', 'related_dicvals']; } else { $with = (array) $with; } $db_remember_timeout = Config::get('app.settings.main.db_remember_timeout'); if (count($with)) { ## ## Cache relations ## if (NULL != $db_remember_timeout && is_numeric($db_remember_timeout) && $db_remember_timeout > 0) { $temp = []; foreach ($with as $relation) { $temp[$relation] = function ($query) use($db_remember_timeout) { $query->remember($db_remember_timeout); }; } $with = $temp; } $values = $values->with($with); } ## ## Cache query ## if (NULL != $db_remember_timeout && is_numeric($db_remember_timeout) && $db_remember_timeout > 0) { $values->remember($db_remember_timeout); } $values = $values->get(); #Helper::tad($values); if ($extract) { $values = DicLib::extracts($values, null, $unset, $extract_ids); } #Helper::tad($values); return $values; }
public function index($dic_id) { $dic = Dictionary::where(is_numeric($dic_id) ? 'id' : 'slug', $dic_id)->first(); if (!$this->checkDicPermission($dic)) { App::abort(404); } $this->dicval_permission($dic, 'dicval_view'); $dic->settings = json_decode($dic->settings, 1); $this->checkDicUrl($dic, $dic_id); $this->callHook('before_all', $dic); $this->callHook('before_index', $dic); ## Get element $elements = new DicVal(); $tbl_dicval = $elements->getTable(); $elements = $elements->where($tbl_dicval . '.dic_id', (int) $dic->id)->where($tbl_dicval . '.version_of', '=', NULL)->with('fields'); #$elements = DB::table('dictionary_values')->where('dic_id', $dic->id)->select('dictionary_values.*'); if (NULL !== ($filter = Input::get('filter'))) { #Helper::d($filter); if (isset($filter['fields']) && is_array($filter) && count($filter)) { $tbl_fields = new DicFieldVal(); $tbl_fields = $tbl_fields->getTable(); #Helper::d($filter['fields']); foreach ($filter['fields'] as $key => $value) { $rand_tbl_alias = md5(rand(99999, 999999)); $elements = $elements->join($tbl_fields . ' AS ' . $rand_tbl_alias, function ($join) use($tbl_dicval, $tbl_fields, $key, $value, $rand_tbl_alias) { $join->on($rand_tbl_alias . '.dicval_id', '=', $tbl_dicval . '.id')->where($rand_tbl_alias . '.key', '=', $key)->where($rand_tbl_alias . '.value', '=', $value); })->addSelect($rand_tbl_alias . '.value AS ' . $key); } } } ## Ordering $sort_order = $dic->sort_order_reverse ? 'DESC' : 'ASC'; #Helper::dd($dic->sort_by); /** * Кол-во элементов, подпадающих под условия, но без учета пагинации */ $total_elements_current_selection = clone $elements; $total_elements_current_selection = (int) $total_elements_current_selection->count(); #Helper::tad($total_elements_current_selection); switch ($dic->sort_by) { case '': /* $elements = $elements ->orderBy($tbl_dicval.'.order', $sort_order) ->orderBy($tbl_dicval.'.name', $sort_order); */ $elements = $elements->orderBy(DB::raw('-' . $tbl_dicval . '.lft'), 'DESC')->orderBy($tbl_dicval . '.id', $sort_order); break; case 'name': $elements = $elements->orderBy($tbl_dicval . '.name', $sort_order); break; case 'slug': $elements = $elements->orderBy($tbl_dicval . '.slug', $sort_order); break; case 'created_at': $elements = $elements->orderBy($tbl_dicval . '.created_at', $sort_order); break; case 'updated_at': $elements = $elements->orderBy($tbl_dicval . '.updated_at', $sort_order); break; default: /** * ORDER BY по произвольному полю */ /* #Helper::dd($dic->sort_by); #$dic->sort_by .= '2'; $tbl_fields = (new DicFieldVal())->getTable(); $rand_tbl_alias = md5(rand(99999, 999999)); $elements = $elements ->leftJoin($tbl_fields . ' AS ' . $rand_tbl_alias, function ($join) use ($tbl_dicval, $tbl_fields, $rand_tbl_alias, $dic, $sort_order) { $join ->on($rand_tbl_alias . '.dicval_id', '=', $tbl_dicval . '.id') ; }) ### !!! WHERE должно быть именно здесь, а не внутри JOIN-а !!! ### ### !!! Иначе происходит неведомая хрень: dic_id = 'field' !!! ### ->where($rand_tbl_alias . '.key', '=', $dic->sort_by) ->addSelect($rand_tbl_alias . '.value AS ' . $dic->sort_by) #->orderBy($dic->sort_by, $sort_order) ->orderBy($rand_tbl_alias.'.value', $sort_order) ->orderBy($tbl_dicval.'.created_at', 'DESC') ## default ; */ $elements = $elements->order_by_field($dic->sort_by, $sort_order); break; } #Helper::tad($dic->pagination); ## Search $search_query = NULL; if (NULL !== ($search_query = Input::get('q'))) { $elements = $elements->where('name', 'LIKE', '%' . $search_query . '%')->orWhere('slug', 'LIKE', '%' . $search_query . '%'); } ## Dic settings $dic_settings = Config::get('dic/' . $dic->slug); #Helper::dd($dic_settings); ## Sortable settings $sortable = $dic->sortable && $dic->pagination == 0 && $dic->sort_by == null ? true : false; ## Disable sortable without needable filter options if ($sortable && isset($dic_settings['disable_ordering_without_filter']) && $dic_settings['disable_ordering_without_filter']) { $dic_settings['disable_ordering_without_filter'] = (array) $dic_settings['disable_ordering_without_filter']; #Helper::ta($dic_settings['disable_ordering_without_filter']); if (count($dic_settings['disable_ordering_without_filter'])) { foreach ($dic_settings['disable_ordering_without_filter'] as $condition) { if (!Input::get('filter.fields.' . $condition)) { $sortable = false; break; } } } } ## Disable listing without needable filter options $listing = true; if (isset($dic_settings['disable_listing_without_filter']) && $dic_settings['disable_listing_without_filter']) { $dic_settings['disable_listing_without_filter']['fields'] = (array) $dic_settings['disable_listing_without_filter']['fields']; #Helper::ta($dic_settings['disable_listing_without_filter']['fields']); if (count($dic_settings['disable_listing_without_filter']['fields'])) { foreach ($dic_settings['disable_listing_without_filter']['fields'] as $condition) { if (!Input::get('filter.fields.' . $condition)) { $listing = false; break; } } } } if (isset($dic_settings['sortable']) && is_callable($dic_settings['sortable'])) { $sortable = $dic_settings['sortable']($dic, $elements); } ## Pagination if ($dic->pagination > 0) { $elements = $elements->paginate($dic->pagination); } else { $elements = $elements->get(); } #Helper::tad($elements); #Helper::smartQueries(1); $elements_pagination = clone $elements; #Helper::tad($elements); DicLib::extracts($elements, null, true, true); #$elements = Dic::modifyKeys($elements, 'id'); if (Config::get('debug') == 1 || Input::get('debug') == 1) { Helper::smartQueries(1); Helper::tad($elements); } $actions_column = false; if (Allow::action($this->module['group'], 'dicval_edit') || Allow::action($this->module['group'], 'dicval_delete') || isset($dic_settings['actions']) && is_callable($dic_settings['actions'])) { $actions_column = true; } $total_elements = DicVal::where('dic_id', $dic->id)->where('version_of', '=', NULL)->count(); $this->callHook('before_index_view_create_edit', $dic, $elements); $this->callHook('before_index_view', $dic, $elements); $id_left_right = array(); if (count($elements)) { foreach ($elements as $element) { $id_left_right[$element->id] = array(); $id_left_right[$element->id]['left'] = $element->lft; $id_left_right[$element->id]['right'] = $element->rgt; } } $hierarchy = (new NestedSetModel())->get_hierarchy_from_id_left_right($id_left_right); #Helper::ta($dic); #Helper::tad($elements); #Helper::dd($hierarchy); #Helper::dd($dic_settings['actions']()); #return View::make(Helper::acclayout()); #return View::make($this->module['tpl'].'index_old', compact('elements', 'dic', 'dic_id', 'sortable', 'dic_settings', 'actions_column', 'total_elements', 'total_elements_current_selection')); return View::make($this->module['tpl'] . 'index', compact('elements', 'elements_pagination', 'hierarchy', 'dic', 'dic_id', 'sortable', 'dic_settings', 'actions_column', 'total_elements', 'total_elements_current_selection', 'search_query', 'listing')); }