<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Php乎</title><link>https://blog.addondev.cn/</link><description>一个开发者的博客</description><item><title>zblog如何正确开发跨域的功能</title><link>https://blog.addondev.cn/?id=4</link><description>&lt;p&gt;开发zblog插件的时候，我们可能会需要解决跨域的问题。&lt;/p&gt;&lt;p&gt;核心代码是标准的，也没有难度&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-php&quot;&gt;if&amp;nbsp;(isset($_SERVER[&amp;#39;HTTP_ORIGIN&amp;#39;])&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;$_SERVER[&amp;#39;HTTP_ORIGIN&amp;#39;])&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header(&amp;#39;Access-Control-Allow-Origin:&amp;nbsp;*&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header(&amp;#39;Access-Control-Allow-Credentials:&amp;nbsp;true&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header(&amp;#39;Access-Control-Max-Age:&amp;nbsp;86400&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($_SERVER[&amp;#39;REQUEST_METHOD&amp;#39;]&amp;nbsp;==&amp;nbsp;&amp;#39;OPTIONS&amp;#39;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(isset($_SERVER[&amp;#39;HTTP_ACCESS_CONTROL_REQUEST_METHOD&amp;#39;]))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header(&amp;quot;Access-Control-Allow-Methods:&amp;nbsp;GET,&amp;nbsp;POST,&amp;nbsp;PUT,&amp;nbsp;DELETE,&amp;nbsp;OPTIONS&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(isset($_SERVER[&amp;#39;HTTP_ACCESS_CONTROL_REQUEST_HEADERS&amp;#39;]))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header(&amp;quot;Access-Control-Allow-Headers:&amp;nbsp;{$_SERVER[&amp;#39;HTTP_ACCESS_CONTROL_REQUEST_HEADERS&amp;#39;]}&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;zblog提供了很多钩子&lt;/p&gt;&lt;p&gt;那代码要放到哪个钩子呢？&lt;/p&gt;&lt;p&gt;我开始的时候是放到：Filter_Plugin_API_Begin ，即在插件执行之前。在1.7.3版本之前都很正常。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;思路陷阱：因为插件执行就最开始的地方。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;最近升级到最新的1.7.3之后，发现登录之后就不行了。爆如下错误：&lt;/p&gt;&lt;p&gt;not allowed access control origin ,status 500&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;开始以为是服务器配置出了问题。对比，排除，分析，一头雾水。&lt;/p&gt;&lt;p&gt;最后，才发现，只要是需要验证登录状态的请求都本拦截，提示这个错误。&lt;/p&gt;&lt;p&gt;所以，估计是提前验证登录了，还没返回支持跨域的option请求的结果。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;兄弟，你首先要了解跨域的请求原理，不然也一头雾水。浏览器在拦截跨域的时候，是先发一个option方法前请，返回服务端跨域的配置结果。告诉浏览器是否支持跨域。如果支持，浏览器才发对于的post/get方法的请求。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;如果我使用Filter_Plugin_API_Begin的钩子，这个时候有点滞后了。因为登录验证是在这个钩子之前。之前是正常的，现在不正常估计是代码做了调整。&lt;/p&gt;&lt;p&gt;那就必须在登录验证之前的钩子把跨域的配置代码先执行。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;源码分析，找到了原因。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;首先是api文件的入口文件执行顺序：看源码&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-php&quot;&gt;//&amp;nbsp;标记为&amp;nbsp;API&amp;nbsp;运行模式
define(&amp;#39;ZBP_IN_API&amp;#39;,&amp;nbsp;true);

require&amp;nbsp;&amp;#39;function/c_system_base.php&amp;#39;;

$zbp-&amp;gt;Load();

ApiCheckEnable();

HookFilterPlugin(&amp;#39;Filter_Plugin_API_Begin&amp;#39;);&amp;nbsp;//这个地方是我最开始挂的钩子的地方&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;再看 c_system_base.php ,看是否有登录验证和钩子，发现没有登录验证，因为必须在登录验证。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-php&quot;&gt;$GLOBALS[&amp;#39;zbp&amp;#39;]&amp;nbsp;=&amp;nbsp;ZBlogPHP::GetInstance();
$GLOBALS[&amp;#39;zbp&amp;#39;]-&amp;gt;Initialize();

/*
&amp;nbsp;*&amp;nbsp;加载主题和插件APP
&amp;nbsp;*/
if&amp;nbsp;(ZBP_SAFEMODE&amp;nbsp;===&amp;nbsp;false)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$theme_preset&amp;nbsp;=&amp;nbsp;GetVarsFromEnv(&amp;#39;ZBP_PRESET_THEME&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($theme_preset&amp;nbsp;!=&amp;nbsp;&amp;#39;&amp;#39;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$GLOBALS[&amp;#39;blogtheme&amp;#39;]&amp;nbsp;=&amp;nbsp;$theme_preset;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$style_preset&amp;nbsp;=&amp;nbsp;GetVarsFromEnv(&amp;#39;ZBP_PRESET_THEME_STYLE&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($style_preset&amp;nbsp;!=&amp;nbsp;&amp;#39;&amp;#39;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$GLOBALS[&amp;#39;blogstyle&amp;#39;]&amp;nbsp;=&amp;nbsp;$style_preset;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$theme_name&amp;nbsp;=&amp;nbsp;$GLOBALS[&amp;#39;blogtheme&amp;#39;];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$file_base&amp;nbsp;=&amp;nbsp;$GLOBALS[&amp;#39;usersdir&amp;#39;]&amp;nbsp;.&amp;nbsp;&amp;#39;theme/&amp;#39;&amp;nbsp;.&amp;nbsp;$GLOBALS[&amp;#39;blogtheme&amp;#39;]&amp;nbsp;.&amp;nbsp;&amp;#39;/theme.xml&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$theme_include&amp;nbsp;=&amp;nbsp;$GLOBALS[&amp;#39;usersdir&amp;#39;]&amp;nbsp;.&amp;nbsp;&amp;#39;theme/&amp;#39;&amp;nbsp;.&amp;nbsp;$GLOBALS[&amp;#39;blogtheme&amp;#39;]&amp;nbsp;.&amp;nbsp;&amp;#39;/include.php&amp;#39;;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(is_readable($file_base))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$GLOBALS[&amp;#39;activedapps&amp;#39;][]&amp;nbsp;=&amp;nbsp;$theme_name;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;读主题版本信息
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$GLOBALS[&amp;#39;zbp&amp;#39;]-&amp;gt;themeapp&amp;nbsp;=&amp;nbsp;$GLOBALS[&amp;#39;zbp&amp;#39;]-&amp;gt;LoadApp(&amp;#39;theme&amp;#39;,&amp;nbsp;$theme_name);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$GLOBALS[&amp;#39;zbp&amp;#39;]-&amp;gt;themeinfo&amp;nbsp;=&amp;nbsp;$GLOBALS[&amp;#39;zbp&amp;#39;]-&amp;gt;themeapp-&amp;gt;GetInfoArray();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($GLOBALS[&amp;#39;zbp&amp;#39;]-&amp;gt;themeapp-&amp;gt;isloaded&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;is_readable($theme_include))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;include&amp;nbsp;$theme_include;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$aps&amp;nbsp;=&amp;nbsp;GetVarsFromEnv(&amp;#39;ZBP_PRESET_PLUGINS&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$aps2&amp;nbsp;=&amp;nbsp;$GLOBALS[&amp;#39;zbp&amp;#39;]-&amp;gt;GetPreActivePlugin();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($aps&amp;nbsp;!=&amp;nbsp;&amp;#39;&amp;#39;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$aps&amp;nbsp;=&amp;nbsp;explode(&amp;#39;|&amp;#39;,&amp;nbsp;$aps);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;($aps2&amp;nbsp;as&amp;nbsp;$ap)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$aps[]&amp;nbsp;=&amp;nbsp;$ap;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$aps&amp;nbsp;=&amp;nbsp;array_unique($aps);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$aps&amp;nbsp;=&amp;nbsp;&amp;amp;$aps2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;($aps&amp;nbsp;as&amp;nbsp;$ap)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(is_readable($file_base&amp;nbsp;=&amp;nbsp;$GLOBALS[&amp;#39;usersdir&amp;#39;]&amp;nbsp;.&amp;nbsp;&amp;#39;plugin/&amp;#39;&amp;nbsp;.&amp;nbsp;$ap&amp;nbsp;.&amp;nbsp;&amp;#39;/plugin.xml&amp;#39;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$GLOBALS[&amp;#39;activedapps&amp;#39;][]&amp;nbsp;=&amp;nbsp;$ap;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(is_readable($file_base&amp;nbsp;=&amp;nbsp;$GLOBALS[&amp;#39;usersdir&amp;#39;]&amp;nbsp;.&amp;nbsp;&amp;#39;plugin/&amp;#39;&amp;nbsp;.&amp;nbsp;$ap&amp;nbsp;.&amp;nbsp;&amp;#39;/include.php&amp;#39;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;include&amp;nbsp;$file_base;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;($GLOBALS[&amp;#39;plugins&amp;#39;]&amp;nbsp;as&amp;nbsp;&amp;amp;$fn)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(function_exists($fn))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$fn();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

unset($file_base,&amp;nbsp;$aps,&amp;nbsp;$aps2,&amp;nbsp;$fn,&amp;nbsp;$ap,&amp;nbsp;$opk,&amp;nbsp;$opv);
unset($theme_name,&amp;nbsp;$theme_include,&amp;nbsp;$theme_preset,&amp;nbsp;$style_preset);

//1.7新加入的
$GLOBALS[&amp;#39;zbp&amp;#39;]-&amp;gt;PreLoad();&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;继续看ZBlogPHP类的初始化方法Load（）&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-php&quot;&gt;&amp;nbsp;public&amp;nbsp;function&amp;nbsp;Load()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!$this-&amp;gt;isinitialized&amp;nbsp;||&amp;nbsp;!$this-&amp;gt;ispreload&amp;nbsp;||&amp;nbsp;$this-&amp;gt;isload)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//找到了可以挂的钩子
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach&amp;nbsp;($GLOBALS[&amp;#39;hooks&amp;#39;][&amp;#39;Filter_Plugin_Zbp_Load_Pre&amp;#39;]&amp;nbsp;as&amp;nbsp;$fpname&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;amp;$fpsignal)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$fpreturn&amp;nbsp;=&amp;nbsp;$fpname();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!headers_sent())&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header(&amp;#39;Content-type:&amp;nbsp;text/html;&amp;nbsp;charset=utf-8&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($this-&amp;gt;option[&amp;#39;ZC_LOADMEMBERS_LEVEL&amp;#39;]&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$this-&amp;gt;option[&amp;#39;ZC_LOADMEMBERS_LEVEL&amp;#39;]&amp;nbsp;=&amp;nbsp;ZC_MEMBER_LEVER_ADMINISTRATOR;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$this-&amp;gt;isloadmembers&amp;nbsp;||&amp;nbsp;$this-&amp;gt;LoadMembers($this-&amp;gt;option[&amp;#39;ZC_LOADMEMBERS_LEVEL&amp;#39;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$this-&amp;gt;isloadcategories&amp;nbsp;||&amp;nbsp;$this-&amp;gt;LoadCategories();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//$this-&amp;gt;isloadtags&amp;nbsp;||&amp;nbsp;$this-&amp;gt;LoadTags();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$this-&amp;gt;isloadmodules&amp;nbsp;||&amp;nbsp;$this-&amp;gt;LoadModules();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$this-&amp;gt;RegBuildModules();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//登录验证
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;($this-&amp;gt;CheckIsLoggedin()&amp;nbsp;==&amp;nbsp;false)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$this-&amp;gt;Verify();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;......
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;所以 应该用这个钩子：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-php&quot;&gt;Filter_Plugin_Zbp_Load_Pre&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 21 Jul 2023 11:53:01 +0800</pubDate></item><item><title>javascript最搞不懂的boolean判定，你必须学会</title><link>https://blog.addondev.cn/?id=3</link><description>&lt;p&gt;Boolean 对象是一个布尔值的对象包装器。&lt;/p&gt;&lt;p&gt;描述&lt;/p&gt;&lt;p&gt;如果需要，作为第一个参数传递的值将转换为布尔值。如果省略该参数或参数值为 0、-0、null、false、NaN、undefined，或空字符串（&amp;quot;&amp;quot;），则该对象具有的初始值为 false。所有其他值，包括任何对象，空数组（[]）或字符串 &amp;quot;false&amp;quot;，都会创建一个初始值为 true 的对象。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;注意不要将基本类型中的布尔值 true 和 false 与值为 true 和 false 的 Boolean 对象弄混了。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;其值不是 undefined 或 null 的任何对象（包括其值为 false 的布尔对象）在传递给条件语句时都将计算为 true。例如，以下 if 语句中的条件评估为 true：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;const x = new Boolean(false);&lt;/p&gt;&lt;p&gt;if (x) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; // 这里的代码会被执行&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;基本类型的布尔值不受此规则影响。例如下面的 if 语句的条件为假：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;const x = false;&lt;/p&gt;&lt;p&gt;if (x) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; // 这里的代码不会执行&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;不要用创建 Boolean 对象的方式将一个非布尔值转化成布尔值，直接将 Boolean 当做转换函数来使用即可，或者使用双重非（!!）运算符：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;const x = Boolean(expression); &amp;nbsp; &amp;nbsp; // use this...&lt;/p&gt;&lt;p&gt;const x = !!(expression);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ...or this&lt;/p&gt;&lt;p&gt;const x = new Boolean(expression); // don&amp;#39;t use this!&lt;/p&gt;&lt;p&gt;对于任何对象，即使是值为 false 的 Boolean 对象，当将其传给 Boolean 函数时，生成的 Boolean 对象的值都是 true。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;const myFalse = new Boolean(false); &amp;nbsp; // initial value of false&lt;/p&gt;&lt;p&gt;const g = Boolean(myFalse); &amp;nbsp; &amp;nbsp; &amp;nbsp; // initial value of true&lt;/p&gt;&lt;p&gt;const myString = new String(&amp;#39;Hello&amp;#39;); // string object&lt;/p&gt;&lt;p&gt;const s = Boolean(myString);&amp;nbsp; &amp;nbsp; &amp;nbsp; // initial value of true&lt;/p&gt;&lt;p&gt;最后，不要在应该使用基本类型布尔值的地方使用 Boolean 对象。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;备注： 当将非标准属性 document.all 用作此构造函数的参数时，结果是值为 false 的布尔对象。此属性是旧的、非标准的属性，不应使用。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;当使用非严格相等（==）来比较一个对象和布尔原始值时，最重要的是需要弄明白最终比较的是什么。请看一下的示例：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;if ([]) { console.log(&amp;quot;[] is truthy&amp;quot;)} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // logs &amp;quot;[] is truthy&amp;quot;&lt;/p&gt;&lt;p&gt;if ([] == false) { console.log(&amp;quot;[] == false&amp;quot;)} // logs &amp;quot;[] == false&amp;quot;&lt;/p&gt;&lt;p&gt;[] 是真值而 [] == false 也同时成立的原因是：非严格比较 [] == false 会将 [] 的原始值和 false 进行比较。而获取 [] 的原始值时，JavaScript 引擎会首先调用 [].toString()。其结果为 &amp;quot;&amp;quot;，也是最终和 false 一起比较的值。换句话说，[] == false 等价于 &amp;quot;&amp;quot; == false，而 &amp;quot;&amp;quot; 是假值——这也解释了为什么会得到这一结果。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 16 Jul 2023 22:25:31 +0800</pubDate></item><item><title>H5可视化编辑器如何适配不同设备的屏幕？</title><link>https://blog.addondev.cn/?id=1</link><description>&lt;p&gt;最近做了一会展包名签到的程序。但是有个问题，就是总有设备不能很好的适配。比例失调就影响美观，也影响了会展活动给人的印象。&lt;/p&gt;&lt;p&gt;毕竟是一个后台开发程序员，前端的技能还是有限，思路也是有点固化，想着通过css来解决设备的适配度问题。&lt;/p&gt;&lt;p&gt;这个方式也是也可以。一般用vw或者rem的中间尺寸单元。如果是纯编码的方式可以的。&lt;/p&gt;&lt;p&gt;问题是我们的项目使用的可视化编辑器，设置尺寸的时候用vw和rem肯定不方便。&lt;/p&gt;&lt;p&gt;今天研究了一个国内做的很好的h5设计网站的作品，无意间发现是用通viewport来适配的。醍醐灌顶，真是一好办法。这样在h5设计器端就可以px来设置相关的参数，统一了设计和展示在参数是统一的。&lt;/p&gt;&lt;p&gt;核心步骤&lt;/p&gt;&lt;p&gt;1、设置viewport 固定宽度=320&lt;/p&gt;&lt;p&gt;2、动态计算缩放比例 initial-scale=动态计算 = 设备窗口宽带/320&lt;/p&gt;&lt;p&gt;关键示例代码&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;function&amp;nbsp;setScale()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;var&amp;nbsp;pageScale&amp;nbsp;=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;//&amp;nbsp;这里不能用body.clientWidth&amp;nbsp;等&amp;nbsp;因为ios&amp;nbsp;上可能刷新后这个值还没设置回去
&amp;nbsp;&amp;nbsp;const&amp;nbsp;screenWidth&amp;nbsp;=&amp;nbsp;window.screen.width;
&amp;nbsp;&amp;nbsp;var&amp;nbsp;height&amp;nbsp;=&amp;nbsp;document.documentElement.clientHeight&amp;nbsp;||&amp;nbsp;486;
&amp;nbsp;&amp;nbsp;if&amp;nbsp;(screenWidth&amp;nbsp;/&amp;nbsp;height&amp;nbsp;&amp;gt;=&amp;nbsp;320&amp;nbsp;/&amp;nbsp;486)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pageScale&amp;nbsp;=&amp;nbsp;height&amp;nbsp;/&amp;nbsp;486;
&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pageScale&amp;nbsp;=&amp;nbsp;screenWidth&amp;nbsp;/&amp;nbsp;320;
&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;//&amp;nbsp;meta
&amp;nbsp;&amp;nbsp;var&amp;nbsp;content&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;width=320,&amp;nbsp;initial-scale=&amp;#39;&amp;nbsp;+
&amp;nbsp;&amp;nbsp;&amp;nbsp;pageScale&amp;nbsp;+
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;,&amp;nbsp;maximum-scale=&amp;#39;&amp;nbsp;+
&amp;nbsp;&amp;nbsp;&amp;nbsp;pageScale&amp;nbsp;+
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;,&amp;nbsp;user-scalable=no&amp;#39;&amp;nbsp;+
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;,viewport-fit=cover&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;document.getElementById(&amp;#39;viewport&amp;#39;).setAttribute(&amp;#39;content&amp;#39;,&amp;nbsp;content);
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 06 May 2021 14:16:59 +0800</pubDate></item></channel></rss>