Задать вопрос
  • Как пропустить js переменную через php функцию?

    TekVanDo
    @TekVanDo
    Javascript Developer
    Ну собственно можно пропустить через ajax но это извращение...
    Ответ написан
    Комментировать
  • Несколько вопросов по работе с библиотекой EventSource?

    avalak
    @avalak
    0. Библиотека о которой вы каждый раз упоминаете - polyfill. Она нужна для реализации SSE в старых и кривых браузерах. Нет смысла писать о ней каждый раз (особенно учитывая что вы пытаетесь сделать сервер).

    1. Это демо из библиотеки. Просто чтобы посмотреть что библиотека работает.

    Подскажите пожалуйста зачем тут использовать цикл ?

    Я даже не знаю что на это ответить. Цикл нужен чтобы циклически выполнять действия. Ваш КО.

    Что происходит в цикле:
    - если прошло больше 10 секунд завершаем работу
    - пишем данные
    - сбрасываем буфер
    - спим 4 секунды

    Если же убрать данный цикл, то после каждой отдачи данных будет реконект

    А чего вы ждали? Скрипт выполнил свою работу и умер.

    Даже если оставить
    ob_flush();
    flush();

    Это для принудительной отправки данных пользователю.

    То реконект будет примерно через секунд 30.

    Время жизни php ограниченно. Он создан чтобы умирать. Умирать через 30 секунд (вероятно именно 30 секунд указанно в настройках).

    И вопрос номер 3. Как лучше всего сделать обновление в реал тайме с помощью данной библиотеки, сколько секунд будет оптимально держать соединение, какая должна быть чистота обновления (тоесть раз в сколько секунд посылать запрос), как часто нужно делать реконект ?


    Ещё раз. Это библиотека для браузера. В случае с SSE соединение не должно разрываться. В вашем случае оно разрывается из-за использования php.
    Чтобы не разрывалось (оптимальное применение) нужно использовать node, tornado или что-то подобное
    Ответ написан
    2 комментария
  • Как разместить одну страницу сайта на другом сервере?

    @rozhik
    Да, для этого есть несколько способов.
    1. редирект (При первом способе в браузере будет видна урл второго сервера, наверное не то, что Вам нужно)
    2. проксирование (первый сервер обратится к второму, и отдаст контент клиенту)
    В зависимости от вэб сервера реализации различные. Я вижу в теге nginx, по этому для него
    server { ...
        location test.html {
             proxy_pass http://backend;
      }
    }
    upstream backend {
       server http://10.0.0.2
    }
    Ответ написан
    1 комментарий
  • Как организовать общение php и node.js по сокету?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    А какие были основания в php использовать udp? логичнее же использовать tcp.
    Ответ написан
    2 комментария
  • Как организовать общение php и node.js по сокету?

    @buzzi888
    Нужно на ноде открывать UDP сокет, вместо socket.io

    UDP nodejs

    var dgram = require("dgram");
    
    var server = dgram.createSocket("udp4");
    
    server.on("error", function (err) {
      console.log("server error:\n" + err.stack);
      server.close();
    });
    
    server.on("message", function (msg, rinfo) {
      console.log("server got: " + msg + " from " +
        rinfo.address + ":" + rinfo.port);
    });
    
    server.on("listening", function () {
      var address = server.address();
      console.log("server listening " +
          address.address + ":" + address.port);
    });
    
    server.bind(8080);
    // server listening 0.0.0.0:8080
    Ответ написан
    Комментировать
  • Как организовать общение php и node.js по сокету?

    Lerg
    @Lerg
    Defold, Corona, Lua, GameDev
    Я не спец по ноде, но скорее всего у вас слушается TCP порт, а отправляется на UDP порт.
    Ответ написан
    Комментировать
  • Как реализовать сообщение об ошибке после редиректа?

    silentvick
    @silentvick
    Это называется flash messages. Сообщение записывается в специальную переменную в сессии. При рендере страницы проверяется наличие такого сообщения. Если есть - оно выводится и сразу удаляется из сессии, чтобы исключить повторный вывод.
    Yii. How to work with flash messages
    Ответ написан
    1 комментарий
  • Как передать данные в js файл?

    vinograd19
    @vinograd19
    Хранить данные в html верстке (hidden input value, data-аттрибуты, meta-теги, т.д.) - просто, но вам это точно надоест, когда данных станет много. Потому как html не придумывался для хранения структурированных данных.

    Если у вас html создаётся каким-то шаблонизатором, можете попытаться создавать там js объект. в PHP есть функция json_encode , в python есть json.dumps, в ruby есть метод .to_json.

    Если вам далее этот js объект нужно будет превращать в html, можете воспользоваться js-шаблонизаторами, например hadlebars, hogan или underscore.

    Если вы в js передаёте модели из серверных MV* фреймворков, то лучшей организацией данных будет задействовать в js MV*-фреймворки, например backbone, angular, ember, т.д.
    Ответ написан
    Комментировать
  • Как передать данные в js файл?

    conf
    @conf
    Ruby developer
    Еще можно использовать data-атрибуты, например:
    <ul class="products">
    <li data-product-id="55">Toster</li>
    </ul>


    Из js к ним можно получить доступ с помощью функции .data:
    $('.products li').on('click', function() { 
          console.log($(this).data('product-id'));  // 55
    });
    Ответ написан
    Комментировать
  • Как передать данные в js файл?

    Я бы посмотрел на это не со стороны php, а с javascript. Пусть Ваш javascript "спрашивает" (тем же ajax'ом) у веб-сервера данные, который в свою очередь, через php-скрипт вернет ему нужные данные. Лично я юзаю ajax от jQuery, все просто, и я доволен как слон :)
    Ответ написан
    Комментировать
  • Как передать данные в js файл?

    dizballanze
    @dizballanze
    Software developer at Yandex
    Лучше всего для этой цели подойдут кастомные meta-теги страницы. Добавляете в них нужное значение во время рендеринга и считываете затем в своем javascript коде.

    Что-то вроде:
    <meta name="my_id" content="123123123" />
    Ответ написан
    4 комментария
  • Как передать данные в js файл?

    Никак, потому что статику принято отдавать не через php, а напрямую nginx'ом. Если гнать все js через php вы себе сервер просадите.

    Варианты:
    1) выводите в теле
    <script type="text/javascript">
    var id = <?=$id?>
    operation(id);
    </script>
    В этом ничего страшного нет.

    2) сделайте отдельный config.php.js который будет отдавать Json объект который будет содержать необходимое состояние\настоойки.
    Ответ написан
    2 комментария
  • Как передать данные в js файл?

    Если в lib у вас лежат библиотеки, то там код не должен быть привязан к конкретным данным, т.е. там либо список функций, либо классы.
    А вот в каком месте вы их вызываете?
    Ну и как вариант всегда в html передать эти данные

    <input type="hidden" id="xxx" value="2" />
    Ответ написан
    Комментировать
  • SSE php и javascript

    avalak
    @avalak
    1. Пустая строка это часть протокола.
    2. error возникает и при закрытии соединения.
    Ответ написан
    1 комментарий
  • Как красиво оформить проверку прав в Yii?

    @hector
    php программист
    Тут скорее всего надо сделать так (в моем случае роли реализованы через консольную команду):
    1) работаем с CPhpAuthManager и добавляем операции
    $auth = Yii::app()->authManager;
       /* @var $auth CPhpAuthManager */
       $auth->clearAll();
    $auth->createOperation('news_view', 'просмотр');
       $auth->createOperation('news_add', 'добавление');
       $auth->createOperation('news_edit', 'редактирование');
      $auth->createOperation('news_delete', 'удаление');

    2) работаем с задачами
    $task = $auth->createTask('news_admin_task', 'Для администратора сайта разрешаем выполнять все действия сайта');
            $task->addChild('news_edit');
            $task->addChild('news_delete');
    
     $bisRule = 'return Yii::app()->user->id==$params["news"]->user_id;';
     $task = $auth->createTask('news_owner_task', 'Тут применяем бизнес-логику и разрешаем работать с отдельной новостью автору данной новости', $bisRule);
            $task->addChild('news_edit');
            $task->addChild('news_delete');

    3) Работаем с пользователями сайта
    $bizRule = 'return Yii::app()->user->isGuest;';
            $role = $auth->createRole(Users::GUEST, 'гость может только смотреть новости', $bizRule);
            $role->addChild('news_view');
    
            $role = $auth->createRole(Users::AUTOR, 'автор наследуют все что может гость(просмотр новости) + задачу news_owner_task');
            $role->addChild(Users::GUEST);
            $role->addChild('news_owner_task');
            $task->addChild('news_add');
    
    $role = $auth->createRole(Users::ADMIN, 'админ может все!');
            $role->addChild(Users::GUEST);
            $role->addChild('news_admin_task');
            $task->addChild('news_add');


    4) Все сохраняем в файл data/auth.php
    $auth->save();

    5) Теперь работаем в нужном контролере на примере контролера редактирования
    class NewsController extends Controller
    {
    public function actionEditNews($id)
    {
     $model = News::model()->findByPk($id); //грузим модель нужную
      if(!Yii::app()->user->checkAccess('news_edit', array('news'=>$model))) //проверяем только операцию, в данном случае не вызовет исключение для пользователей админа и автора именно этого поста, для остальных выдаст 403 ошибку
            {
                throw new CHttpException(403);
            }
    }
    }
    Ответ написан
    1 комментарий
  • Необъявленные переменные по умолчанию в php?

    Объявите все необходимые поля и объедините массивы POST и ваших объявленных полей:

    $neededFields = array(
        'user_id' => null,
        'news_id' => null 
    );
    
    $_POST = array_merge($neededFields, $_POST);


    В итоге значения тех полей, которые не пришли в запросе будут равны значениям из $neededFields.
    Ответ написан
    2 комментария
  • Как валидировать данные в Yii?

    TekVanDo
    @TekVanDo
    Javascript Developer
    Сделайте проверку на $this->isNewRecord примерно так

    public function rules(){
    	$rules  = array( 
    		array('login', 'match', 'allowEmpty'=>false, 'pattern'=>'/^([A-Za-z0-9-_$]){3,16}$/', 'message'=>$this->getErrorMessage('is_login'), 'on'=>'control'),
    		array('name', 'match', 'allowEmpty'=>false, 'pattern'=>'/[a-zA-Zа-яА-ЯёЁ]+\s{1}+[a-zA-Zа-яА-ЯёЁ]+$/u', 'message'=>$this->getErrorMessage('name'), 'on'=>'control'),
    		array('password,special_password', 'match', 'allowEmpty'=>false, 'pattern'=>'/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z-_!@,#$%]{6,16}$/', 'message'=>$this->getErrorMessage('is_password'), 'on'=>'control'),
    		array('special_password', 'coincidePassword', 'message'=>$this->getErrorMessage('coincide_password'), 'on'=>'control'),
    	);
    	if($this->isNewRecord){
    		$rules_for_new = array(
    			array('login', 'unique', 'className' => 'UsersModel', 'attributeName' => 'login', 'message'=>$this->getErrorMessage('login'), 'on'=>'control'),
    			array('mail', 'is_mail', 'on'=>'control'),
    		);
    		$rules = array_merge($rules,$rules_for_new);
    	}
    	return $rules;
    }
    Ответ написан
    Комментировать
  • Как дать доступ определенным пользователям в определенную папку?

    @inkvizitor68sl
    Linux-сисадмин с 8 летним стажем.
    У вас в ftp сервере включен chroot.
    Выключать chroot я не советую.
    Вместо симлинков используйте mount --bind просто.
    Ответ написан
    1 комментарий
  • Как дать доступ определенным пользователям в определенную папку?

    @onvova
    На правах гадалки, я ведь не знаю, что в качестве ftp сервера используется..

    по-умолчанию в centos используется vsftpd, в котором опять-таки по-умолчанию, извините за тавтологию, запрещено пользователям выходить за пределы домашнего каталога (/etc/vsftpd/vsftpd.conf - chroot_local_user=yes). Хотите подробнее - погуглите "vsftpd symlink".
    Варианты - или chroot_local_user=no , что не кошерно, пользователь получает доступ ко всему, или mount --bind вместо симлинков
    Ответ написан
    Комментировать
  • Как можно передать пост данные и прочитать их?

    Scorpi
    @Scorpi
    var http = require('http'),
    	formidable = require('formidable'),
    	util = require('util');
    
    http.createServer(function (req, res) {
    	if (req.method == 'POST') {
    		var form = new formidable.IncomingForm();
    		form.parse(req, function(err, fields, files) {
    			console.log(fields.message);
        	});
    	}
      	res.end();
    }).listen(8888);
    
    console.log('START');
    Ответ написан
    1 комментарий