Jump to content

Recommended Posts

Всем доброго дня, друзья! Задался я тут написанием модуля (не коммерческим). Идея следующая:

Создание собственной переменной для её последующего вывода во front.

 

Скорее всего моё решение не рационально, со стороны программирования, но для решения моих задач, вполне подходит.

 

Собственно, это как создать новое поле в настройках и вывести его во front

 

{$settings->company_phone|escape}

 

_________________________________

 

Помогите пожалуйста привести переменную к желаемому виду.

 

Есть рабочий вывод параметров циклом [работает]

 

{get_myvariables var=myvariable}
{if $myvariable}
	{foreach $myvariable as $m}
		{if $m->image}
			{if $m->description}
				{$m->description}
			{/if}
		{/if}
	{/foreach}
{/if}

 

Конкретный параметр выводу по id [работает]

 

{get_myvariables var=myvariable}
{if $myvariable}
	{foreach $myvariable as $m}
		{if $m->id == 1}
			{if $m->description}
				{$m->description}
			{/if}
		{/if}
	{/foreach}
{/if}

 

Во View.php написан следующий код:

 

Настроил плагин для смарти

$this->design->smarty->registerPlugin("function", "get_myvariables",              array($this, 'get_myvariables_plugin'));

и сам плагин

public function get_myvariables_plugin($params,  &$smarty)
	{
		if(!empty($params['var']))
			$smarty->assign($params['var'], $this->myvariables->get_myvariables($params));
	}

 

Но не могу понять, как мне привести значение переменной, как например у настроек

{$settings->company_phone|escape}

что бы у меня работал следующий вывод 

 

{$myvariables->name_myvariable}

где name_myvariable - это имя нового элемента созданного в админке

 

а выводить созданная переменная должна заполненное текстовое поле description

 

_____________________________________________________________________________________

 

Если что-то не понятно описал, могу выложить все файлики и запросы к базе.

В планах выложить его в паблик, для дальнейшего использования и доработок  :)  

 

Структура базы - прикреплённый файл

post-18294-0-38862800-1531703827_thumb.png

Edited by Chudo
Link to post
Share on other sites

 

Но не могу понять, как мне привести значение переменной, как например у настроек
 
Не городить этот огород (а старый удалить) и просто создать поле в БД
Создать в шаблоне /simpla/design/html/setings.tpl инпут или textarea с уникальным name, например
 
<li><label class=property>Оповещение о заказах</label>
<input name="company_phone" class="simpla_inp" type="text" value="{$settings->order_company_phone|escape}" />
</li>
 
И в контроллере /simpla/SettingAdmin.php просто отловите это значение из POST запроса и присвойте ее этому свойству (дальше расскажу, почему это работает)
 
if($this->request->method('POST'))

{

    ...

    $this->settings->company_phone = $this->request->post('company_phone');

 
Все будет работать

 

Как работают настройки в Симпле

 

Есть класс Settings, у него есть магические методы 

При обращении к любому его свйоству сначала проверяются значения из конфига, если не найдено -- идет запрос в БД в таблицу s_setting

 

Пример: Мы обращаемся к свойству  $this->settings->company_phone

company_phone ищется в файле /config/config.php, такого там нет, далее идет запрос в БД и ищется там, а там опля -- есть такая строка и соответственно берется значение)

 

 

Соответственно не нужно ничего программировать, нужно просто в эту таблицу добавить строку и получать/писать ее

 

 

Но ваш способ тоже пригоден (не в сматривался в детали, имею в виду через плагины)

Например для вывода баннеров или вывода своего меню или еще какого-то общего функционала :)

Edited by Maksclub
Link to post
Share on other sites

 

 
Не городить этот огород (а старый удалить) и просто создать поле в БД
Создать в шаблоне /simpla/design/html/setings.tpl инпут или textarea с уникальным name, например

 

Да, Maksclub. Данный способ мне известен. И более того, я сам его использую.

 

Но, я задался идеей написать модуль, что бы можно было создавать пользовательские переменные «по клику»

Edited by Chudo
Link to post
Share on other sites

Думал написать небольшой обработчик, который будет создавать эти переменные из меню настроек.

Что-то вроде раздела «Валюта»

Писать их в /simpla/SettingAdmin.php и в /simpla/design/html/settings.tpl

 

Но, не хочется загромождать раздел настроек =) 

Edited by Chudo
Link to post
Share on other sites

 

 
Не городить этот огород (а старый удалить) и просто создать поле в БД
Создать в шаблоне /simpla/design/html/setings.tpl инпут или textarea с уникальным name, например

 

По большому счёту, решение рабочее. Но не могу понять как вывести переменную вида 

{$myvariables->name_myvariable}

 

без

{get_myvariables var=myvariable}
{if $myvariable}
	{foreach $myvariable as $m}
		{if $m->image}
			{if $m->description}
				{$m->description}
			{/if}
		{/if}
	{/foreach}
{/if}
Edited by Chudo
Link to post
Share on other sites

 

К сожалению, прочитав все 9 страниц, я не увидел решения, которое мне было бы под силу в реализации.

Link to post
Share on other sites

К сожалению, прочитав все 9 страниц, я не увидел решения, которое мне было бы под силу в реализации.

 

А зачем читатть 9 страниц? в первом посте архив в нем описание

Link to post
Share on other sites

А зачем читатть 9 страниц? в первом посте архив в нем описание

 

В архиве от chocolate_moles тоже нет вариантов решения моей задачи. 

 

Может и есть, но я его не понимаю

Link to post
Share on other sites

В архиве от chocolate_moles тоже нет вариантов решения моей задачи. 

 

Может и есть, но я его не понимаю

 

Ну бывает

 

Визуально покажите что вы хотите сделать в адм части

Link to post
Share on other sites

Ну бывает

 

Визуально покажите что вы хотите сделать в адм части

 

В админ части  уже всё готово.

 

Могу вывести конкретный id функцией 

{get_myvariables var=myvariable}{foreach $myvariable as $m}{if $m->id == 2}{$m->description}{/if}{/foreach}

 

Хочу добиться её сокращения и привести её в вид {if $myvariable->id == 2}

post-18294-0-94032500-1531721221_thumb.png

Edited by Chudo
Link to post
Share on other sites

В админ части  уже всё готово.

 

Могу вывести конкретный id функцией 

{get_myvariables var=myvariable}{foreach $myvariable as $m}{if $m->id == 2}{$m->description}{/if}{/foreach}

 

Хочу добиться её сокращения и привести её в вид {if $myvariable->id == 2}

 

 

 

короче уже не будет.

 

{get_myvariables var=myvariable} 

 {foreach $myvariable as $m} //циклом перебираете все из таблицы
  {if $m->id == 2} // ограничиваете вывод только второй стоки из таблицы
   {$m->description} // выводите значение из второй строки
  {/if}
 {/foreach}
Link to post
Share on other sites

 

короче уже не будет.

 

{get_myvariables var=myvariable} 

 {foreach $myvariable as $m} //циклом перебираете все из таблицы
  {if $m->id == 2} // ограничиваете вывод только второй стоки из таблицы
   {$m->description} // выводите значение из второй строки
  {/if}
 {/foreach}

 

То есть, от цикла не избавиться?

Link to post
Share on other sites

 

короче уже не будет.

 

{get_myvariables var=myvariable} 

 {foreach $myvariable as $m} //циклом перебираете все из таблицы
  {if $m->id == 2} // ограничиваете вывод только второй стоки из таблицы
   {$m->description} // выводите значение из второй строки
  {/if}
 {/foreach}

 

Самое короткое, что у меня получилось, это...

{get_myvariables var=myvariable}
{foreach $myvariable as $m}
{if $m->id == 2}
{$m->name}
{/if}
{/foreach}
Link to post
Share on other sites

То есть, от цикла не избавиться?

 

 

 

от цикла нет. вы можете по другому ограничить вывод

 

{assign var='group' value='2'}
{get_banners group=$group}

{foreach $banners as $banner}
{$banner->url}
{/foreach}

http://forum.simplacms.ru/topic/7140-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C-%D1%81%D0%BB%D0%B0%D0%B9%D0%B4%D0%B5%D1%80-%D0%B1%D0%B0%D0%BD%D0%BD%D0%B5%D1%80%D0%BE%D0%B2-%D0%B4%D0%BB%D1%8F-simpla-%D0%BE%D1%82-cernos/

Edited by shooroop
Link to post
Share on other sites

от цикла нет. вы можете по другому ограничить вывод

 

{assign var='group' value='2'}
{get_banners group=$group}

{foreach $banners as $banner}
{$banner->url}
{/foreach}

http://forum.simplacms.ru/topic/7140-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C-%D1%81%D0%BB%D0%B0%D0%B9%D0%B4%D0%B5%D1%80-%D0%B1%D0%B0%D0%BD%D0%BD%D0%B5%D1%80%D0%BE%D0%B2-%D0%B4%D0%BB%D1%8F-simpla-%D0%BE%D1%82-cernos/

Тоже длинный получается. Спасибо тебе shooroop за то, что не остался в стороне)

 

Но я всё таки буду пытаться написать так, что бы можно было дёргать принудительно по id конкретный блок

Link to post
Share on other sites

В БД, в таблице __settings добавить поле siteinfo с типом text, в нем хранить json данные

 

в админке сделать отдельный блок c:

input text name=siteinfo[name][]

input text name=siteinfo[value][]

 

на js дописать что бы можно было дублировать блоки.

результат что-то такое:

https://s.mail.ru/C5fn/heeJV5yKg

 

разумеется прежде чем писать в БД, мы это дело приводим в нужный вид

в SettingsAdmin.php в post:

 // Информация о сайте
            $siteinfo = array();
            foreach($this->request->post('siteinfo') as $n => $si)
            {
                foreach($si as $i => $s)
                {
                    if(empty($siteinfo[$i]) AND !empty($s))
                        $siteinfo[$i] = new stdClass;

                    if(!empty($s)) {
                        if($n == 'name')
                            $s = str_replace('-', '', $this->translit($s));

                        $siteinfo[$i]->$n = $s;
                    }
                }
            }

            $this->settings->siteinfo               = json_encode($siteinfo);

 

На выходе будет json в таком виде:

{
  "1": {
    "name": "job_time",
    "value": "ПН-ВС, с 08:00 до 21:00"
  },
  "2": {
    "name": "main_phone",
    "value": "123123123"
  }
}

 

т.к. по умолчанию в cms есть запрос к настройкам сайта, то не надо будет городить отдельный запрос.

в api/Settings.php делаем проверку типа:

// Выбираем из базы настройки
		$this->db->query('SELECT name, value FROM __settings');

		// и записываем их в переменную		
		foreach($this->db->results() as $result) {
			if(!($this->vars[$result->name] = @unserialize($result->value))) {

		// Делаем доступными параметры $settings->siteinfo.NAME_PARAMETER
		if ($result->name == 'siteinfo') {
                    $siteinfo_value = [];
                    foreach (json_decode($result->value) as $siteinfo) {
                        $siteinfo_value[$siteinfo->name] = $siteinfo->value;
                    }
                    $result->value = $siteinfo_value;
                }

                $this->vars[$result->name] = $result->value;
            }
}

 

на сайте выводим:

{$settings->siteinfo.job_time}

{$settings->siteinfo.main_phone}

 

Link to post
Share on other sites

а зачем все эти танцы с php?
Там штатные функции сохраняют сериализованный массив.

$this->settings->siteinfo = [тут только формируем нужный массив из post];

 

 

 

Как работают настройки в Симпле
 
Есть класс Settings, у него есть магические методы 
При обращении к любому его свйоству сначала проверяются значения из конфига, если не найдено -- идет запрос в БД в таблицу s_setting
 
Пример: Мы обращаемся к свойству  $this->settings->company_phone
company_phone ищется в файле /config/config.php, такого там нет, далее идет запрос в БД и ищется там, а там опля -- есть такая строка и соответственно берется значение)

 

увы, но этот класс Settings вообще не так работает.

С config он никак не связан и ничего там не проверяет.

 

При вызове конструктора он делает разовый запрос к БД и сохраняет все полученные данные в локальную переменную. После при обращении через маг. методы он берет значение по ключу уже из локального массива. 

А поиск по ключу запросом к БД - делается лишь только при записи значения через __set

Edited by yr4ik
Link to post
Share on other sites

увы, но этот класс Settings вообще не так работает.

С config он никак не связан и ничего там не проверяет.

 

При вызове конструктора он делает разовый запрос к БД и сохраняет все полученные данные в локальную переменную. После при обращении через маг. методы он берет значение по ключу уже из локального массива. 

А поиск по ключу запросом к БД - делается лишь только при записи значения через __set

 

а ну по памяти писал, сплоховала значит, прошу прощения :(

Edited by Maksclub
Link to post
Share on other sites

По-моему, все можно реализовать куда проще, примерно так:
 

public function get_myvariables_plugin($params, &$smarty)
    {
        if(!empty($params['var'])){
		$mvs=array();
		foreach($this->myvariables->get_myvariables($params) as $mv)
			$mvs[$mv->id]=$mv;
		$smarty->assign($params['var'], $mvs);
	}
    }
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...