Перейти к содержимому


Фото
* * * * * 1 голосов

Вывод переменной из цикла

smarty вывод цикл view переменная frontand свои переменные

  • Чтобы отвечать, сперва войдите на форум
20 ответов в теме

#1 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 04:18

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

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

 

_____________________________________________________________________________________

 

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

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

 

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

Прикрепленные файлы:


Изменено: Chudo, 16.07.2018 - 04:20


#2 Maksclub

Maksclub

    Помогаю с Симплой и c PHP

  • Фрилансер
  • 1 393 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 16.07.2018 - 05:20

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


#3 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 05:31

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

 

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

 

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


Изменено: Chudo, 16.07.2018 - 05:39


#4 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 05:34

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

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

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

 

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


Изменено: Chudo, 16.07.2018 - 05:36


#5 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 05:39

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


#6 shooroop

shooroop
  • Фрилансер
  • 759 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Antarktida

Опубликовано 16.07.2018 - 06:51

http://forum.simplac...модуль-слайдер/


Изменено: shooroop, 16.07.2018 - 06:52


#7 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 08:11

http://forum.simplac...модуль-слайдер/

 

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



#8 shooroop

shooroop
  • Фрилансер
  • 759 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Antarktida

Опубликовано 16.07.2018 - 08:57

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

 

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



#9 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 09:00

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

 

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

 

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



#10 shooroop

shooroop
  • Фрилансер
  • 759 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Antarktida

Опубликовано 16.07.2018 - 09:02

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

 

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

 

Ну бывает

 

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



#11 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 09:06

Ну бывает

 

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

 

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

 

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

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

 

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

Прикрепленные файлы:

  • Прикрепленный файл  123.png   53,01К   7 раз скачано

Изменено: Chudo, 16.07.2018 - 09:07


#12 shooroop

shooroop
  • Фрилансер
  • 759 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Antarktida

Опубликовано 16.07.2018 - 09:14

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

 

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


#13 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 09:17

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

 

{get_myvariables var=myvariable} 

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

 

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



#14 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 09:21

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

 

{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}


#15 shooroop

shooroop
  • Фрилансер
  • 759 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Antarktida

Опубликовано 16.07.2018 - 09:29

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

 

 

 

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

 

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

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

http://forum.simplac...mpla-от-cernos/


Изменено: shooroop, 16.07.2018 - 09:30


#16 Chudo

Chudo
  • Пользователь
  • 89 сообщений
  • Программирование, Верстка, Заказчик
  • Версия CMS:2.x
  • Откуда:Саратов

Опубликовано 16.07.2018 - 09:35

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

 

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

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

http://forum.simplac...mpla-от-cernos/

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

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



#17 ABSORBER

ABSORBER
  • Модератор
  • 465 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Хабаровск

Опубликовано 18.07.2018 - 04:39

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

 



#18 yr4ik

yr4ik
  • Фрилансер
  • 896 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:Украина Чернигов

Опубликовано 18.07.2018 - 05:12

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

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

 

 

 

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

 

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

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

 

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

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


Изменено: yr4ik, 18.07.2018 - 05:30


#19 Maksclub

Maksclub

    Помогаю с Симплой и c PHP

  • Фрилансер
  • 1 393 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 18.07.2018 - 07:25

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

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

 

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

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

 

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


Изменено: Maksclub, 18.07.2018 - 07:26


#20 phukortsin

phukortsin
  • Пользователь
  • 595 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 18.07.2018 - 10:32

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

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);
	}
    }






Также с меткой «smarty, вывод, цикл, view, переменная, frontand, свои переменные»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых