Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

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

Создание собственной переменной для её последующего вывода во 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

Изменено пользователем Chudo
Ссылка на сообщение
Поделиться на другие сайты

 

Но не могу понять, как мне привести значение переменной, как например у настроек
 
Не городить этот огород (а старый удалить) и просто создать поле в БД
Создать в шаблоне /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, такого там нет, далее идет запрос в БД и ищется там, а там опля -- есть такая строка и соответственно берется значение)

 

 

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

 

 

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

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

Изменено пользователем Maksclub
Ссылка на сообщение
Поделиться на другие сайты

 

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

 

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

 

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

Изменено пользователем Chudo
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

Изменено пользователем Chudo
Ссылка на сообщение
Поделиться на другие сайты

 

 
Не городить этот огород (а старый удалить) и просто создать поле в БД
Создать в шаблоне /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}
Изменено пользователем Chudo
Ссылка на сообщение
Поделиться на другие сайты

chocolate_moles делал слайдер можете взять его пример

http://forum.simplacms.ru/topic/5698-%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/

Изменено пользователем shooroop
Ссылка на сообщение
Поделиться на другие сайты

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Ну бывает

 

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

Ссылка на сообщение
Поделиться на другие сайты

Ну бывает

 

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

 

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

 

Могу вывести конкретный 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

Изменено пользователем Chudo
Ссылка на сообщение
Поделиться на другие сайты

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

 

Могу вывести конкретный 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}
Ссылка на сообщение
Поделиться на другие сайты

 

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

 

{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->description} // выводите значение из второй строки
  {/if}
 {/foreach}

 

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

{get_myvariables var=myvariable}
{foreach $myvariable as $m}
{if $m->id == 2}
{$m->name}
{/if}
{/foreach}
Ссылка на сообщение
Поделиться на другие сайты

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

 

 

 

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

 

{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
Ссылка на сообщение
Поделиться на другие сайты

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

 

{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 конкретный блок

Ссылка на сообщение
Поделиться на другие сайты

В БД, в таблице __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}

 

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

 

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

 

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

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

 

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

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

Изменено пользователем yr4ik
Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

 

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

Изменено пользователем Maksclub
Ссылка на сообщение
Поделиться на другие сайты

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

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);
	}
    }
Ссылка на сообщение
Поделиться на другие сайты

Решил написать этот модуль вообще по другому.

Как и обещал, готовое решение -->


http://forum.simplacms.ru/topic/13639-создание-новых-произвольных-переменных-для-их/

Изменено пользователем Chudo
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...