Nu3oN » 2011.11.18 17:19

Думаю стоящий сабж для того что бы его выделить!

В общем задает вопрос по интересующей "проблеме" и получаем ответ!

Nu3oN » 2011.11.18 18:13

В общем на зендовском фрейме (не знаю как на других я кроме зенда и CI ничего углубленно не юзал) есть такая фича:
Вот у нас есть контроллер и нам необходимо для определенной странички указать заголовок сайта (<title></title>)
Точных названий переменных не помню, но суть в том, что в контроллере можно указать заголовок таким образом:

Код:

1
span style="color: #0000BB"><?phpclass IndexController extends Zend_Controller_Action{ function indexAction() { $this -> view -> title = 'Главная страница'; }}?>

хочу себе организовать такую же шнягу! я вижу выход из ситуации только ob_start() и т.д
а потом просто заменять необходимые элементы!

У кого какие предложения?
З.ы только не посылайте меня лопатить зендовский фрейм, я лучше повешусь  =D

TLENS » 2011.11.18 18:18

Nu3oN Я юзаю деструктор.
Вот пример:

Nu3oN » 2011.11.18 18:20

TLENS написал:

Вот пример:

эммм... где??

TLENS » 2011.11.18 18:26

В общем пример таков в начале иницыализируется класс Тема
Далее по пути работы скрипта изменяются публичные свойства.
И в деструкторе вывожу в браузер все.
В общем думал катнуть код простой но в падло.
Вот мой файл themes.class.php аналог буферизации.
Он еще только на тестировании поэтому и говна много, ну я так понимаю тебе пример надо.

Код:

1
span style="color: #0000BB"><?phpclass Themes { public $title; public $nav; public $description; public $description_foot; public $content; public $desc; public $keyword; public $head; public function __construct () { global $_SET; } public function __destruct () { global $_SET, $starttime; $this->parse(); header("Content-type: text/html; charset=utf-8"); $prev = (($_SET->prev == 120) ? '<b>120x90</b>' : '<a href="?preview=120">120x90</a>'); $prev .= ' / '; $prev .= (($_SET->prev == 40) ? '<b>40x30</b>' : '<a href="?preview=40">40x30</a>'); $r = '<?xml version="1.0" encoding="utf-8"?>' . "\n" .'<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">' . "\n" .'<html>' . "\n" .' <head>' . "\n" .' <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' . "\n" .' <meta name="' . $this->keyword . '" />' . "\n" .' <meta name="description" content="' .$this->desc. '" />' . "\n" .' <title>' . $this->title . '</title>' . "\n" .' <link rel="stylesheet" type="text/css" href="/themes/' . $_SET->themes . '/style.css" />' . "\n" . $this->head .' </head>' . "\n" .' <body>' . "\n" . "\n" .' <div id="title">' . "\n" .' <a href="' . $_SET->home . '">' .'<img style="position: relative;top: 5px;" src="/themes/' . $_SET->themes . '/images/logo.png" alt="" /></a>' . "\n" .' </div>' . "\n" . "\n" .' <div id="nav">' . $this->nav . '</div>' . "\n" .' <div id="description">' . $this->description . '</div>' . "\n" . "\n" .' <div id="content">' . "\n" .' Предосмотр: ' . $prev . '<br />' . "\n" . $this->content . "\n" .' </div>' . "\n" .' <div id="description-foot">' . "\n" .' ' .$this->description_foot . "\n" .' </div>' . "\n" . "\n" .' <div id="foot">' . "\n" .' <div style="text-align:center">' //.' <a href="http://fixwap.net/ru/?uid=11598"><img src="http://fixwap.net/ru/count.php?uid=11598" alt="fixwap"/></a>' . "\n" .' <a href="http://weplog.net/in/8375"><img src="http://weplog.net/8375/1.cnt" alt="wap сайты" title="wap сайты" /></a>'. "\n" .' <a href="http://waplog.net/c.shtml?352534"><img src="http://c.waplog.net/352534.cnt" alt="waplog" /></a>' . "\n" .' <a href="http://mstop.ru/?uid=860"><img src="http://mstop.ru/count.php?860" alt="mstop.ru"/></a>' . "\n" //.' <a href="http://top.sexvirus.ru/click.php?2367"><img src="http://top.sexvirus.ru/image.php?2367,small" alt="top.sexvirus.ru" /></a>' . "\n" .' <br />' . "\n" .' <a href="http://top4wap.ru/5883"><img src="http://top4wap.ru/cnt4.gif?5883" alt="TOP4WAP.ru"/></a><br />' . "\n" .' <small>' . round(microtime(1) - $starttime, 4) . ' Сек.</small> ' . "\n" .' </div>' . "\n" .' </div>' . "\n" .' </body>' . "\n" .'</html>'; //var_dump($this); //highlight_string($r); echo $r; } private function parse () { global $_SET; if (!$this->title) { if ($_SET->page[1]) { $this->title = $_SET->page[1] . ' - Лучшее порно'; } else { $this->title = 'Лучшее порно'; } } else { $this->title = $this->title . ' - Лучшее порно'; } if ($this->content == '') { $this->content = ' <b>Страница не найдена</b>'; } if (!$this->description) { $this->description = ' Все самое лучшее здесь!'; } if ($this->nav) { $this->nav = $this->navig(); } if (!$this->nav) { $this->navig(); } if (!$this->keyword) { $this->keyword = 'keywords" content="podsmotri.org, best, xxx, порно, Инцест, Домашка, руское, эротика, видео, 3gp, mp4, трах, секс, подсмотренное, лучшее'; } if (!$this->desc) { $this->desc = 'Лучшая подборка xxx, Бесплатное xxx, Домашнее xxx, Руское xxx, Скачать 3gp, Скачать mp4, Популярное xxx, Ржачное xxx, Скрытая камера'; } } private function navig () { global $_SET; $arr_top[1] = array('<a href="/' . $_SET->act . '/new/">Новые</a>', '<b>Новые</b>'); $arr_top[2] = array('<a href="/' . $_SET->act . '/search/">Поиск</a>', '<b>Поиск</b>'); $arr_top[3] = array('<a href="/' . $_SET->act . '/top_week/">Топ нед.</a>', '<b>Топ нед.</b>'); $arr_top[4] = array('<a href="/' . $_SET->act . '/top_month/">Топ мес.</a>', '<b>Топ мес.</b>'); $arr_top[5] = array('<a href="/' . $_SET->act . '/top_all/">Топ все</a>', '<b>Топ все</b>'); $c = count($arr_top); $this->nav = '<small>'; for ($i=1; $i<=$c; $i++) { $this->nav .= $arr_top[$i][(($_SET->page[0] == $i)?1:0)] . (($i<$c)? ' | ' : ''); } $this->nav .= '</small>'; $if = ($_SET->page[0] >= 1 && $_SET->page[0] <= 5); $arr_nav[1] = array('video', '<a href="/video/' . (($if)? $_SET->page[2] : 'new') . '/">Видео</a>', '<b>Видео</b>'); $arr_nav[2] = array('photo', '<a href="/photo/' . (($if)? $_SET->page[2] : 'new') . '/">Фото</a>', '<b>Фото</b>'); $i = 0; $this->description = '<small>'; while ($arr_nav[++$i][0]) { //() $this->description .= $arr_nav[$i][(($_SET->act == $arr_nav[$i][0])? 2 : 1 )] . (($arr_nav[($i + 1)][0])? ' / ' : ''); } $this->description .= '</small>'; }}?>
Nu3oN » 2011.11.18 18:32

TLENS, идея впринципе хорошая, но у меня на шаблонах все!
а так черпану онсновную идею! это примерно то что я и искал))) спасибо большое =)

Gemorroj » 2011.11.18 19:44

Nu3oN, я не совсем понял, как ты тогда рендеришь шаблоны, не имея всех данных?
Может я не совсем понимаю, но вариантов тут с ходу несколько имеется.

Nu3oN » 2011.11.18 22:04

Я сделал по принципу TLENS'a

Код:

1
span style="color: #0000BB"><?php if (is_file(PATH_TEMPLATES . self :: OUTPUT_THEME . '/template.inc.php')) { require_once(PATH_TEMPLATES . self :: OUTPUT_THEME . '/template.inc.php'); Logging :: setMark('Подключение файла настроек шаблона'); } else { trigger_error('Ошибка при подключении файла настроек шаблона', E_USER_ERROR); } /* * Указываем залоговок страницы. */ if (empty($this -> arrHeader['title'])) { $arrHeader['title'] = $titles['title']; } else { $arrHeader['title'] = $this -> arrHeader['title']; } /* * Указываем ключевые слова. */ if (empty($this -> arrHeader['keywords'])) { $arrHeader['keywords'] = $titles['keywords']; } else { $arrHeader['keywords'] = $this -> arrHeader['keywords']; } /* * Указываем описание страницы. */ if (empty($this -> arrHeader['description'])) { $arrHeader['description'] = $titles['description']; } else { $arrHeader['description'] = $this -> arrHeader['description']; } /* * Указываем где мы берем стиль. */ $arrHeader['link_css'] = $titles['link_css']; /* * Указываем где мы берем иконку. */ $arrHeader['link_ico'] = $titles['link_ico']; /* * Закрываем буферизацию. */ $strOut = ob_get_contents(); ob_end_clean(); header("Content-type: text/html; charset=utf-8"); /* * Выводим основной шаблон. */ $this -> view -> assign('arrHeader', $arrHeader); $this -> view -> assign('outContent', $strOut); $this -> view -> display('/', 'primary'); die; }
Nu3oN » 2011.11.18 22:53

Кстати юзав CI увидел "маркеры", и придумал велосипед, который оказался очень полезным!
полностью вижу весь процесс выполнения скрипта:

Начало ведения меток
Подключение класса "Logging"
Подключение файла "setting"
Подключение файла "common"
Старт сессии
Подключение класса "MVC_Router"
Определение категории с контроллером
Определение файла контроллера
Подключение класса "MVC_Controller"
Подключение файла контроллера
Запуск контроллера
Подключение класса "DB"
Подключение класса "DB_ClassBase"
Подключение класса "NativeTemplate"
Проверка существования категории с шаблонами
Подключение класса "GetHelpers"
Подключение хэлпера "testhelp()"
Подключение шаблона "index"
Подключение файла настроек шаблона
Передаем переменные в шаблон
Подключение шаблона "primary"
Конец ведения меток

Только в CI время пишут! там идет принцип такой:

Код:

1
span style="color: #0000BB"><?phpfunction name_function($var){ $this -> mark[$var] = microtime();}name_function('controller_execution_time_( '.$class.' / '.$method.' )_start');

а нахрена это надо я так и не нашел...

Gemorroj » 2011.11.19 11:23

возможно, для выявления ресурсоемких мест.

Sep » 2012.01.13 22:51

Есть число 20, как сделать 5 разных чисел, что бы они в среднем арифметическом давали 20, и по возможности регулировать уровень числа.
Например:
Дано 20
Четвертое число больше всех.
Получаем числа 16, 10, 24, 30, 20.
Как это реализовать? Заранее спасибо

Gemorroj » 2012.01.14 00:23

Код:

1
span style="color: #0000BB"><?php$avg = 20; // среднее арифметическое$count = 5; // всего необходимо чисел$max = 30; // максимальное число$maxNumber = 4; // какое число в массиве должно быть максимальным$numbers = array();$sum = $avg * $count;for ($i = 1; $i <= $count; ++$i) { if ($i === $maxNumber) { $numbers[$i] = $max; } else if ($i === $count) { $numbers[$i] = $sum - array_sum($numbers); } else { $numbers[$i] = mt_rand($max / $count + $count, $max - $count); }}print_r($numbers);echo array_sum($numbers) / sizeof($numbers);

спасибо за задачку, мне очень понравилась)
Добавлено спустя    51 секунду:
P.S. не уверен на счет оптимальности кода, но сам алгоритм вроде работает.

Sep » 2012.01.14 01:07

Gemorroj, спасибо большое =)

Sep » 2012.01.15 16:24

Gemorroj, жаль что при увеличении числа $count алгоритм уже не правильно работает. Последнее число становится очень большим, разбежка от средне арифметического должна быть небольшой

Gemorroj » 2012.01.15 18:17

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

LEXIN » 2012.04.28 02:17

У меня такая проблема. Нужно создать страничку списка сайтов локалхоста. Шаблон я подготовил, но в скрипте не могу разобраться, как вывести субдомены в общем блоке.
Конструкция разметки должна быть примерно следующей:
<div>
<a>Домен1</a>
<a>Домен2</a>

   <div>
    <a>Субдомен1.Домен2</a>
    <a>Субдомен2.Домен2</a>
   </div>

<a>Домен3</a>
</div>

А на данный момент я могу вывести лишь так:

<div>
<a>Домен1</a>
<a>Домен2</a>

   <div><a>Субдомен1.Домен2</a></div>
   <div><a>Субдомен2.Домен2</a></div>
   
<a>Домен3</a>
</div>

За основу взял этот скрипт:

Код:

1
lt;?// Original idea by: Dmitry Boykov (http://forum.dklab.ru/users/DmitryBoykov/)$file = file('/usr/local/apache/conf/vhosts.conf');foreach ($file as $line) { if (preg_match('/^[^#]* <VirtualHost \s+ [^:>]+ (?::(\d+))?/six', $line, $p)) { $port = @$p[1]; } if (preg_match('/^[^#]* ServerName \s+ "?([^"]*)"?/six', $line, $p)){ if ($port == 443) continue; $dom = preg_replace('/^www\./si', '', $p[1]); $dom .= $port && $port != 80? ":$port" : ""; $domains[$dom] = join(".", array_reverse(preg_split('/\./', $dom))); }}asort($domains);$prev = false;echo '<ul>';foreach ($domains as $dom=>$parts) { if (!$prev || !preg_match('/'.preg_quote($prev, '/').'$/si', $dom)) { echo "<li><a href=\"http://{$dom}\" target=\"_blank\"><b>{$dom}</b></a></li>"; $prev = $dom; } else { print "&nbsp;&nbsp;-&nbsp;&nbsp;<a href=\"http://{$dom}\" target=\"_blank\">{$dom}</a><br />"; }}echo '</ul>';?>

=(
Было бы вообще здорово, если бы домены и субдомены парсились не из апача, чтоб при запуске на Nginx, список сайтов тоже смог отобразится.

Gemorroj » 2012.04.28 10:22

эм.. не совсем понимаю. проблема всего лишь в дивах?
и еще, вероятно, лучше будет использовать не парсер vhosts.conf, а парсить вывод apachectl -S

LEXIN » 2012.04.28 14:24

Да, вопрос косметического характера - вывод субдоменов в каком-либо классе (дивы для примера конструкции, мне нужен <ul>).
И чтоб скрипт мог работать на том же Денвере. :)

Gemorroj » 2012.04.28 15:01

ну так собери сначала все в массив, а потом с массивом делай что хочешь.

LEXIN » 2012.04.28 16:42

Без понятия как это сделать.

Gemorroj » 2012.04.28 17:15

что именно?

LEXIN » 2012.04.28 17:21

Kак составить массив, чтоб при домене без поддоменов выводило:
<a>Домен</a>,
а при выявлении субдоменов:
<a>Домен</a>
<ul>
<a>Субдомен-1</a>
<a>Субдомен-2</a>
</ul>.

То есть, я не смогу составить такой массив, так как не понимаю основ php.

Gemorroj » 2012.04.28 21:53

давай свой скрипт, как ты сейчас собираешь.

LEXIN » 2012.04.28 22:55

Вот скрипт, только я его уже не разбираю. Искал в инете похожие проблемные ситуации или готовое решение 2 дня и ни чего не добился.:(

Gemorroj » 2012.04.29 19:13

скинь еще vhosts.conf для примера, а то у меня как ни странно под рукой не нашлось тестовой конфигурации

LEXIN » 2012.04.29 20:27

Вот такой список составил:

Gemorroj » 2012.04.30 11:25

блин, вчера дома немного подправил скрипт, потом настроение пропало) сегодня вечером доделаю

LEXIN » 2012.04.30 13:57

Gemorroj, хорошо.

Gemorroj » 2012.04.30 22:44

надеюсь разберешься

LEXIN » 2012.05.01 00:11

=( Я не смог разобраться.
Скрипт выдает:

Array
(
    [site1.ru] => Array
        (
            [0] => sub1.site1.ru
            [1] => sub2.site1.ru
            [2] => sub3.site1.ru
        )

    [site2.ru] => Array
        (
        )

    [site3.ru] => Array
        (
        )

    [site4.ru] => Array
        (
        )

)

Gemorroj » 2012.05.01 10:54

ну так там print_r и exit стоит. я думал с таким массивом ты уже разберешься как дальше работать.

LEXIN » 2012.05.01 13:51

Не, это я не осилил. Пытался в код echo и print вставлять, но получаю только ошибки на выводе.

Nu3oN » 2012.05.17 01:24

в общем вопрос в следующем:
Пишу скрипт групп. Зациклился на решение задачи со вступлением в закрытую группу!

Вот и думаю при отсылке запроса на добавление в группу отправлять лс администратору мол такой-то, такой-то хочет вступить в группу.
Или же выискать в модераторах того кто в онлайне и отправить ему в лс запрос? если же второй вариант, то как быть если никого нет в онлайне?
И еще есть третий вариант! создать страничку в группе, мол в группу хотят добавится такие то такие. Но тут тоже есть нюанс! Модераторы могут долгое время не заходить в группу...

Gemorroj » 2012.05.17 10:20

можно совместить эти варианты. а уведомлять админа или модераторов - наверное можно сделать как настройку в группе.

tipsun » 2014.09.04 14:05

Как правильно разделить несколько переменных через запятую, если неизвестно содержит ли предыдущая или следующая переменная запись?
Примеры:
Строка переменных: {1}{2}{3}{4}{5}{6}{7}
Значение есть только у {1} и {5}, или {3} и {6}, или {2}, {3} и {7} и т.д.
Можно проверить переменную на содержание записи { IF 1 = "" "yes" "no" }
Можно использовать дополнительную переменную и выводить её значение
Проставив запятые обычным образом не катит: {1},{2},{3},{4},{5},{6},{7} т.к. с заданными условия получим: , , , +, +, , например

Gemorroj » 2014.09.04 17:30

для вывода implode используешь?
можно обработать массив через array_filter, например.

tipsun » 2014.09.04 17:32

Нет, я в MS Word пытаюсь слияние организовать))
Там есть:
{SET переменная "значение"}
{= 1 + 1}
{IF "значение" = переменная "1" "2"}
{MERGEFIELD Переменная \b "before" \f "after"}
Добавлено спустя   3 минуты  33 секунды:
У меня есть файл MS Exel. В нём записи запросов.
На каждый запрос нужен ответ с адресом.
Вот адрес через "," я могу огранизовать простым условием, если есть просто в конце добавить "," но последний элемент будет содержать ","
Вот в чем вся проблема

tipsun » 2014.09.05 18:05

Получилось.

Gemorroj » 2014.09.05 18:24

зачем код стер?)

tipsun » 2014.09.05 23:15

Да я уже по-другому сделал))
Лучше всего у меня получается сливать таблицу MS Exel в мой шаблон указывая тип документа "Письмо"
Этот код мне помогает собрать разбитый адрес в таблице MS Exel с разделителем "," примерно так: |город|улица|дом|квартира| => г. Город, ул. Улица, д. #, кв. #
Слияние помогает избегать рутинной работы, таких строк у меня бывает много, а значит столько же писем должно быть.

Код:

1
span style="color: #0000BB"><?php // MS Word// Добавить поле можно комбинацией: [Ctrl] + [F9]// Поле это { }/* Я решил через переменные сделать. Потом удобней будет искать и редактировать. Ибо в MS Word каждый раз надо добавлять поля комбинацией. Тут однотипный код, написали 1 строку с каждого блока, после копируйте все поле и можно редактировать. Можно и попроще, в 2 последних блока сделать. Можно попробовать оптимизировать, не считая кол-во записей, сразу как-то в блоке 4, но мне и так хватает :)*/// Объявление переменных{SET Счетчик 0}{SET Строка ""}{SET Элемент1 ""}{SET Элемент2 ""}{SET Элемент3 ""}{SET Элемент4 ""}// Подготовка Полей слияния. Приводим в конечный вид.{IF Элемент1 <> "" {SET Элемент1 {MERGEFIELD ПолеСлияния1 \f "добавим что-нибудь в конец строки"}}}{IF Элемент2 <> "" {SET Элемент2 {MERGEFIELD ПолеСлияния2 \b "добавим что-нибудь в начало строки"}}}{IF Элемент3 <> "" {SET Элемент3 {MERGEFIELD ПолеСлияния3}}}{IF Элемент4 <> "" {SET Элемент4 {MERGEFIELD ПолеСлияния4}}}// Другой вариант:{IF Элемент5 <> "" {SET Элемент5 {MERGEFIELD ПолеСлияния5}} {SET Элемент5 ""}}// Подсчет количества записей (т.е. не пустых записей){IF Элемент1 <> "" {SET Счетчик {=Счетчик+1}}}{IF Элемент2 <> "" {SET Счетчик {=Счетчик+1}}}{IF Элемент3 <> "" {SET Счетчик {=Счетчик+1}}}{IF Элемент4 <> "" {SET Счетчик {=Счетчик+1}}}/* Если элемент присутствует, уменьшаем счетчик для операции определения нужна ли запятая или нет.*/// Формирование переменной Строка{IF Элемент1 <> "" {SET Счетчик {=Счетчик-1}}}{IF Элемент1 <> "" {SET Строка {IF 1 <= Счетчик "{Строка}{Элемент1}, " "{Строка}{Элемент1}"}}}{IF Элемент2 <> "" {SET Счетчик {=Счетчик-1}}}{IF Элемент2 <> "" {SET Строка {IF 1 <= Счетчик "{Строка}{Элемент2}, " "{Строка}{Элемент2}"}}}{IF Элемент3 <> "" {SET Счетчик {=Счетчик-1}}}{IF Элемент3 <> "" {SET Строка {IF 1 <= Счетчик "{Строка}{Элемент3}, " "{Строка}{Элемент3}"}}}{IF Элемент4 <> "" {SET Счетчик {=Счетчик-1}}}{IF Элемент4 <> "" {SET Строка {IF 1 <= Счетчик "{Строка}{Элемент4}, " "{Строка}{Элемент4}"}}}// ------- Совсем другой "безПеременный" вариант (!!!НЕ ТЕСТИРОВАЛ!!!):{IF ПолеСлияния5 <> "" {SET Счетчик {=Счетчик+1}}}// ...{IF ПолеСлияния5 <> "" {SET Счетчик {=Счетчик-1}}}{IF ПолеСлияния5 <> "" {SET Строка {IF 1 <= Счетчик "{Строка}{ПолеСлияния5 \b "добавим в начало" \f "добавим в конец"}, " "{Строка}{ПолеСлияния5 \b "добавим в начало" \f "добавим в конец"}"}}}{Строка} // Результат
tipsun » 2014.09.07 02:40

Епт, если результат сразу распечатать, то фигня получается. А вот когда отдельно в документ сохраняешь - норм, и его распечатка тоже норм проходит.