• Почему в Yii2-виджетах нельзя вызывать обычные PHP-функции(включая preg_replace_all)?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    <?php
    namespace app\widgets;
    
    use Yii;
    use yii\base\Widget;
    use yii\web\View;
    use yii\helpers\Json;
    
    use app\models\Event;
    
    class EventProgram extends Widget{
        public $id;
    
        public function init() { parent::init(); }
        public function run(){
    		$queryContent = [];
    		$queryData = Event::findOne(['id' => $this->id]);
    		
    		preg_replace_all('#<div id=\"matherial\"[^>]*>(\X*?)</div>#', $queryData->content, $description);
    		preg_replace_all('#<table[^>]*>(\X*?)</table>#', $queryData->content, $program);
    		
    		$queryContent[]['description'] = $description[1][0];
    		$queryContent[] = ['programData' => []];
    		for($i = 0; $i < count($program[1]); $i++){
    			preg_match_all('#<tr[^>]*>(\X*?)</tr>#', $program[$i][0], $datagrid);
    			
    			for($j = 0; $j < count($datagrid); $j++){
    				$feedList = [];
    				preg_match_all('#<td[^>]*>(\X*?)</td>#', $datagrid[$j][0], $programResponse);
    				
    				for($k = 0; $k < count($datagrid); $k++){
    					
    					preg_match_all('#<td[^>]*>(\X*?)</td>#', $datagrid[$k][0], $queryFragment);
    					
    					if($programResponse[0][0] == $queryFragment[0][0]){
    						$feedList[] = [
    							'period' => $queryFragment[0][0],
    							'title' => $queryFragment[1][0],
    							'content' => $queryFragment[2][0] ? $queryFragment[0][0] : NULL
    						];
    					}
    				}
    				
    				
    				$queryContent['programData'][] = [
    					'program' => [
    						'date' => $programResponse[0][0],
    						'feed' => $feedList
    					]
    				];
    			}
    		}
    		
    		if(!strrpos($queryData->content, 'Organizator web site:')){ $isOrganizator = FALSE; }
    		return $this->render('eventPage/list', ['eventTable' => array_unique($queryContent), 'eventId' => $this->id, 'organizator' => $isOrganizator]);
    	}
    }
    ?>
  • Почему в Yii2-виджетах нельзя вызывать обычные PHP-функции(включая preg_replace_all)?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    vilinyh, в коде метода run() самого виджета, которого я реализовываю
  • Как производить парсинг HTML-кода?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Дмитрий, да. Через var_dump HTML в объекте результатов запроса показывается, а либа с ним не работает почему-то
  • Как производить парсинг HTML-кода?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Дмитрий, курл тут ни причём. Сам HTML берётся из столбца таблицы БД по запросу
  • Как производить парсинг HTML-кода?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Дмитрий, пробовал я через var_dump проверить и компилятор выдал null. С одной стороны вы были правы. И как этот NULL исправить?
  • Как производить парсинг HTML-кода?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Дмитрий, воспользуясь одним фрагментом из документации, я добавил служебные теги html и body, но минизировал полученные из БД HTML-строки в файлах проекта, которые имеют доступ к парсеру, используя специальную библиотеку для этого:
    <?php
    							$contentQuery = (new HtmlWeb)->load('<html><body>' . (new HtmlMin)->minify($events->content) . '</body></html>');
    							$description = (mb_strlen($contentQuery->find('p', 0)->outertext) > 45)? mb_substr($contentQuery->find('p', 0)->outertext, 0, (mb_strlen($contentQuery->find('p', 0)->outertext) > 45)? mb_strripos(mb_substr($contentQuery->find('p', 0)->outertext, 0, 45), ' ') : 45).' ...' : mb_substr($contentQuery->find('p', 0)->outertext, 0, (mb_strlen($contentQuery->find('p', 0)->outertext) > 45)? mb_strripos(mb_substr($contentQuery->find('p', 0)->outertext, 0, 45), ' ') : 45);
    							
    							if($events->location != ''){ echo Html::tag('span', $events->location, ['class' => 'event-location']); }
    							
    							echo Html::a($events->title, ['news/event', 'contentId' => $events->id]);
    							echo Html::tag('p', $description, ['class' => 'descr']);
                            ?>

    Предпологаю, что будет всё норм, но комплиятор заиграл эту же песню, которую описал в самом вопросе.

    Сам фрагмент из документации:
    // Create a DOM object
    $html = new simple_html_dom();
    
    // Load HTML from a string
    $html->load('<html><body>Hello!</body></html>');


    P.S.: Я использую другое название объекта, так как я Simple HTML DOM устанавливал в проект из Composer.
  • Как производить парсинг HTML-кода?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    $this->content - это получаемая из БД HTML-разметка, на которую жалуется компилятор:
    <p>In the first half of the year, Russian audit underwent changes that were unprecedented before, consulting in some sectors experienced rapid growth, in others &mdash; a sharp decline, and evaluation services became an integral part of the massive restructuring of businesses due to circumstances.</p>
    
    <p>We will discuss the following topics with industry experts in a discussion format:</p>
    
    <ul>
    	<li>Changes in the Russian audit market &mdash; results of the first half of the year in new realities;</li>
    	<li>Adaptation of the&quot; big four &quot; auditors in the market after the break with international networks.&nbsp;Work restructuring, business preservation and development;</li>
    	<li>Entry of the norm on the presence of at least three OMR auditors in the staff of an audit organization from July 1, 2022.&nbsp;Implications for the industry;</li>
    	<li>Creating a register of audit firms for working with socially significant organizations.&nbsp;Composition and selection criteria;</li>
    	<li>Reform of the audit industry.&nbsp;Central Bank comments;</li>
    	<li>Consulting in various sectors (tax, IT, legal, financial, real estate consulting).&nbsp;Half-year results and forecasts until the end of the year;</li>
    	<li>Anti-crisis services offered by consultants to clients for the second half of the year&mdash; trends;</li>
    	<li>Growth or contraction of the consulting market;</li>
    	<li>Presentation of the app &quot;Rating of appraisers&quot;;</li>
    	<li>Trends in evaluation services.</li>
    </ul>
    
    <p>31 August, Wednesday&nbsp;</p>
    
    <table border="1" cellpadding="1" cellspacing="1" style="width:100%">
    	<tbody>
    		<tr>
    			<td>09:00 - 09:30</td>
    			<td>
    			<h3>Registration, welcome coffee break</h3>
    			</td>
    		</tr>
    		<tr>
    			<td>09:30 - 10:45</td>
    			<td>
    			<h3>1st block</h3>
    			</td>
    		</tr>
    		<tr>
    			<td>10:45 - 11:15</td>
    			<td>
    			<h3>Lunch</h3>
    			</td>
    		</tr>
    		<tr>
    			<td>11:15 - 12:30</td>
    			<td>
    			<h3>2nd block</h3>
    			</td>
    		</tr>
    		<tr>
    			<td>12:30 - 13:30</td>
    			<td>Networking</td>
    		</tr>
    	</tbody>
    </table>
  • Как производить парсинг HTML-кода?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Проблемный PHP-код динамической разметки для выборки данных:
    <section id="eventcalendar" data-text="Events" class="section">
    			<header>
                    <hr color="#0079bf" size="4" width="37px" align="left"/>
                    <h2>Upcoming Events</h2>
    			</header>
                <main>
    			<?php foreach($lastUpcoming as $events){ ?>
    				<div class="calendar">
                          <header><span class="date"><?php echo $events->date_from || $events->date_to; ?></span></header>
                          <main><img src="<?php echo $events->titleImage; ?>" alt="Event"></main>
                          <footer>
                            <?php
    							$contentQuery = (new HtmlWeb)->load($events->content);
    							$description = (mb_strlen($contentQuery->find('p', 0)->outertext) > 45)? mb_substr($contentQuery->find('p', 0)->outertext, 0, (mb_strlen($contentQuery->find('p', 0)->outertext) > 45)? mb_strripos(mb_substr($contentQuery->find('p', 0)->outertext, 0, 45), ' ') : 45).' ...' : mb_substr($contentQuery->find('p', 0)->outertext, 0, (mb_strlen($contentQuery->find('p', 0)->outertext) > 45)? mb_strripos(mb_substr($contentQuery->find('p', 0)->outertext, 0, 45), ' ') : 45);
    							
    							if($events->location != ''){ echo Html::tag('span', $events->location, ['class' => 'event-location']); }
    							
    							echo Html::a($events->title, ['news/event', 'contentId' => $events->id]);
    							echo Html::tag('p', $description, ['class' => 'descr']);
                            ?>
                          </footer>
                    </div>
                 <?php } ?>
    			</main>
    	</section>
  • Как с помощью MySQL-триггера обновить данные в остальных таблицах после обновления данных в основном?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Akina, ошибки после нескольких тестов и попыток исправления ошибок:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 2
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN 
    	UPDATE userSubscriptions SET login = NEW.login WHERE login = OLD.l' at line 6
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN 
    	UPDATE userSubscriptions SET login = NEW.login WHERE login = OLD.l' at line 6
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN 
    	UPDATE userSubscriptions SET login = NEW.login WHERE login = OLD.l' at line 6
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN;
    	UPDATE userSubscriptions SET login = NEW.login WHERE login = OLD.l' at line 6
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN
    	IF NEW.login <> OLD.login THEN
    		UPDATE userSubscriptions SET login' at line 6
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN
    	IF NEW.login <> OLD.login THEN
    		UPDATE userSubscriptions SET login' at line 6
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
    
    AFTER UPDATE 
    	ON users FOR EACH 
    	
    BEGIN
    	IF NEW.login <> OLD.login TH' at line 1
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN
    	IF NEW.login <> OLD.login THEN
    		UPDATE userSubscriptions SET login' at line 6
  • Почему JQuery-событие keyup блокирует возможность ввода в поле input внутри формы?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Пробовал поменять кусок кода и та же песня...
  • "Uncaught TypeError: this is undefined" в классе и его приватном методе?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Сергей Сергей, после привязки эта же проблема с отсуствием якобы функции
  • "Uncaught TypeError: this is undefined" в классе и его приватном методе?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Сергей Сергей, здесь тоже надо привязывать bind(this), как в примере выше?
  • "Uncaught TypeError: this is undefined" в классе и его приватном методе?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Сергей Сергей, огромное спасибо! И после обращения к приватному методу, когда сам приватный метод обращался к защищённому(this._responseEvent(true, 'SignIn', <Запрос>);) внутри выполняемого класса, DevTools выдал ещё ошибку: Uncaught TypeError: this._responseEvent is not a function.
    Пример структуры защищённого метода в классе:_responseEvent(isLogin, s, q){ ... }
  • Как правильно подключиться к библиотеке Approve JS, используя CDN?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Евгений Винокуров , я менял на последнюю версию, благодаря сервисам CDNJS и код подключения, используемый перед закрывающим тегом body:
    <script src="https://cdnjs.cloudflare.com/ajax/libs/approvejs/3.1.2/approve.min.js" integrity="sha512-TmhOO3rUu5WfsLdsw9H1pB/p5/A/KnhydCuLNGlZoukfUUopMmA2sq6DWR9E+acuLB1DBk2A8cq63f7JMwHgVQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  • Как избавиться от ERR_TOO_MANY_REDIRECTS в Yii2-проекте с SSL на сервере?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    И финальная:
    <Limit GET POST HEAD>
        Order Allow,Deny
        Allow from all
        deny from 38.100.19.8/29
        deny from 38.100.21.0/24
        deny from 38.100.41.64/26
        deny from 38.105.71.0/25
        deny from 38.105.83.0/27
        deny from 38.112.21.140/30
        deny from 38.118.42.32/29
        deny from 65.213.208.128/27
        deny from 65.222.176.96/27
        deny from 65.222.185.72/29
        Deny from env=bad_bot
    </Limit>
    <Limit GET POST>
        order allow,deny
        deny from 83.4.0.0
        deny from 93.4.1.2
        deny from 82.12.33.67
        deny from 78.22.1.1
        allow from all
    </Limit>
  • Как избавиться от ERR_TOO_MANY_REDIRECTS в Yii2-проекте с SSL на сервере?

    seregazolotaryow64
    @seregazolotaryow64 Автор вопроса
    Первая часть примера .htaccess:
    <IfModule mod_deflate.c>
            AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
            BrowserMatch ^Mozilla/4 gzip-only-text/html
            BrowserMatch ^Mozilla/4.0678 no-gzip
            BrowserMatch bMSIE gzip-only-text/html
            <ifmodule mod_gzip.c>
    			mod_gzip_on Yes
    			mod_gzip_item_include file \.js$
    			mod_gzip_item_include file \.css$
            </IfModule>
    </IfModule>
    # Перенаправление на gzip файлы
    AddEncoding gzip .gz
    <FilesMatch "\.js.gz$">
        ForceType text/javascript
        Header set Content-Encoding: gzip
    </FilesMatch>
    
    <FilesMatch "\.js$">
        RewriteCond %{HTTP_USER_AGENT} !".*Safari.*"
        RewriteCond %{HTTP:Accept-Encoding} gzip
        RewriteCond %{REQUEST_FILENAME}.gz -f
        RewriteRule (.*)\.js$ $1\.js.gz [L]
        ForceType text/javascript
    </FilesMatch>
    
    <FilesMatch "\.css.gz$">
        ForceType text/css
        Header set Content-Encoding: gzip
    </FilesMatch>
    
    <FilesMatch "\.css$">
        RewriteCond %{HTTP_USER_AGENT} !".*Safari.*"
        RewriteCond %{HTTP:Accept-Encoding} gzip
        RewriteCond %{REQUEST_FILENAME}.gz -f
        RewriteRule (.*)\.css$ $1\.css.gz [L]
        ForceType text/css
    </FilesMatch>
    # Перенаправление на gzip файлы
    
    # Включаем кэш в браузерах посетителей
    <ifModule mod_headers.c>
        # Отключаем кеширование php и других служебных файлов
        <FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
            Header unset Cache-Control
        </FilesMatch>
    </IfModule>
    # Включаем кэш в браузерах посетителей
    
    <ifModule mod_headers.c>
    	Header always set Access-Control-Allow-Origin "*"
    	Header always set Access-Control-Allow-Headers "*"
    	Header always set Access-Control-Allow-Methods "*"
    	Header always set Access-Control-Expose-Headers "*"
    	Header always set Access-Control-Max-Age "1200"
    </ifModule>
    
    # кеширование в браузере на стороне пользователя
    <IfModule mod_expires.c>
        ExpiresActive On
        ExpiresDefault "access 7 days"
        ExpiresByType application/javascript "access plus 1 year"
        ExpiresByType text/javascript "access plus 1 year"
        ExpiresByType text/css "access plus 1 year"
        ExpiresByType text/html "access plus 7 day"
        ExpiresByType text/x-javascript "access 1 year"
        ExpiresByType image/gif "access plus 1 year"
        ExpiresByType image/jpeg "access plus 1 year"
        ExpiresByType image/png "access plus 1 year"
        ExpiresByType image/jpg "access plus 1 year"
        ExpiresByType image/x-icon "access 1 year"
        ExpiresByType application/x-shockwave-flash "access 1 year"
    </IfModule>
    
    # Cache-Control
    <ifModule mod_headers.c>
        # 30 дней
        <filesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
            Header set Cache-Control "max-age=2592000, public"
        </filesMatch>
        # 30 дней
        <filesMatch "\.(css|js)$">
            Header set Cache-Control "max-age=2592000, public"
        </filesMatch>
        # 2 дня
        <filesMatch "\.(xml|txt)$">
            Header set Cache-Control "max-age=172800, public, must-revalidate"
        </filesMatch>
        # 1 день
        <filesMatch "\.(html|htm|php)$">
            Header set Cache-Control "max-age=172800, private, must-revalidate"
        </filesMatch>
    </ifModule>
    
    #Запрет отдачи HTTP-заголовков Vary браузерам семейства MSIE
    <IfModule mod_setenvif.c>
        BrowserMatch "MSIE" force-no-vary
        BrowserMatch "Mozilla/4.[0-9]{2}" force-no-vary
    </IfModule>
    # кеширование в браузере на стороне пользователя
    
    # Усиливаем кеширование
    FileETag MTime Size
    <ifmodule mod_expires.c>
        <filesmatch ".(jpg|jpeg|gif|png|ico|css|js)$">
            ExpiresActive on
            ExpiresDefault "access plus 1 year"
        </filesmatch>
    </ifmodule>
    # Усиливаем кеширование
    
    <ifModule mod_headers.c>
        Header set X-XSS-Protection "1;mode=block"
        Header set Content-Language "en-US"
        Header set X-Frame-Options "DENY"
    </IfModule>
    
    <ifModule mod_headers.c>
        Header set X-UA-Compatible "IE=5"
        Header set X-UA-Compatible "IE=7"
        Header set X-UA-Compatible "IE=EmulateIE7"
        Header set X-UA-Compatible "IE=8"
        Header set X-UA-Compatible "IE=EmulateIE8"
        Header set X-UA-Compatible "IE=9"
        Header set X-UA-Compatible "IE=EmulateIE9"
        Header set X-UA-Compatible "IE=10"
        Header set X-UA-Compatible "IE=EmulateIE10"
        Header set X-UA-Compatible "IE=11"
        Header set X-UA-Compatible "IE=EmulateIE11"
        Header set X-UA-Compatible "IE=edge"
        Header set X-UA-Compatible "IE=edge,chrome=1"
        Header set imagetoolbar "no"
    </IfModule>
     
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php [L]
    #RewriteRule ^(.*)\?*$ index.php/$1 [L,QSA]
    RewriteCond %{ENV:HTTPS} !on 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    AddEncoding gzip .gz
    RewriteCond %{HTTP:Accept-encoding} gzip
    RewriteCond %{REQUEST_FILENAME}.gz -f
    RewriteRule ^(.*)$ $1.gz [QSA,L]